mirror of
https://github.com/samsonjs/immich.git
synced 2026-04-27 15:07:45 +00:00
feat(web): slideshow feature on shared albums (#24598)
This commit is contained in:
parent
b10a8baf53
commit
3ef4c4f315
1 changed files with 22 additions and 2 deletions
|
|
@ -17,11 +17,12 @@
|
||||||
import { fileUploadHandler, openFileUploadDialog } from '$lib/utils/file-uploader';
|
import { fileUploadHandler, openFileUploadDialog } from '$lib/utils/file-uploader';
|
||||||
import type { AlbumResponseDto, SharedLinkResponseDto, UserResponseDto } from '@immich/sdk';
|
import type { AlbumResponseDto, SharedLinkResponseDto, UserResponseDto } from '@immich/sdk';
|
||||||
import { IconButton, Logo } from '@immich/ui';
|
import { IconButton, Logo } from '@immich/ui';
|
||||||
import { mdiDownload, mdiFileImagePlusOutline } from '@mdi/js';
|
import { mdiDownload, mdiFileImagePlusOutline, mdiPresentationPlay } from '@mdi/js';
|
||||||
import { t } from 'svelte-i18n';
|
import { t } from 'svelte-i18n';
|
||||||
import ControlAppBar from '../shared-components/control-app-bar.svelte';
|
import ControlAppBar from '../shared-components/control-app-bar.svelte';
|
||||||
import ThemeButton from '../shared-components/theme-button.svelte';
|
import ThemeButton from '../shared-components/theme-button.svelte';
|
||||||
import AlbumSummary from './album-summary.svelte';
|
import AlbumSummary from './album-summary.svelte';
|
||||||
|
import { SlideshowNavigation, SlideshowState, slideshowStore } from '$lib/stores/slideshow.store';
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
sharedLink: SharedLinkResponseDto;
|
sharedLink: SharedLinkResponseDto;
|
||||||
|
|
@ -32,7 +33,8 @@
|
||||||
|
|
||||||
const album = sharedLink.album as AlbumResponseDto;
|
const album = sharedLink.album as AlbumResponseDto;
|
||||||
|
|
||||||
let { isViewing: showAssetViewer } = assetViewingStore;
|
let { isViewing: showAssetViewer, setAssetId } = assetViewingStore;
|
||||||
|
let { slideshowState, slideshowNavigation } = slideshowStore;
|
||||||
|
|
||||||
const options = $derived({ albumId: album.id, order: album.order });
|
const options = $derived({ albumId: album.id, order: album.order });
|
||||||
let timelineManager = $state<TimelineManager>() as TimelineManager;
|
let timelineManager = $state<TimelineManager>() as TimelineManager;
|
||||||
|
|
@ -45,6 +47,16 @@
|
||||||
dragAndDropFilesStore.set({ isDragging: false, files: [] });
|
dragAndDropFilesStore.set({ isDragging: false, files: [] });
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const handleStartSlideshow = async () => {
|
||||||
|
const asset =
|
||||||
|
$slideshowNavigation === SlideshowNavigation.Shuffle
|
||||||
|
? await timelineManager.getRandomAsset()
|
||||||
|
: timelineManager.months[0]?.dayGroups[0]?.viewerAssets[0]?.asset;
|
||||||
|
if (asset) {
|
||||||
|
handlePromiseError(setAssetId(asset.id).then(() => ($slideshowState = SlideshowState.PlaySlideshow)));
|
||||||
|
}
|
||||||
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<svelte:document
|
<svelte:document
|
||||||
|
|
@ -117,6 +129,14 @@
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
{#if album.assetCount > 0 && sharedLink.allowDownload}
|
{#if album.assetCount > 0 && sharedLink.allowDownload}
|
||||||
|
<IconButton
|
||||||
|
shape="round"
|
||||||
|
variant="ghost"
|
||||||
|
color="secondary"
|
||||||
|
aria-label={$t('slideshow')}
|
||||||
|
onclick={handleStartSlideshow}
|
||||||
|
icon={mdiPresentationPlay}
|
||||||
|
/>
|
||||||
<IconButton
|
<IconButton
|
||||||
shape="round"
|
shape="round"
|
||||||
color="secondary"
|
color="secondary"
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue