Skip to content

Commit ced45d9

Browse files
committed
most bugs fixed
1 parent 74a5ec6 commit ced45d9

File tree

10 files changed

+120
-113
lines changed

10 files changed

+120
-113
lines changed

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

Lines changed: 14 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -162,35 +162,22 @@
162162
}
163163
};
164164
165-
console.log('on create - assetviwer');
165+
let transitionName = $state<string | null>('hero');
166166
167-
let transitionName = $state<string | null>('good');
168-
169-
$inspect(transitionName).with((a, b) => console.log('trans', a, b));
170-
$inspect(asset).with(console.log);
171167
let addInfoTransition;
172168
let finished;
173169
onMount(async () => {
174-
debugger;
175170
addInfoTransition = () => {
176-
console.log('adding info');
177171
detailPanelTransitionName = 'info';
178172
};
179173
eventManager.on('TransitionToAssetViewer', addInfoTransition);
180174
eventManager.on('TransitionToTimeline', addInfoTransition);
181175
finished = () => {
182-
console.log('removing info');
183176
detailPanelTransitionName = null;
184177
transitionName = null;
185-
console.log('clearning tasnition name in asset viwer');
186178
};
187179
eventManager.on('Finished', finished);
188-
189-
console.log('on mount - assetviwer');
190180
eventManager.emit('AssetViewerLoaded');
191-
eventManager.on('Finished', () => {
192-
debugger;
193-
});
194181
unsubscribes.push(
195182
websocketEvents.on('on_upload_success', (asset) => onAssetUpdate({ event: 'upload', asset })),
196183
websocketEvents.on('on_asset_update', (asset) => onAssetUpdate({ event: 'update', asset })),
@@ -232,7 +219,6 @@
232219
}
233220
234221
activityManager.reset();
235-
console.log('offing');
236222
eventManager.off('TransitionToAssetViewer', addInfoTransition!);
237223
eventManager.off('TransitionToTimeline', addInfoTransition!);
238224
eventManager.off('Finished', finished!);
@@ -263,7 +249,7 @@
263249
};
264250
265251
const closeViewer = () => {
266-
transitionName = 'good';
252+
transitionName = 'hero';
267253
onClose(asset);
268254
};
269255
@@ -292,29 +278,6 @@
292278
});
293279
}),
294280
);
295-
// const navigatingPromise = new Promise((resolve) => {
296-
// eventManager.once('loaded', () => {
297-
// resolve();
298-
// });
299-
300-
// console.log('BEFORE VIEW TRANS');
301-
// debugger;
302-
// const transition = document.startViewTransition(async () => {
303-
// console.log('IN VIEW TRANS');
304-
// console.log('emit', 'StartViewTransition');
305-
// eventManager.emit('StartViewTransition');
306-
// console.log('starting');
307-
// debugger;
308-
309-
// await navigatingPromise;
310-
// debugger;
311-
// console.log('AFTER VIEW TRANS!');
312-
// });
313-
// transition.updateCallbackDone.then(() => {
314-
// console.log('DONE VIEW TRANS!');
315-
// eventManager.emit('EndViewTransition');
316-
// });
317-
// });
318281
319282
e?.stopPropagation();
320283
@@ -341,9 +304,6 @@
341304
}
342305
}
343306
};
344-
onDestroy(() => {
345-
console.log('destryo');
346-
});
347307
348308
// const showEditorHandler = () => {
349309
// if (isShowActivity) {
@@ -481,6 +441,7 @@
481441
});
482442
let viewerHeight = $state<number>(0);
483443
let detailPanelTransitionName = $state<string | null>(null);
444+
let loaded = $state(false);
484445
</script>
485446

