Skip to content

Commit 174dd22

Browse files
committed
feat(web): improve individual share ux
1 parent f096dd0 commit 174dd22

File tree

3 files changed

+69
-36
lines changed

3 files changed

+69
-36
lines changed

web/src/lib/components/asset-viewer/asset-viewer-nav-bar.svelte

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
album?: AlbumResponseDto | null;
5555
person?: PersonResponseDto | null;
5656
stack?: StackResponseDto | null;
57+
showCloseButton: boolean;
5758
showDetailButton: boolean;
5859
showSlideshow?: boolean;
5960
onZoomImage: () => void;
@@ -73,6 +74,7 @@
7374
album = null,
7475
person = null,
7576
stack = null,
77+
showCloseButton = true,
7678
showDetailButton,
7779
showSlideshow = false,
7880
onZoomImage,
@@ -89,6 +91,7 @@
8991
const sharedLink = getSharedLink();
9092
let isOwner = $derived($user && asset.ownerId === $user?.id);
9193
let showDownloadButton = $derived(sharedLink ? sharedLink.allowDownload : !asset.isOffline);
94+
9295
// $: showEditorButton =
9396
// isOwner &&
9497
// asset.type === AssetTypeEnum.Image &&
@@ -104,7 +107,9 @@
104107
class="z-[1001] flex h-16 place-items-center justify-between bg-gradient-to-b from-black/40 px-3 transition-transform duration-200"
105108
>
106109
<div class="text-white">
107-
<CloseAction {onClose} />
110+
{#if showCloseButton}
111+
<CloseAction {onClose} />
112+
{/if}
108113
</div>
109114
<div class="flex gap-2 overflow-x-auto text-white" data-testid="asset-viewer-navbar-actions">
110115
{#if !asset.isTrashed && $user}

web/src/lib/components/asset-viewer/asset-viewer.svelte

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
6161
preAction?: PreAction | undefined;
6262
onAction?: OnAction | undefined;
6363
reactions?: ActivityResponseDto[];
64+
showCloseButton?: boolean;
6465
onClose: (dto: { asset: AssetResponseDto }) => void;
6566
onNext: () => Promise<HasAsset>;
6667
onPrevious: () => Promise<HasAsset>;
@@ -79,6 +80,7 @@
7980
preAction = undefined,
8081
onAction = undefined,
8182
reactions = $bindable([]),
83+
showCloseButton,
8284
onClose,
8385
onNext,
8486
onPrevious,
@@ -431,6 +433,7 @@
431433
{album}
432434
{person}
433435
{stack}
436+
{showCloseButton}
434437
showDetailButton={enableDetailPanel}
435438
showSlideshow={true}
436439
onZoomImage={zoomToggle}

web/src/lib/components/share-page/individual-shared-viewer.svelte

Lines changed: 60 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<script lang="ts">
22
import { goto } from '$app/navigation';
3-
import { AppRoute } from '$lib/constants';
3+
import type { Action } from '$lib/components/asset-viewer/actions/action';
4+
import { AppRoute, AssetAction } from '$lib/constants';
45
import { dragAndDropFilesStore } from '$lib/stores/drag-and-drop-files.store';
56
import { getKey, handlePromiseError } from '$lib/utils';
67
import { downloadArchive } from '$lib/utils/asset-utils';
@@ -14,6 +15,7 @@
1415
import AssetSelectControlBar from '../photos-page/asset-select-control-bar.svelte';
1516
import ControlAppBar from '../shared-components/control-app-bar.svelte';
1617
import GalleryViewer from '../shared-components/gallery-viewer/gallery-viewer.svelte';
18+
import AssetViewer from '../asset-viewer/asset-viewer.svelte';
1719
import { cancelMultiselect } from '$lib/utils/asset-utils';
1820
import ImmichLogoSmallLink from '$lib/components/shared-components/immich-logo-small-link.svelte';
1921
import { NotificationType, notificationController } from '../shared-components/notification/notification';
@@ -72,44 +74,67 @@
7274
const handleSelectAll = () => {
7375
assetInteraction.selectAssets(assets);
7476
};
77+
78+
const handleAction = async (action: Action) => {
79+
switch (action.type) {
80+
case AssetAction.ARCHIVE:
81+
case AssetAction.DELETE:
82+
case AssetAction.TRASH: {
83+
await goto(AppRoute.PHOTOS);
84+
break;
85+
}
86+
}
87+
};
7588
</script>
7689

7790
<section class="bg-immich-bg dark:bg-immich-dark-bg">
78-
{#if assetInteraction.selectionActive}
79-
<AssetSelectControlBar
80-
assets={assetInteraction.selectedAssets}
81-
clearSelect={() => cancelMultiselect(assetInteraction)}
82-
>
83-
<CircleIconButton title={$t('select_all')} icon={mdiSelectAll} onclick={handleSelectAll} />
84-
{#if sharedLink?.allowDownload}
85-
<DownloadAction filename="immich-shared.zip" />
86-
{/if}
87-
{#if isOwned}
88-
<RemoveFromSharedLink bind:sharedLink />
89-
{/if}
90-
</AssetSelectControlBar>
91-
{:else}
92-
<ControlAppBar onClose={() => goto(AppRoute.PHOTOS)} backIcon={mdiArrowLeft} showBackButton={false}>
93-
{#snippet leading()}
94-
<ImmichLogoSmallLink />
95-
{/snippet}
96-
97-
{#snippet trailing()}
98-
{#if sharedLink?.allowUpload}
99-
<CircleIconButton
100-
title={$t('add_photos')}
101-
onclick={() => handleUploadAssets()}
102-
icon={mdiFileImagePlusOutline}
103-
/>
104-
{/if}
105-
91+
{#if sharedLink?.allowUpload}
92+
{#if assetInteraction.selectionActive}
93+
<AssetSelectControlBar
94+
assets={assetInteraction.selectedAssets}
95+
clearSelect={() => cancelMultiselect(assetInteraction)}
96+
>
97+
<CircleIconButton title={$t('select_all')} icon={mdiSelectAll} onclick={handleSelectAll} />
10698
{#if sharedLink?.allowDownload}
107-
<CircleIconButton title={$t('download')} onclick={downloadAssets} icon={mdiFolderDownloadOutline} />
99+
<DownloadAction filename="immich-shared.zip" />
100+
{/if}
101+
{#if isOwned}
102+
<RemoveFromSharedLink bind:sharedLink />
108103
{/if}
109-
{/snippet}
110-
</ControlAppBar>
104+
</AssetSelectControlBar>
105+
{:else}
106+
<ControlAppBar onClose={() => goto(AppRoute.PHOTOS)} backIcon={mdiArrowLeft} showBackButton={false}>
107+
{#snippet leading()}
108+
<ImmichLogoSmallLink />
109+
{/snippet}
110+
111+
{#snippet trailing()}
112+
{#if sharedLink?.allowUpload}
113+
<CircleIconButton
114+
title={$t('add_photos')}
115+
onclick={() => handleUploadAssets()}
116+
icon={mdiFileImagePlusOutline}
117+
/>
118+
{/if}
119+
120+
{#if sharedLink?.allowDownload}
121+
<CircleIconButton title={$t('download')} onclick={downloadAssets} icon={mdiFolderDownloadOutline} />
122+
{/if}
123+
{/snippet}
124+
</ControlAppBar>
125+
{/if}
126+
<section class="my-[160px] mx-4" bind:clientHeight={viewport.height} bind:clientWidth={viewport.width}>
127+
<GalleryViewer {assets} {assetInteraction} {viewport} />
128+
</section>
129+
{:else}
130+
<AssetViewer
131+
asset={assets[0]}
132+
showCloseButton={false}
133+
onAction={handleAction}
134+
onPrevious={() => {}}
135+
onNext={() => {}}
136+
onRandom={() => {}}
137+
onClose={() => {}}
138+
/>
111139
{/if}
112-
<section class="my-[160px] mx-4" bind:clientHeight={viewport.height} bind:clientWidth={viewport.width}>
113-
<GalleryViewer {assets} {assetInteraction} {viewport} />
114-
</section>
115140
</section>

0 commit comments

Comments
 (0)