From 4ca76b24e93c6ad0eb3c931ec0e4dd242b8d2d26 Mon Sep 17 00:00:00 2001 From: midzelis Date: Fri, 17 Oct 2025 13:49:05 +0000 Subject: [PATCH] refactor: extract scrollsegment keeper --- .../components/album-page/album-viewer.svelte | 2 +- .../lib/components/timeline/Scrubber.svelte | 2 +- .../lib/components/timeline/Timeline.svelte | 158 +++--- .../timeline/TimelineAssetViewer.svelte | 2 +- .../timeline/TimelineDateGroup.svelte | 76 ++- .../timeline/actions/SelectAllAction.svelte | 2 +- .../actions/TimelineKeyboardActions.svelte | 4 +- .../timeline/actions/focus-actions.ts | 2 +- .../ScrollSegment.svelte.ts | 212 ++++++++ .../VirtualScrollManager.svelte.ts | 160 +++++- ...-group.svelte.ts => TimelineDay.svelte.ts} | 36 +- ...spec.ts => TimelineManager.svelte.spec.ts} | 208 ++++---- ...er.svelte.ts => TimelineManager.svelte.ts} | 493 +++++++----------- .../timeline-manager/TimelineMonth.svelte.ts | 398 ++++++++++++++ .../group-insertion-cache.svelte.ts | 56 +- .../internal/TestHooks.svelte.ts | 12 +- .../internal/intersection-support.svelte.ts | 73 --- .../internal/layout-support.svelte.ts | 70 --- .../internal/load-support.svelte.ts | 57 -- .../internal/search-support.svelte.spec.ts | 8 +- .../internal/search-support.svelte.ts | 82 +-- .../internal/websocket-support.svelte.ts | 2 +- .../timeline-manager/month-group.svelte.ts | 378 -------------- .../timeline-manager/viewer-asset.svelte.ts | 42 +- web/src/lib/modals/NavigateToDateModal.svelte | 2 +- web/src/lib/utils/actions.ts | 2 +- web/src/lib/utils/asset-utils.ts | 11 +- web/src/lib/utils/cancellable-task.ts | 23 +- web/src/lib/utils/timeline-util.ts | 28 + .../[[assetId=id]]/+page.svelte | 4 +- .../[[assetId=id]]/+page.svelte | 2 +- .../[[assetId=id]]/+page.svelte | 2 +- .../[[assetId=id]]/+page.svelte | 2 +- .../[[assetId=id]]/+page.svelte | 2 +- .../(user)/photos/[[assetId=id]]/+page.svelte | 2 +- .../[[assetId=id]]/+page.svelte | 2 +- .../[[assetId=id]]/+page.svelte | 2 +- .../(user)/utilities/geolocation/+page.svelte | 8 +- 38 files changed, 1366 insertions(+), 1261 deletions(-) create mode 100644 web/src/lib/managers/VirtualScrollManager/ScrollSegment.svelte.ts rename web/src/lib/managers/timeline-manager/{day-group.svelte.ts => TimelineDay.svelte.ts} (82%) rename web/src/lib/managers/timeline-manager/{timeline-manager.svelte.spec.ts => TimelineManager.svelte.spec.ts} (75%) rename web/src/lib/managers/timeline-manager/{timeline-manager.svelte.ts => TimelineManager.svelte.ts} (55%) create mode 100644 web/src/lib/managers/timeline-manager/TimelineMonth.svelte.ts delete mode 100644 web/src/lib/managers/timeline-manager/internal/intersection-support.svelte.ts delete mode 100644 web/src/lib/managers/timeline-manager/internal/layout-support.svelte.ts delete mode 100644 web/src/lib/managers/timeline-manager/internal/load-support.svelte.ts delete mode 100644 web/src/lib/managers/timeline-manager/month-group.svelte.ts diff --git a/web/src/lib/components/album-page/album-viewer.svelte b/web/src/lib/components/album-page/album-viewer.svelte index 8d169fbc8f..269bad1d23 100644 --- a/web/src/lib/components/album-page/album-viewer.svelte +++ b/web/src/lib/components/album-page/album-viewer.svelte @@ -6,7 +6,7 @@ import SelectAllAssets from '$lib/components/timeline/actions/SelectAllAction.svelte'; import AssetSelectControlBar from '$lib/components/timeline/AssetSelectControlBar.svelte'; import Timeline from '$lib/components/timeline/Timeline.svelte'; - import { TimelineManager } from '$lib/managers/timeline-manager/timeline-manager.svelte'; + import { TimelineManager } from '$lib/managers/timeline-manager/TimelineManager.svelte'; import { AssetInteraction } from '$lib/stores/asset-interaction.svelte'; import { assetViewingStore } from '$lib/stores/asset-viewing.store'; import { dragAndDropFilesStore } from '$lib/stores/drag-and-drop-files.store'; diff --git a/web/src/lib/components/timeline/Scrubber.svelte b/web/src/lib/components/timeline/Scrubber.svelte index d64d45cc87..49069da355 100644 --- a/web/src/lib/components/timeline/Scrubber.svelte +++ b/web/src/lib/components/timeline/Scrubber.svelte @@ -1,5 +1,5 @@ @@ -562,7 +560,7 @@ {onEscape} /> -{#if timelineManager.months.length > 0} +{#if timelineManager.segments.length > 0} (handleTimelineScroll(), timelineManager.updateSlidingWindow(), updateIsScrolling())} + onscroll={() => (handleTimelineScroll(), timelineManager.updateVisibleWindow(), updateIsScrolling())} >
- {#each timelineManager.months as monthGroup (monthGroup.viewId)} - {@const display = monthGroup.intersecting} - {@const absoluteHeight = monthGroup.top} + {#each timelineManager.segments as month (month.identifier.id)} + {@const display = month.intersecting} + {@const absoluteHeight = month.top} - {#if !monthGroup.isLoaded} + {#if !month.loaded}
- +
{:else if display}
handleGroupSelect(timelineManager, title, assets)} onSelectAssetCandidates={handleSelectAssetCandidates} onSelectAssets={handleSelectAssets} diff --git a/web/src/lib/components/timeline/TimelineAssetViewer.svelte b/web/src/lib/components/timeline/TimelineAssetViewer.svelte index a121bd1938..43ab6a094f 100644 --- a/web/src/lib/components/timeline/TimelineAssetViewer.svelte +++ b/web/src/lib/components/timeline/TimelineAssetViewer.svelte @@ -2,7 +2,7 @@ import type { Action } from '$lib/components/asset-viewer/actions/action'; import { AssetAction } from '$lib/constants'; import { authManager } from '$lib/managers/auth-manager.svelte'; - import { TimelineManager } from '$lib/managers/timeline-manager/timeline-manager.svelte'; + import { TimelineManager } from '$lib/managers/timeline-manager/TimelineManager.svelte'; import { assetViewingStore } from '$lib/stores/asset-viewing.store'; import { updateStackedAssetInTimeline, updateUnstackedAssetInTimeline } from '$lib/utils/actions'; import { navigate } from '$lib/utils/navigation'; diff --git a/web/src/lib/components/timeline/TimelineDateGroup.svelte b/web/src/lib/components/timeline/TimelineDateGroup.svelte index cd0dc9a212..e11b6fe297 100644 --- a/web/src/lib/components/timeline/TimelineDateGroup.svelte +++ b/web/src/lib/components/timeline/TimelineDateGroup.svelte @@ -1,19 +1,17 @@ -{#each filterIntersecting(monthGroup.dayGroups) as dayGroup, groupIndex (dayGroup.day)} - {@const absoluteWidth = dayGroup.left} +{#each filterIntersecting(monthGroup.days) as day, groupIndex (day.day)} + {@const absoluteWidth = day.left}
{ isMouseOverGroup = true; - assetMouseEventHandler(dayGroup.groupTitle, null); + assetMouseEventHandler(day.dayTitle, null); }} onmouseleave={() => { isMouseOverGroup = false; - assetMouseEventHandler(dayGroup.groupTitle, null); + assetMouseEventHandler(day.dayTitle, null); }} >
{#if !singleSelect}
handleSelectGroup(dayGroup.groupTitle, assetsSnapshot(dayGroup.getAssets()))} - onkeydown={() => handleSelectGroup(dayGroup.groupTitle, assetsSnapshot(dayGroup.getAssets()))} + class:w-8={(hoveredDayGroup === day.dayTitle && isMouseOverGroup) || + assetInteraction.selectedGroup.has(day.dayTitle)} + onclick={() => handleSelectGroup(day.dayTitle, assetsSnapshot(day.getAssets()))} + onkeydown={() => handleSelectGroup(day.dayTitle, assetsSnapshot(day.getAssets()))} > - {#if assetInteraction.selectedGroup.has(dayGroup.groupTitle)} + {#if assetInteraction.selectedGroup.has(day.dayTitle)} {:else} @@ -177,19 +175,14 @@
{/if} - - {dayGroup.groupTitle} + + {day.dayTitle}
-
- {#each filterIntersecting(dayGroup.viewerAssets) as viewerAsset (viewerAsset.id)} +
+ {#each filterIntersecting(day.viewerAssets) as viewerAsset (viewerAsset.id)} {@const position = viewerAsset.position!} {@const asset = viewerAsset.asset!} @@ -212,17 +205,16 @@ {groupIndex} onClick={(asset) => { if (typeof onThumbnailClick === 'function') { - onThumbnailClick(asset, timelineManager, dayGroup, _onClick); + onThumbnailClick(asset, timelineManager, day, _onClick); } else { - _onClick(timelineManager, dayGroup.getAssets(), dayGroup.groupTitle, asset); + _onClick(timelineManager, day.getAssets(), day.dayTitle, asset); } }} - onSelect={(asset) => assetSelectHandler(timelineManager, asset, dayGroup.getAssets(), dayGroup.groupTitle)} - onMouseEvent={() => assetMouseEventHandler(dayGroup.groupTitle, assetSnapshot(asset))} - selected={assetInteraction.hasSelectedAsset(asset.id) || - dayGroup.monthGroup.timelineManager.albumAssets.has(asset.id)} + onSelect={(asset) => assetSelectHandler(timelineManager, asset, day.getAssets(), day.dayTitle)} + onMouseEvent={() => assetMouseEventHandler(day.dayTitle, assetSnapshot(asset))} + selected={assetInteraction.hasSelectedAsset(asset.id) || day.month.scrollManager.albumAssets.has(asset.id)} selectionCandidate={assetInteraction.hasSelectionCandidate(asset.id)} - disabled={dayGroup.monthGroup.timelineManager.albumAssets.has(asset.id)} + disabled={day.month.scrollManager.albumAssets.has(asset.id)} thumbnailWidth={position.width} thumbnailHeight={position.height} /> diff --git a/web/src/lib/components/timeline/actions/SelectAllAction.svelte b/web/src/lib/components/timeline/actions/SelectAllAction.svelte index 883ec1d54e..7cd64fccda 100644 --- a/web/src/lib/components/timeline/actions/SelectAllAction.svelte +++ b/web/src/lib/components/timeline/actions/SelectAllAction.svelte @@ -1,5 +1,5 @@