486447
<OnEvents onAssetReplace={handleAssetReplace} />
@@ -496,7 +457,10 @@
496457
>
497458
<!-- Top navigation bar -->
498459
{#if $slideshowState === SlideshowState.None && !isShowEditor}
499-
<div class="col-span-4 col-start-1 row-span-1 row-start-1 transition-transform">
460+
<div
461+
class="col-span-4 col-start-1 row-span-1 row-start-1 transition-transform"
462+
style:view-transition-name="exclude"
463+
>
500464
<AssetViewerNavBar
501465
{asset}
502466
{album}
@@ -550,13 +514,16 @@
550514
bind:clientHeight={viewerHeight}
551515
class="z-[-1] relative col-start-1 col-span-4 row-start-1 row-span-full flex items-center"
552516
>
553-
<div data-transition-asset style:view-transition-name={transitionName} class="grow">
517+
<div data-transition-asset style:view-transition-name={transitionName} class={['mx-auto max-h-dvh']}>
554518
{#if previewStackedAsset}
555519
{#key previewStackedAsset.id}
556520
{#if previewStackedAsset.type === AssetTypeEnum.Image}
557521
<PhotoViewer
558522
bind:zoomToggle
559523
bind:copyImage
524+
onPhotoLoaded={() => {
525+
loaded = true;
526+
}}
560527
asset={previewStackedAsset}
561528
{preloadAssets}
562529
onPreviousAsset={() => navigateAsset('previous')}
@@ -603,6 +570,9 @@
603570
<PhotoViewer
604571
bind:zoomToggle
605572
bind:copyImage
573+
onPhotoLoaded={() => {
574+
loaded = true;
575+
}}
606576
{asset}
607577
{preloadAssets}
608578
onPreviousAsset={() => navigateAsset('previous')}

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

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,11 @@
4040
onNextAsset?: (() => void) | null;
4141
copyImage?: () => Promise<void>;
4242
zoomToggle?: (() => void) | null;
43+
onPhotoLoaded?: (() => void) | null;
4344
}
4445
4546
let {
47+
onPhotoLoaded,
4648
asset,
4749
preloadAssets = undefined,
4850
element = $bindable(),
@@ -192,16 +194,16 @@
192194
};
193195
194196
const onload = () => {
197+
onPhotoLoaded?.();
195198
imageLoaded = true;
196199
assetFileUrl = imageLoaderUrl;
197200
originalImageLoaded = targetImageSize === AssetMediaSize.Fullsize || targetImageSize === 'original';
198-
console.log('RenderLoaded', imageLoaderUrl, imageLoaded);
199201
eventManager.emit('RenderLoaded');
200202
};
201203
202204
const onerror = () => {
205+
onPhotoLoaded?.();
203206
imageError = imageLoaded = true;
204-
console.log('RenderLoaded err', imageLoaderUrl, imageLoaded);
205207
eventManager.emit('RenderLoaded');
206208
};
207209
@@ -211,7 +213,7 @@
211213
212214
onMount(() => {
213215
if (loader?.complete) {
214-
onload();
216+
void onload();
215217
}
216218
loader?.addEventListener('load', onload, { passive: true });
217219
loader?.addEventListener('error', onerror, { passive: true });
@@ -247,12 +249,10 @@
247249

248250
<div
249251
bind:this={element}
250-
class="relative h-full select-none"
252+
class="relative h-full w-full select-none max-h-full max-h-full"
251253
bind:clientWidth={containerWidth}
252254
bind:clientHeight={containerHeight}
253255
>
254-
<img style="display:none" src={imageLoaderUrl} alt="" {onload} {onerror} />
255-
256256
{#if !imageLoaded}
257257
<div id="spinner" class="flex h-full items-center justify-center">
258258
<LoadingSpinner />
@@ -276,7 +276,7 @@
276276
bind:this={$photoViewerImgElement}
277277
src={assetFileUrl}
278278
alt={$getAltText(toTimelineAsset(asset))}
279-
class="h-full w-full {$slideshowState === SlideshowState.None
279+
class="max-h-dvh h-full w-full {$slideshowState === SlideshowState.None
280280
? 'object-contain'
281281
: slideshowLookCssMapping[$slideshowLook]}"
282282
draggable="false"

web/src/lib/components/layouts/user-page-layout.svelte

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
import NavigationBar from '$lib/components/shared-components/navigation-bar/navigation-bar.svelte';
88
import UserSidebar from '$lib/components/shared-components/side-bar/user-sidebar.svelte';
99
import { openFileUploadDialog } from '$lib/utils/file-uploader';
10-
import type { Snippet } from 'svelte';
10+
import { getContext, type Snippet } from 'svelte';
11+
import type { AppState } from '../../../routes/+layout.svelte';
1112
1213
interface Props {
1314
hideNavbar?: boolean;
@@ -37,10 +38,12 @@
3738
3839
let scrollbarClass = $derived(scrollbar ? 'immich-scrollbar' : 'scrollbar-hidden');
3940
let hasTitleClass = $derived(title ? 'top-16 h-[calc(100%-(--spacing(16)))]' : 'top-0 h-full');
41+
const appState = getContext('AppState') as AppState;
42+
let isAssetViewer = $derived(appState.isAssetViewer);
4043
</script>
4144

4245
<header>
43-
{#if !hideNavbar}
46+
{#if !hideNavbar && !isAssetViewer}
4447
<NavigationBar {showUploadButton} onUploadClick={() => openFileUploadDialog()} />
4548
{/if}
4649

@@ -53,13 +56,15 @@
5356
{hideNavbar ? 'pt-(--navbar-height)' : ''}
5457
{hideNavbar ? 'max-md:pt-(--navbar-height-md)' : ''}"
5558
>
56-
{#if sidebar}
59+
{#if isAssetViewer}
60+
<div></div>
61+
{:else if sidebar}
5762
{@render sidebar()}
5863
{:else}
5964
<UserSidebar />
6065
{/if}
6166

62-
<main class="relative">
67+
<main class="relative w-full">
6368
<div class="{scrollbarClass} absolute {hasTitleClass} w-full overflow-y-auto p-2" use:useActions={use}>
6469
{@render children?.()}
6570
</div>

web/src/lib/components/timeline/Scrubber.svelte

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import { fade, fly } from 'svelte/transition';
1212
1313
interface Props {
14+
invisible: boolean;
1415
/** Offset from the top of the timeline (e.g., for headers) */
1516
timelineTopOffset?: number;
1617
/** Offset from the bottom of the timeline (e.g., for footers) */
@@ -39,6 +40,7 @@
3940
}
4041
4142
let {
43+
invisible = false,
4244
timelineTopOffset = 0,
4345
timelineBottomOffset = 0,
4446
height = 0,
@@ -501,6 +503,7 @@
501503
aria-valuemin={toScrollY(0)}
502504
data-id="scrubber"
503505
class="absolute end-0 z-1 select-none hover:cursor-row-resize"
506+
class:invisible
504507
style:padding-top={PADDING_TOP + 'px'}
505508
style:padding-bottom={PADDING_BOTTOM + 'px'}
506509
style:width

web/src/lib/components/timeline/Timeline.svelte

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@
33
import { page } from '$app/state';
44
import { resizeObserver, type OnResizeCallback } from '$lib/actions/resize-observer';
55
import Scrubber from '$lib/components/timeline/Scrubber.svelte';
6-
import TimelineAssetViewer from '$lib/components/timeline/TimelineAssetViewer.svelte';
76
import TimelineKeyboardActions from '$lib/components/timeline/actions/TimelineKeyboardActions.svelte';
87
import { AssetAction } from '$lib/constants';
98
import HotModuleReload from '$lib/elements/HotModuleReload.svelte';
109
import Portal from '$lib/elements/Portal.svelte';
1110
import Skeleton from '$lib/elements/Skeleton.svelte';
1211
12+
import TimelineAssetViewer from '$lib/components/timeline/TimelineAssetViewer.svelte';
1313
import { eventManager } from '$lib/managers/event-manager.svelte';
1414
import type { DayGroup } from '$lib/managers/timeline-manager/day-group.svelte';
1515
import { isIntersecting } from '$lib/managers/timeline-manager/internal/intersection-support.svelte';
@@ -45,7 +45,7 @@
4545
// };
4646
// },
4747
// });
48-
// console.log('hi', send, typeof receive);
48+
4949
export type Something = {
5050
send: any;
5151
receive: any;
@@ -244,17 +244,19 @@
244244
timelineManager.viewportWidth = rect.width;
245245
}
246246
}
247-
const scrollTarget = $gridScrollTarget?.at;
247+
const scrollTarget = getScrollTarget();
248248
let scrolled = false;
249249
if (scrollTarget) {
250250
scrolled = await scrollAndLoadAsset(scrollTarget);
251251
}
252252
253253
if (!scrolled) {
254254
// if the asset is not found, scroll to the top
255-
// timelineManager.scrollTo(0);
255+
timelineManager.scrollTo(0);
256+
}
257+
if (!isAssetViewerRoute(page)) {
258+
invisible = false;
256259
}
257-
invisible = false;
258260
};
259261
260262
// note: only modified once in afterNavigate()
@@ -270,10 +272,11 @@
270272
const isNavigatingToAssetViewer = isAssetViewerRoute(to);
271273
const isNavigatingFromAssetViewer = isAssetViewerRoute(from);
272274
hasNavigatedToOrFromAssetViewer = isNavigatingToAssetViewer !== isNavigatingFromAssetViewer;
273-
if (!isNavigatingFromAssetViewer && isNavigatingToAssetViewer) {
274-
}
275275
});
276276
277+
const getScrollTarget = () => {
278+
return $gridScrollTarget?.at ?? page.params.assetId ?? null;
279+
};
277280
// afterNavigate is only called after navigation to a new URL, {complete} will resolve
278281
// after successful navigation.
279282
afterNavigate(({ complete }) => {
@@ -286,11 +289,11 @@
286289
if (isDirectNavigation) {
287290
initialLoadWasAssetViewer = isAssetViewerPage && !hasNavigatedToOrFromAssetViewer;
288291
}
289-
290292
void scrollAfterNavigate();
291293
if (!isAssetViewerPage) {
292-
const scrollTarget = $gridScrollTarget?.at ?? null;
294+
const scrollTarget = getScrollTarget();
293295
await tick();
296+
294297
eventManager.emit('TimelineLoaded', { id: scrollTarget });
295298
}
296299
});
@@ -302,7 +305,7 @@
302305
const topSectionResizeObserver: OnResizeCallback = ({ height }) => (timelineManager.topSectionHeight = height);
303306
304307
onMount(() => {
305-
if (!enableRouting) {
308+
if (!enableRouting && !isAssetViewerRoute(page)) {
306309
invisible = false;
307310
}
308311
});
@@ -608,6 +611,7 @@
608611
{#if timelineManager.months.length > 0}
609612
<Scrubber
610613
{timelineManager}
614+
{invisible}
611615
height={timelineManager.viewportHeight}
612616
timelineTopOffset={timelineManager.topSectionHeight}
613617
timelineBottomOffset={timelineManager.bottomSectionHeight}

web/src/lib/components/timeline/TimelineAssetViewer.svelte

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,11 +85,8 @@
8585
8686
const handleClose = async (asset: { id: string }) => {
8787
const awaitInit = new Promise<void>((resolve) => eventManager.once('StartViewTransition', resolve));
88-
console.log('emit back to timeline');
8988
eventManager.emit('TransitionToTimeline', { id: asset.id });
90-
console.log('waitint for init');
9189
await awaitInit;
92-
console.log('done with for init');
9390
9491
assetViewingStore.showAssetViewer(false);
9592
invisible = true;

0 commit comments

Comments
 (0)