diff --git a/web/src/lib/components/album-page/album-viewer.svelte b/web/src/lib/components/album-page/album-viewer.svelte index ea9e7e3dd1..9c6da9fda9 100644 --- a/web/src/lib/components/album-page/album-viewer.svelte +++ b/web/src/lib/components/album-page/album-viewer.svelte @@ -1,7 +1,6 @@ diff --git a/web/src/lib/components/asset-viewer/asset-viewer.svelte b/web/src/lib/components/asset-viewer/asset-viewer.svelte index 91461d574d..067d405818 100644 --- a/web/src/lib/components/asset-viewer/asset-viewer.svelte +++ b/web/src/lib/components/asset-viewer/asset-viewer.svelte @@ -5,7 +5,6 @@ import NextAssetAction from '$lib/components/asset-viewer/actions/next-asset-action.svelte'; import PreviousAssetAction from '$lib/components/asset-viewer/actions/previous-asset-action.svelte'; import { AssetAction, ProjectionType } from '$lib/constants'; - import { updateNumberOfComments } from '$lib/stores/activity.store'; import { closeEditorCofirm } from '$lib/stores/asset-editor.store'; import { assetViewingStore } from '$lib/stores/asset-viewing.store'; import { isShowDetail } from '$lib/stores/preferences.store'; @@ -47,6 +46,7 @@ import PhotoViewer from './photo-viewer.svelte'; import SlideshowBar from './slideshow-bar.svelte'; import VideoViewer from './video-wrapper-viewer.svelte'; + import { activityManager } from '$lib/managers/activity.manager.svelte'; type HasAsset = boolean; @@ -137,12 +137,12 @@ const handleAddComment = () => { numberOfComments++; - updateNumberOfComments(1); + activityManager.updateNumberOfComments(1); }; const handleRemoveComment = () => { numberOfComments--; - updateNumberOfComments(-1); + activityManager.updateNumberOfComments(-1); }; const handleFavorite = async () => { diff --git a/web/src/lib/components/asset-viewer/detail-panel.svelte b/web/src/lib/components/asset-viewer/detail-panel.svelte index b96a4660ee..d5ac5ecb85 100644 --- a/web/src/lib/components/asset-viewer/detail-panel.svelte +++ b/web/src/lib/components/asset-viewer/detail-panel.svelte @@ -46,7 +46,7 @@ import AlbumListItemDetails from './album-list-item-details.svelte'; import Portal from '$lib/components/shared-components/portal/portal.svelte'; import { getMetadataSearchQuery } from '$lib/utils/metadata-search'; - import { isFaceEditMode } from '$lib/stores/face-edit.svelte'; + import { faceManager } from '$lib/managers/face.manager.svelte'; interface Props { asset: AssetResponseDto; @@ -207,7 +207,7 @@ padding="1" size="20" buttonSize="32" - onclick={() => (isFaceEditMode.value = !isFaceEditMode.value)} + onclick={() => (faceManager.isEditMode = !faceManager.isEditMode)} /> {#if people.length > 0 || unassignedFaces.length > 0} diff --git a/web/src/lib/components/asset-viewer/download-panel.svelte b/web/src/lib/components/asset-viewer/download-panel.svelte index 80a14a5ac3..210d2c9807 100644 --- a/web/src/lib/components/asset-viewer/download-panel.svelte +++ b/web/src/lib/components/asset-viewer/download-panel.svelte @@ -1,5 +1,5 @@ -{#if downloadStore.isDownloading} +{#if downloadManager.isDownloading}

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

- {#each Object.keys(downloadStore.assets) as downloadKey (downloadKey)} - {@const download = downloadStore.assets[downloadKey]} + {#each Object.keys(downloadManager.assets) as downloadKey (downloadKey)} + {@const download = downloadManager.assets[downloadKey]}
diff --git a/web/src/lib/components/asset-viewer/face-editor/face-editor.svelte b/web/src/lib/components/asset-viewer/face-editor/face-editor.svelte index c50c21bef8..4ab28a1958 100644 --- a/web/src/lib/components/asset-viewer/face-editor/face-editor.svelte +++ b/web/src/lib/components/asset-viewer/face-editor/face-editor.svelte @@ -2,7 +2,6 @@ import ImageThumbnail from '$lib/components/assets/thumbnail/image-thumbnail.svelte'; import { dialogController } from '$lib/components/shared-components/dialog/dialog'; import { notificationController } from '$lib/components/shared-components/notification/notification'; - import { isFaceEditMode } from '$lib/stores/face-edit.svelte'; import { getPeopleThumbnailUrl } from '$lib/utils'; import { getAllPeople, createFace, type PersonResponseDto } from '@immich/sdk'; import { Button, Input } from '@immich/ui'; @@ -10,6 +9,7 @@ import { onMount } from 'svelte'; import { assetViewingStore } from '$lib/stores/asset-viewing.store'; import { handleError } from '$lib/utils/handle-error'; + import { faceManager } from '$lib/managers/face.manager.svelte'; interface Props { htmlElement: HTMLImageElement | HTMLVideoElement; @@ -140,7 +140,7 @@ }; const cancel = () => { - isFaceEditMode.value = false; + faceManager.isEditMode = false; }; const getPeople = async () => { @@ -303,7 +303,7 @@ } catch (error) { handleError(error, 'Error tagging face'); } finally { - isFaceEditMode.value = false; + faceManager.isEditMode = false; } }; diff --git a/web/src/lib/components/asset-viewer/photo-viewer.svelte b/web/src/lib/components/asset-viewer/photo-viewer.svelte index d3a9da3633..eb159a96fc 100644 --- a/web/src/lib/components/asset-viewer/photo-viewer.svelte +++ b/web/src/lib/components/asset-viewer/photo-viewer.svelte @@ -20,7 +20,7 @@ import { handleError } from '$lib/utils/handle-error'; import FaceEditor from '$lib/components/asset-viewer/face-editor/face-editor.svelte'; import { photoViewerImgElement } from '$lib/stores/assets-store.svelte'; - import { isFaceEditMode } from '$lib/stores/face-edit.svelte'; + import { faceManager } from '$lib/managers/face.manager.svelte'; interface Props { asset: AssetResponseDto; @@ -109,7 +109,7 @@ }; $effect(() => { - if (isFaceEditMode.value && $photoZoomState.currentZoom > 1) { + if (faceManager.isEditMode && $photoZoomState.currentZoom > 1) { zoomToggle(); } }); @@ -235,7 +235,7 @@ {/each}
- {#if isFaceEditMode.value} + {#if faceManager.isEditMode} {/if} {/if} diff --git a/web/src/lib/components/asset-viewer/video-native-viewer.svelte b/web/src/lib/components/asset-viewer/video-native-viewer.svelte index 07760b3c6b..6fba2fa2ca 100644 --- a/web/src/lib/components/asset-viewer/video-native-viewer.svelte +++ b/web/src/lib/components/asset-viewer/video-native-viewer.svelte @@ -9,8 +9,8 @@ import type { SwipeCustomEvent } from 'svelte-gestures'; import { fade } from 'svelte/transition'; import { t } from 'svelte-i18n'; - import { isFaceEditMode } from '$lib/stores/face-edit.svelte'; import FaceEditor from '$lib/components/asset-viewer/face-editor/face-editor.svelte'; + import { faceManager } from '$lib/managers/face.manager.svelte'; interface Props { assetId: string; @@ -94,7 +94,7 @@ let containerHeight = $state(0); $effect(() => { - if (isFaceEditMode.value) { + if (faceManager.isEditMode) { videoPlayer?.pause(); } }); @@ -141,7 +141,7 @@
{/if} - {#if isFaceEditMode.value} + {#if faceManager.isEditMode} {/if}
diff --git a/web/src/lib/components/share-page/individual-shared-viewer.svelte b/web/src/lib/components/share-page/individual-shared-viewer.svelte index 36ccf3f7dc..049ad920ad 100644 --- a/web/src/lib/components/share-page/individual-shared-viewer.svelte +++ b/web/src/lib/components/share-page/individual-shared-viewer.svelte @@ -2,7 +2,6 @@ import { goto } from '$app/navigation'; import type { Action } from '$lib/components/asset-viewer/actions/action'; import { AppRoute, AssetAction } from '$lib/constants'; - import { dragAndDropFilesStore } from '$lib/stores/drag-and-drop-files.store'; import { getKey, handlePromiseError } from '$lib/utils'; import { downloadArchive } from '$lib/utils/asset-utils'; import { fileUploadHandler, openFileUploadDialog } from '$lib/utils/file-uploader'; @@ -22,6 +21,7 @@ import type { Viewport } from '$lib/stores/assets-store.svelte'; import { t } from 'svelte-i18n'; import { AssetInteraction } from '$lib/stores/asset-interaction.svelte'; + import { dragAndDropManager } from '$lib/managers/drag-and-drop.manager.svelte'; interface Props { sharedLink: SharedLinkResponseDto; @@ -35,10 +35,10 @@ let assets = $derived(sharedLink.assets); - dragAndDropFilesStore.subscribe((value) => { - if (value.isDragging && value.files.length > 0) { - handlePromiseError(handleUploadAssets(value.files)); - dragAndDropFilesStore.set({ isDragging: false, files: [] }); + $effect(() => { + if (dragAndDropManager.isDragging && dragAndDropManager.files.length > 0) { + handlePromiseError(handleUploadAssets(dragAndDropManager.files)); + dragAndDropManager.reset(); } }); diff --git a/web/src/lib/components/shared-components/context-menu/button-context-menu.svelte b/web/src/lib/components/shared-components/context-menu/button-context-menu.svelte index a3e12e4f12..4777b73509 100644 --- a/web/src/lib/components/shared-components/context-menu/button-context-menu.svelte +++ b/web/src/lib/components/shared-components/context-menu/button-context-menu.svelte @@ -6,7 +6,7 @@ type Padding, } from '$lib/components/elements/buttons/circle-icon-button.svelte'; import ContextMenu from '$lib/components/shared-components/context-menu/context-menu.svelte'; - import { optionClickCallbackStore, selectedIdStore } from '$lib/stores/context-menu.store'; + import { contextMenuManager } from '$lib/managers/context-menu.manager.svelte'; import { getContextMenuPositionFromBoundingRect, getContextMenuPositionFromEvent, @@ -97,7 +97,7 @@ } focusButton(); isOpen = false; - $selectedIdStore = undefined; + contextMenuManager.selectedId = undefined; }; const handleOptionClick = () => { @@ -124,7 +124,7 @@ $effect(() => { if (isOpen) { - $optionClickCallbackStore = handleOptionClick; + contextMenuManager.optionClickCallback = handleOptionClick; } }); @@ -139,8 +139,8 @@ isOpen, onEscape, openDropdown, - selectedId: $selectedIdStore, - selectionChanged: (id) => ($selectedIdStore = id), + selectedId: contextMenuManager.selectedId, + selectionChanged: (id) => (contextMenuManager.selectedId = id), }} onresize={onResize} {...restProps} @@ -178,7 +178,7 @@ import Icon from '$lib/components/elements/icon.svelte'; import { generateId } from '$lib/utils/generate-id'; - import { optionClickCallbackStore, selectedIdStore } from '$lib/stores/context-menu.store'; import type { Shortcut } from '$lib/actions/shortcut'; import { shortcutLabel as computeShortcutLabel, shortcut as bindShortcut } from '$lib/actions/shortcut'; + import { contextMenuManager } from '$lib/managers/context-menu.manager.svelte'; interface Props { text: string; @@ -29,10 +29,10 @@ let id: string = generateId(); - let isActive = $derived($selectedIdStore === id); + let isActive = $derived(contextMenuManager.selectedId === id); const handleClick = () => { - $optionClickCallbackStore?.(); + contextMenuManager.optionClickCallback?.(); onClick(); }; @@ -51,8 +51,8 @@
  • ($selectedIdStore = id)} - onmouseleave={() => ($selectedIdStore = undefined)} + onmouseover={() => (contextMenuManager.selectedId = id)} + onmouseleave={() => (contextMenuManager.selectedId = undefined)} class="w-full p-4 text-left text-sm font-medium {textColor} focus:outline-none focus:ring-2 focus:ring-inset cursor-pointer border-gray-200 flex gap-2 items-center {isActive ? activeColor : 'bg-slate-100'}" diff --git a/web/src/lib/components/shared-components/context-menu/right-click-context-menu.svelte b/web/src/lib/components/shared-components/context-menu/right-click-context-menu.svelte index 9b9e68b6c5..08e00c714a 100644 --- a/web/src/lib/components/shared-components/context-menu/right-click-context-menu.svelte +++ b/web/src/lib/components/shared-components/context-menu/right-click-context-menu.svelte @@ -4,7 +4,7 @@ import { shortcuts } from '$lib/actions/shortcut'; import { generateId } from '$lib/utils/generate-id'; import { contextMenuNavigation } from '$lib/actions/context-menu-navigation'; - import { optionClickCallbackStore, selectedIdStore } from '$lib/stores/context-menu.store'; + import { contextMenuManager } from '$lib/managers/context-menu.manager.svelte'; interface Props { title: string; @@ -60,7 +60,7 @@ if (isOpen && menuContainer) { triggerElement = document.activeElement as HTMLElement; menuContainer.focus(); - $optionClickCallbackStore = closeContextMenu; + contextMenuManager.optionClickCallback = closeContextMenu; } }); @@ -77,8 +77,8 @@ closeDropdown: closeContextMenu, container: menuContainer, isOpen, - selectedId: $selectedIdStore, - selectionChanged: (id) => ($selectedIdStore = id), + selectedId: contextMenuManager.selectedId, + selectionChanged: (id) => (contextMenuManager.selectedId = id), }} use:shortcuts={[ { @@ -96,7 +96,7 @@ {direction} {x} {y} - ariaActiveDescendant={$selectedIdStore} + ariaActiveDescendant={contextMenuManager.selectedId} ariaLabel={title} bind:menuElement={menuContainer} id={menuId} diff --git a/web/src/lib/components/shared-components/drag-and-drop-upload-overlay.svelte b/web/src/lib/components/shared-components/drag-and-drop-upload-overlay.svelte index 2ed5d684a4..81aafad4d0 100644 --- a/web/src/lib/components/shared-components/drag-and-drop-upload-overlay.svelte +++ b/web/src/lib/components/shared-components/drag-and-drop-upload-overlay.svelte @@ -1,7 +1,7 @@ diff --git a/web/src/routes/admin/repair/+page.svelte b/web/src/routes/admin/repair/+page.svelte index 635a140452..384853d8da 100644 --- a/web/src/routes/admin/repair/+page.svelte +++ b/web/src/routes/admin/repair/+page.svelte @@ -7,7 +7,6 @@ NotificationType, notificationController, } from '$lib/components/shared-components/notification/notification'; - import { downloadManager } from '$lib/stores/download-store.svelte'; import { locale } from '$lib/stores/preferences.store'; import { copyToClipboard } from '$lib/utils'; import { downloadBlob } from '$lib/utils/asset-utils'; @@ -17,6 +16,7 @@ import { mdiCheckAll, mdiContentCopy, mdiDownload, mdiRefresh, mdiWrench } from '@mdi/js'; import { t } from 'svelte-i18n'; import type { PageData } from './$types'; + import { downloadManager } from '$lib/managers/download.manager.svelte'; interface Props { data: PageData; diff --git a/web/src/routes/admin/system-settings/+page.svelte b/web/src/routes/admin/system-settings/+page.svelte index 6512461ee9..769a585434 100644 --- a/web/src/routes/admin/system-settings/+page.svelte +++ b/web/src/routes/admin/system-settings/+page.svelte @@ -22,7 +22,6 @@ import SettingAccordionState from '$lib/components/shared-components/settings/setting-accordion-state.svelte'; import SettingAccordion from '$lib/components/shared-components/settings/setting-accordion.svelte'; import { QueryParameter } from '$lib/constants'; - import { downloadManager } from '$lib/stores/download-store.svelte'; import { featureFlags } from '$lib/stores/server-config.store'; import { copyToClipboard } from '$lib/utils'; import { downloadBlob } from '$lib/utils/asset-utils'; @@ -53,6 +52,7 @@ import type { Component } from 'svelte'; import type { SettingsComponentProps } from '$lib/components/admin-page/settings/admin-settings'; import SearchBar from '$lib/components/elements/search-bar.svelte'; + import { downloadManager } from '$lib/managers/download.manager.svelte'; interface Props { data: PageData; diff --git a/web/src/routes/auth/change-password/+page.svelte b/web/src/routes/auth/change-password/+page.svelte index 16a6ffc677..aacf9a2c35 100644 --- a/web/src/routes/auth/change-password/+page.svelte +++ b/web/src/routes/auth/change-password/+page.svelte @@ -1,6 +1,6 @@