diff --git a/web/src/lib/components/album-page/albums-list.svelte b/web/src/lib/components/album-page/albums-list.svelte index 0696a937ccc..befe2019a16 100644 --- a/web/src/lib/components/album-page/albums-list.svelte +++ b/web/src/lib/components/album-page/albums-list.svelte @@ -1,43 +1,47 @@ @@ -419,22 +435,4 @@ onClose={() => (albumToEdit = null)} /> {/if} - - - {#if albumToShare} - {#if showShareByURLModal} - closeShareModal()} - onCreated={() => albumToShare && handleSharedLinkCreated(albumToShare)} - /> - {:else} - (showShareByURLModal = true)} - onClose={() => closeShareModal()} - /> - {/if} - {/if} {/if} diff --git a/web/src/lib/components/asset-viewer/actions/share-action.svelte b/web/src/lib/components/asset-viewer/actions/share-action.svelte index 6fd5aa456ee..f32d3e75158 100644 --- a/web/src/lib/components/asset-viewer/actions/share-action.svelte +++ b/web/src/lib/components/asset-viewer/actions/share-action.svelte @@ -1,7 +1,10 @@ - (showModal = true)} title={$t('share')} /> - -{#if showModal} - - (showModal = false)} /> - -{/if} + diff --git a/web/src/lib/components/photos-page/actions/create-shared-link.svelte b/web/src/lib/components/photos-page/actions/create-shared-link.svelte index 1b99627ea99..05baf822c10 100644 --- a/web/src/lib/components/photos-page/actions/create-shared-link.svelte +++ b/web/src/lib/components/photos-page/actions/create-shared-link.svelte @@ -1,16 +1,26 @@ - (showModal = true)} /> - -{#if showModal} - id)} onClose={() => (showModal = false)} /> -{/if} + diff --git a/web/src/lib/components/shared-components/create-share-link-modal/create-shared-link-modal.svelte b/web/src/lib/components/shared-components/create-share-link-modal/create-shared-link-modal.svelte deleted file mode 100644 index a87ca3da4a6..00000000000 --- a/web/src/lib/components/shared-components/create-share-link-modal/create-shared-link-modal.svelte +++ /dev/null @@ -1,251 +0,0 @@ - - -{#if !sharedLink || editingLink} - -
- {#if shareType === SharedLinkType.Album} - {#if !editingLink} -
{$t('album_with_link_access')}
- {:else} -
- {$t('public_album')} | - {editingLink.album?.albumName} -
- {/if} - {/if} - - {#if shareType === SharedLinkType.Individual} - {#if !editingLink} -
{$t('create_link_to_share_description')}
- {:else} -
- {$t('individual_share')} | - {editingLink.description || ''} -
- {/if} - {/if} - -
-

{$t('link_options').toUpperCase()}

-
-
-
-
- -
- -
- -
- -
- -
- -
- -
- -
- -
- -
- -
- - {#if editingLink} -
- -
- {/if} -
- -
-
-
-
- - {#snippet stickyBottom()} - {#if editingLink} - - {:else} - - {/if} - {/snippet} -
-{:else} - -{/if} diff --git a/web/src/lib/constants.ts b/web/src/lib/constants.ts index 285bccae301..f13d008a3c5 100644 --- a/web/src/lib/constants.ts +++ b/web/src/lib/constants.ts @@ -367,8 +367,6 @@ export enum SettingInputFieldType { } export const AlbumPageViewMode = { - LINK_SHARING: 'link-sharing', - SELECT_USERS: 'select-users', SELECT_THUMBNAIL: 'select-thumbnail', SELECT_ASSETS: 'select-assets', VIEW_USERS: 'view-users', @@ -377,8 +375,6 @@ export const AlbumPageViewMode = { }; export type AlbumPageViewMode = - | typeof AlbumPageViewMode.LINK_SHARING - | typeof AlbumPageViewMode.SELECT_USERS | typeof AlbumPageViewMode.SELECT_THUMBNAIL | typeof AlbumPageViewMode.SELECT_ASSETS | typeof AlbumPageViewMode.VIEW_USERS diff --git a/web/src/lib/components/album-page/user-selection-modal.svelte b/web/src/lib/modals/AlbumShareModal.svelte similarity index 89% rename from web/src/lib/components/album-page/user-selection-modal.svelte rename to web/src/lib/modals/AlbumShareModal.svelte index 9ee7cc550d8..56e9a923059 100644 --- a/web/src/lib/components/album-page/user-selection-modal.svelte +++ b/web/src/lib/modals/AlbumShareModal.svelte @@ -3,8 +3,8 @@ import Dropdown from '$lib/components/elements/dropdown.svelte'; import Icon from '$lib/components/elements/icon.svelte'; import FullScreenModal from '$lib/components/shared-components/full-screen-modal.svelte'; - import QrCodeModal from '$lib/components/shared-components/qr-code-modal.svelte'; import { AppRoute } from '$lib/constants'; + import QrCodeModal from '$lib/modals/QrCodeModal.svelte'; import { serverConfig } from '$lib/stores/server-config.store'; import { makeSharedLinkUrl } from '$lib/utils'; import { @@ -20,16 +20,14 @@ import { mdiCheck, mdiEye, mdiLink, mdiPencil } from '@mdi/js'; import { onMount } from 'svelte'; import { t } from 'svelte-i18n'; - import UserAvatar from '../shared-components/user-avatar.svelte'; + import UserAvatar from '../components/shared-components/user-avatar.svelte'; interface Props { album: AlbumResponseDto; - onClose: () => void; - onSelect: (selectedUsers: AlbumUserAddDto[]) => void; - onShare: () => void; + onClose: (result?: { action: 'sharedLink' } | { action: 'sharedUsers'; data: AlbumUserAddDto[] }) => void; } - let { album, onClose, onSelect, onShare }: Props = $props(); + let { album, onClose }: Props = $props(); let users: UserResponseDto[] = $state([]); let selectedUsers: Record = $state({}); @@ -160,8 +158,10 @@ shape="round" disabled={Object.keys(selectedUsers).length === 0} onclick={() => - onSelect(Object.values(selectedUsers).map(({ user, ...rest }) => ({ userId: user.id, ...rest })))} - >{$t('add')} ({ userId: user.id, ...rest })), + })}>{$t('add')} {/if} @@ -182,7 +182,13 @@ {/if} - + {/if} diff --git a/web/src/lib/components/shared-components/qr-code-modal.svelte b/web/src/lib/modals/QrCodeModal.svelte similarity index 75% rename from web/src/lib/components/shared-components/qr-code-modal.svelte rename to web/src/lib/modals/QrCodeModal.svelte index 166b2837ee8..c56fda801b9 100644 --- a/web/src/lib/components/shared-components/qr-code-modal.svelte +++ b/web/src/lib/modals/QrCodeModal.svelte @@ -1,24 +1,23 @@ - -
+ +
@@ -37,5 +36,5 @@ />
-
- +
+
diff --git a/web/src/lib/modals/SharedLinkCreateModal.svelte b/web/src/lib/modals/SharedLinkCreateModal.svelte new file mode 100644 index 00000000000..b4b9eaf98f2 --- /dev/null +++ b/web/src/lib/modals/SharedLinkCreateModal.svelte @@ -0,0 +1,235 @@ + + + + + {#if shareType === SharedLinkType.Album} + {#if !editingLink} +
{$t('album_with_link_access')}
+ {:else} +
+ {$t('public_album')} | + {editingLink.album?.albumName} +
+ {/if} + {/if} + + {#if shareType === SharedLinkType.Individual} + {#if !editingLink} +
{$t('create_link_to_share_description')}
+ {:else} +
+ {$t('individual_share')} | + {editingLink.description || ''} +
+ {/if} + {/if} + +
+

{$t('link_options').toUpperCase()}

+
+
+
+
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ + {#if editingLink} +
+ +
+ {/if} +
+ +
+
+
+
+ + + {#if editingLink} + + {:else} + + {/if} + +
diff --git a/web/src/routes/(user)/albums/[albumId=id]/[[photos=photos]]/[[assetId=id]]/+page.svelte b/web/src/routes/(user)/albums/[albumId=id]/[[photos=photos]]/[[assetId=id]]/+page.svelte index 7f996396d8a..2331ae01b1f 100644 --- a/web/src/routes/(user)/albums/[albumId=id]/[[photos=photos]]/[[assetId=id]]/+page.svelte +++ b/web/src/routes/(user)/albums/[albumId=id]/[[photos=photos]]/[[assetId=id]]/+page.svelte @@ -7,7 +7,6 @@ import AlbumSummary from '$lib/components/album-page/album-summary.svelte'; import AlbumTitle from '$lib/components/album-page/album-title.svelte'; import ShareInfoModal from '$lib/components/album-page/share-info-modal.svelte'; - import UserSelectionModal from '$lib/components/album-page/user-selection-modal.svelte'; import ActivityStatus from '$lib/components/asset-viewer/activity-status.svelte'; import ActivityViewer from '$lib/components/asset-viewer/activity-viewer.svelte'; import Button from '$lib/components/elements/buttons/button.svelte'; @@ -29,7 +28,6 @@ import ButtonContextMenu from '$lib/components/shared-components/context-menu/button-context-menu.svelte'; import MenuOption from '$lib/components/shared-components/context-menu/menu-option.svelte'; import ControlAppBar from '$lib/components/shared-components/control-app-bar.svelte'; - import CreateSharedLinkModal from '$lib/components/shared-components/create-share-link-modal/create-shared-link-modal.svelte'; import { NotificationType, notificationController, @@ -37,12 +35,17 @@ import UserAvatar from '$lib/components/shared-components/user-avatar.svelte'; import { AlbumPageViewMode, AppRoute } from '$lib/constants'; import { activityManager } from '$lib/managers/activity-manager.svelte'; + import { modalManager } from '$lib/managers/modal-manager.svelte'; + import AlbumShareModal from '$lib/modals/AlbumShareModal.svelte'; + import QrCodeModal from '$lib/modals/QrCodeModal.svelte'; + import SharedLinkCreateModal from '$lib/modals/SharedLinkCreateModal.svelte'; import { AssetInteraction } from '$lib/stores/asset-interaction.svelte'; import { assetViewingStore } from '$lib/stores/asset-viewing.store'; import { AssetStore } from '$lib/stores/assets-store.svelte'; + import { serverConfig } from '$lib/stores/server-config.store'; import { SlideshowNavigation, SlideshowState, slideshowStore } from '$lib/stores/slideshow.store'; import { preferences, user } from '$lib/stores/user.store'; - import { handlePromiseError } from '$lib/utils'; + import { handlePromiseError, makeSharedLinkUrl } from '$lib/utils'; import { confirmAlbumDelete } from '$lib/utils/album-utils'; import { cancelMultiselect, downloadAlbum } from '$lib/utils/asset-utils'; import { openFileUploadDialog } from '$lib/utils/file-uploader'; @@ -178,10 +181,6 @@ const handleEscape = async () => { assetStore.suspendTransitions = true; - if (viewMode === AlbumPageViewMode.SELECT_USERS) { - viewMode = AlbumPageViewMode.VIEW; - return; - } if (viewMode === AlbumPageViewMode.SELECT_THUMBNAIL) { viewMode = AlbumPageViewMode.VIEW; return; @@ -190,10 +189,6 @@ await handleCloseSelectAssets(); return; } - if (viewMode === AlbumPageViewMode.LINK_SHARING) { - viewMode = AlbumPageViewMode.VIEW; - return; - } if (viewMode === AlbumPageViewMode.OPTIONS) { viewMode = AlbumPageViewMode.VIEW; return; @@ -423,6 +418,31 @@ const currentAssetIntersection = $derived( viewMode === AlbumPageViewMode.SELECT_ASSETS ? timelineInteraction : assetInteraction, ); + + const handleShare = async () => { + const result = await modalManager.show(AlbumShareModal, { album }); + + switch (result?.action) { + case 'sharedLink': { + await handleShareLink(); + return; + } + + case 'sharedUsers': { + await handleAddUsers(result.data); + return; + } + } + }; + + const handleShareLink = async () => { + const sharedLink = await modalManager.show(SharedLinkCreateModal, { albumId: album.id }); + + if (sharedLink) { + const url = makeSharedLinkUrl($serverConfig.externalDomain, sharedLink.key); + await modalManager.show(QrCodeModal, { title: $t('view_link'), value: url }); + } + };
@@ -496,11 +516,7 @@ {/if} {#if isOwned} - (viewMode = AlbumPageViewMode.SELECT_USERS)} - icon={mdiShareVariantOutline} - /> + {/if} @@ -530,12 +546,7 @@ {/if} {#if isCreatingSharedAlbum && album.albumUsers.length === 0} - {/if} @@ -619,7 +630,7 @@ color="gray" size="20" icon={mdiLink} - onclick={() => (viewMode = AlbumPageViewMode.LINK_SHARING)} + onclick={handleShareLink} /> {/if} @@ -651,7 +662,7 @@ color="gray" size="20" icon={mdiPlus} - onclick={() => (viewMode = AlbumPageViewMode.SELECT_USERS)} + onclick={handleShare} title={$t('add_more_users')} /> {/if} @@ -714,18 +725,6 @@
{/if}
-{#if viewMode === AlbumPageViewMode.SELECT_USERS} - (viewMode = AlbumPageViewMode.LINK_SHARING)} - onClose={() => (viewMode = AlbumPageViewMode.VIEW)} - /> -{/if} - -{#if viewMode === AlbumPageViewMode.LINK_SHARING} - (viewMode = AlbumPageViewMode.VIEW)} /> -{/if} {#if viewMode === AlbumPageViewMode.VIEW_USERS} (viewMode = AlbumPageViewMode.VIEW)} onToggleEnabledActivity={handleToggleEnableActivity} - onShowSelectSharedUser={() => (viewMode = AlbumPageViewMode.SELECT_USERS)} + onShowSelectSharedUser={handleShare} /> {/if} diff --git a/web/src/routes/(user)/shared-links/[[id=id]]/+page.svelte b/web/src/routes/(user)/shared-links/[[id=id]]/+page.svelte index 6fd1f17ecc8..1c1e1cfbd48 100644 --- a/web/src/routes/(user)/shared-links/[[id=id]]/+page.svelte +++ b/web/src/routes/(user)/shared-links/[[id=id]]/+page.svelte @@ -3,7 +3,6 @@ import { page } from '$app/state'; import GroupTab from '$lib/components/elements/group-tab.svelte'; import UserPageLayout from '$lib/components/layouts/user-page-layout.svelte'; - import CreateSharedLinkModal from '$lib/components/shared-components/create-share-link-modal/create-shared-link-modal.svelte'; import { dialogController } from '$lib/components/shared-components/dialog/dialog'; import { notificationController, @@ -11,6 +10,7 @@ } from '$lib/components/shared-components/notification/notification'; import SharedLinkCard from '$lib/components/sharedlinks-page/shared-link-card.svelte'; import { AppRoute } from '$lib/constants'; + import SharedLinkCreateModal from '$lib/modals/SharedLinkCreateModal.svelte'; import { handleError } from '$lib/utils/handle-error'; import { getAllSharedLinks, removeSharedLink, SharedLinkType, type SharedLinkResponseDto } from '@immich/sdk'; import { onMount } from 'svelte'; @@ -113,7 +113,7 @@ {/if} {#if sharedLink} - + {/if}