diff --git a/web/src/lib/components/shared-components/search-bar/search-bar.svelte b/web/src/lib/components/shared-components/search-bar/search-bar.svelte index 262c10adfd..9f36431f19 100644 --- a/web/src/lib/components/shared-components/search-bar/search-bar.svelte +++ b/web/src/lib/components/shared-components/search-bar/search-bar.svelte @@ -10,11 +10,11 @@ import { generateId } from '$lib/utils/generate-id'; import { getMetadataSearchQuery } from '$lib/utils/metadata-search'; import type { MetadataSearchDto, SmartSearchDto } from '@immich/sdk'; + import { IconButton } from '@immich/ui'; import { mdiClose, mdiMagnify, mdiTune } from '@mdi/js'; import { onDestroy, tick } from 'svelte'; import { t } from 'svelte-i18n'; import SearchHistoryBox from './search-history-box.svelte'; - import { IconButton } from '@immich/ui'; interface Props { value?: string; @@ -93,7 +93,7 @@ } const result = modalManager.open(SearchFilterModal, { searchQuery }); - close = result.close; + close = () => result.close(undefined); closeDropdown(); const searchResult = await result.onClose; diff --git a/web/src/lib/managers/modal-manager.svelte.ts b/web/src/lib/managers/modal-manager.svelte.ts index 7b658d63e5..46363a105b 100644 --- a/web/src/lib/managers/modal-manager.svelte.ts +++ b/web/src/lib/managers/modal-manager.svelte.ts @@ -1,8 +1,13 @@ import ConfirmModal from '$lib/modals/ConfirmModal.svelte'; import { mount, unmount, type Component, type ComponentProps } from 'svelte'; -type OnCloseData = T extends { onClose: (data?: infer R) => void } ? R : never; +type OnCloseData = T extends { onClose: (data?: infer R) => void } + ? R | undefined + : T extends { onClose: (data: infer R) => void } + ? R + : never; type ExtendsEmptyObject = keyof T extends never ? Record : T; +type StripValueIfOptional = T extends undefined ? undefined : T; class ModalManager { show(Component: Component, props: ExtendsEmptyObject>) { @@ -11,12 +16,12 @@ class ModalManager { open>(Component: Component, props: ExtendsEmptyObject>) { let modal: object = {}; - let onClose: () => Promise; + let onClose: (...args: [StripValueIfOptional]) => Promise; - const deferred = new Promise((resolve) => { - onClose = async (data?: K) => { + const deferred = new Promise>((resolve) => { + onClose = async (...args: [StripValueIfOptional]) => { await unmount(modal); - resolve(data); + resolve(args?.[0]); }; modal = mount(Component, { @@ -30,7 +35,7 @@ class ModalManager { return { onClose: deferred, - close: () => onClose(), + close: (...args: [StripValueIfOptional]) => onClose(args[0]), }; } diff --git a/web/src/lib/modals/ConfirmModal.svelte b/web/src/lib/modals/ConfirmModal.svelte index 327d13c355..1a73b58793 100644 --- a/web/src/lib/modals/ConfirmModal.svelte +++ b/web/src/lib/modals/ConfirmModal.svelte @@ -10,7 +10,7 @@ confirmColor?: Color; disabled?: boolean; size?: 'small' | 'medium'; - onClose: (confirmed?: boolean) => void; + onClose: (confirmed: boolean) => void; promptSnippet?: Snippet; }