From a71bebc7912031faa44c53d61d2570ccf12dbe0d Mon Sep 17 00:00:00 2001 From: Vietbao Tran Date: Mon, 2 Sep 2024 20:11:04 -0700 Subject: [PATCH] feat(web): filter shared links for albums Adds a path to display only the shared links corresponding to an album. Changes the View links button from albums to go to this path instead of the generic sharedlinks path that displays shared links for all assets and albums. --- .../album-page/user-selection-modal.svelte | 2 +- web/src/params/shareType.ts | 5 ++++ .../(user)/sharing/sharedlinks/+page.ts | 14 ---------- .../[[sharedItemId=id]]}/+page.svelte | 8 ++++++ .../[[sharedItemId=id]]/+page.ts | 26 +++++++++++++++++++ 5 files changed, 40 insertions(+), 15 deletions(-) create mode 100644 web/src/params/shareType.ts delete mode 100644 web/src/routes/(user)/sharing/sharedlinks/+page.ts rename web/src/routes/(user)/sharing/sharedlinks/{ => [[type=shareType]]/[[sharedItemId=id]]}/+page.svelte (87%) create mode 100644 web/src/routes/(user)/sharing/sharedlinks/[[type=shareType]]/[[sharedItemId=id]]/+page.ts diff --git a/web/src/lib/components/album-page/user-selection-modal.svelte b/web/src/lib/components/album-page/user-selection-modal.svelte index 5521d521735b3..a1c9f643e7063 100644 --- a/web/src/lib/components/album-page/user-selection-modal.svelte +++ b/web/src/lib/components/album-page/user-selection-modal.svelte @@ -174,7 +174,7 @@ {#if sharedLinks.length} diff --git a/web/src/params/shareType.ts b/web/src/params/shareType.ts new file mode 100644 index 0000000000000..fc720eee8e058 --- /dev/null +++ b/web/src/params/shareType.ts @@ -0,0 +1,5 @@ +import type { ParamMatcher } from '@sveltejs/kit'; + +export const match: ParamMatcher = (param: string) => { + return param === 'album' || param === 'individual'; +}; diff --git a/web/src/routes/(user)/sharing/sharedlinks/+page.ts b/web/src/routes/(user)/sharing/sharedlinks/+page.ts deleted file mode 100644 index 920e5bdba4792..0000000000000 --- a/web/src/routes/(user)/sharing/sharedlinks/+page.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { authenticate } from '$lib/utils/auth'; -import { getFormatter } from '$lib/utils/i18n'; -import type { PageLoad } from './$types'; - -export const load = (async () => { - await authenticate(); - const $t = await getFormatter(); - - return { - meta: { - title: $t('shared_links'), - }, - }; -}) satisfies PageLoad; diff --git a/web/src/routes/(user)/sharing/sharedlinks/+page.svelte b/web/src/routes/(user)/sharing/sharedlinks/[[type=shareType]]/[[sharedItemId=id]]/+page.svelte similarity index 87% rename from web/src/routes/(user)/sharing/sharedlinks/+page.svelte rename to web/src/routes/(user)/sharing/sharedlinks/[[type=shareType]]/[[sharedItemId=id]]/+page.svelte index 5e934143dff2a..88b5d5e39582a 100644 --- a/web/src/routes/(user)/sharing/sharedlinks/+page.svelte +++ b/web/src/routes/(user)/sharing/sharedlinks/[[type=shareType]]/[[sharedItemId=id]]/+page.svelte @@ -12,14 +12,22 @@ import { getAllSharedLinks, removeSharedLink, type SharedLinkResponseDto } from '@immich/sdk'; import { mdiArrowLeft } from '@mdi/js'; import { onMount } from 'svelte'; + import type { PageData } from './$types'; import { dialogController } from '$lib/components/shared-components/dialog/dialog'; import { t } from 'svelte-i18n'; + export let data: PageData; + let sharedLinks: SharedLinkResponseDto[] = []; let editSharedLink: SharedLinkResponseDto | null = null; const refresh = async () => { sharedLinks = await getAllSharedLinks(); + if (data.sharedItem.type === 'album') { + sharedLinks = sharedLinks.filter((link) => link.album?.id === data.sharedItem.id); + } else if (data.sharedItem.type === 'individual') { + sharedLinks = sharedLinks.filter((link) => link.assets.some((asset) => asset.id === data.sharedItem.id)); + } }; onMount(async () => { diff --git a/web/src/routes/(user)/sharing/sharedlinks/[[type=shareType]]/[[sharedItemId=id]]/+page.ts b/web/src/routes/(user)/sharing/sharedlinks/[[type=shareType]]/[[sharedItemId=id]]/+page.ts new file mode 100644 index 0000000000000..a73b29085b4bb --- /dev/null +++ b/web/src/routes/(user)/sharing/sharedlinks/[[type=shareType]]/[[sharedItemId=id]]/+page.ts @@ -0,0 +1,26 @@ +import { authenticate } from '$lib/utils/auth'; +import { getFormatter } from '$lib/utils/i18n'; +import { getAssetInfoFromParam } from '$lib/utils/navigation'; +import { getAlbumInfo } from '@immich/sdk'; +import type { PageLoad } from './$types'; + +export const load = (async ({ params }) => { + await authenticate(); + + if (params.type === 'album' && params.sharedItemId) { + await getAlbumInfo({ id: params.sharedItemId, withoutAssets: true }); + } else if (params.type === 'individual') { + await getAssetInfoFromParam({ assetId: params.sharedItemId }); + } + const $t = await getFormatter(); + + return { + sharedItem: { + type: params.type, + id: params.sharedItemId, + }, + meta: { + title: $t('shared_links'), + }, + }; +}) satisfies PageLoad;