fix(web): add URLs to results in large files utility (#23617)

fix(web): add URLs to results in large files
pull/22948/merge
Snowknight26 2025-11-06 08:24:47 +07:00 committed by GitHub
parent 365abd8906
commit 2c50f2e244
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 29 additions and 15 deletions

@ -8,6 +8,7 @@
import { navigate } from '$lib/utils/navigation'; import { navigate } from '$lib/utils/navigation';
import { t } from 'svelte-i18n'; import { t } from 'svelte-i18n';
import type { PageData } from './$types'; import type { PageData } from './$types';
import type { AssetResponseDto } from '@immich/sdk';
interface Props { interface Props {
data: PageData; data: PageData;
@ -16,35 +17,42 @@
let { data }: Props = $props(); let { data }: Props = $props();
let assets = $derived(data.assets); let assets = $derived(data.assets);
let asset = $derived(data.asset);
const { isViewing: showAssetViewer, asset: viewingAsset, setAsset } = assetViewingStore; const { isViewing: showAssetViewer, asset: viewingAsset, setAsset } = assetViewingStore;
const getAssetIndex = (id: string) => assets.findIndex((asset) => asset.id === id); const getAssetIndex = (id: string) => assets.findIndex((asset) => asset.id === id);
const onNext = () => { $effect(() => {
if (asset) {
setAsset(asset);
}
});
const onNext = async () => {
const index = getAssetIndex($viewingAsset.id) + 1; const index = getAssetIndex($viewingAsset.id) + 1;
if (index >= assets.length) { if (index >= assets.length) {
return Promise.resolve(false); return false;
} }
setAsset(assets[index]); await onViewAsset(assets[index]);
return Promise.resolve(true); return true;
}; };
const onPrevious = () => { const onPrevious = async () => {
const index = getAssetIndex($viewingAsset.id) - 1; const index = getAssetIndex($viewingAsset.id) - 1;
if (index < 0) { if (index < 0) {
return Promise.resolve(false); return false;
} }
setAsset(assets[index]); await onViewAsset(assets[index]);
return Promise.resolve(true); return true;
}; };
const onRandom = () => { const onRandom = async () => {
if (assets.length <= 0) { if (assets.length <= 0) {
return Promise.resolve(undefined); return undefined;
} }
const index = Math.floor(Math.random() * assets.length); const index = Math.floor(Math.random() * assets.length);
const asset = assets[index]; const asset = assets[index];
setAsset(asset); await onViewAsset(asset);
return Promise.resolve(asset); return asset;
}; };
const onAction = (payload: Action) => { const onAction = (payload: Action) => {
@ -53,13 +61,17 @@
$showAssetViewer = false; $showAssetViewer = false;
} }
}; };
const onViewAsset = async (asset: AssetResponseDto) => {
await navigate({ targetRoute: 'current', assetId: asset.id });
};
</script> </script>
<UserPageLayout title={data.meta.title} scrollbar={true}> <UserPageLayout title={data.meta.title} scrollbar={true}>
<div class="grid gap-2 grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 xl:grid-cols-6"> <div class="grid gap-2 grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 xl:grid-cols-6">
{#if assets && data.assets.length > 0} {#if assets && data.assets.length > 0}
{#each assets as asset (asset.id)} {#each assets as asset (asset.id)}
<LargeAssetData {asset} onViewAsset={(asset) => setAsset(asset)} /> <LargeAssetData {asset} {onViewAsset} />
{/each} {/each}
{:else} {:else}
<p class="text-center text-lg dark:text-white flex place-items-center place-content-center"> <p class="text-center text-lg dark:text-white flex place-items-center place-content-center">

@ -1,15 +1,17 @@
import { authenticate } from '$lib/utils/auth'; import { authenticate } from '$lib/utils/auth';
import { getFormatter } from '$lib/utils/i18n'; import { getFormatter } from '$lib/utils/i18n';
import { getAssetInfoFromParam } from '$lib/utils/navigation';
import { searchLargeAssets } from '@immich/sdk'; import { searchLargeAssets } from '@immich/sdk';
import type { PageLoad } from './$types'; import type { PageLoad } from './$types';
export const load = (async ({ url }) => { export const load = (async ({ params, url }) => {
await authenticate(url); await authenticate(url);
const assets = await searchLargeAssets({ minFileSize: 0 }); const [assets, asset] = await Promise.all([searchLargeAssets({ minFileSize: 0 }), getAssetInfoFromParam(params)]);
const $t = await getFormatter(); const $t = await getFormatter();
return { return {
assets, assets,
asset,
meta: { meta: {
title: $t('large_files'), title: $t('large_files'),
}, },