From 702499b97dd57d938ff129a9e7ebee9f7f7bad85 Mon Sep 17 00:00:00 2001 From: Jason Rasmussen Date: Fri, 9 Jan 2026 13:03:57 -0500 Subject: [PATCH] refactor: modals (#25162) --- .../PinCodeChangeForm.svelte | 11 +- .../user-settings-page/PinCodeSettings.svelte | 14 +-- web/src/lib/managers/event-manager.svelte.ts | 2 + web/src/lib/modals/ApiKeyCreateModal.svelte | 13 +- web/src/lib/modals/JobCreateModal.svelte | 46 ++------ .../lib/modals/ObtainiumConfigModal.svelte | 111 ++++++++---------- web/src/lib/modals/PinCodeResetModal.svelte | 87 +++++--------- web/src/lib/services/api-key.service.ts | 11 +- web/src/lib/services/job.service.ts | 16 +++ web/src/lib/services/queue.service.ts | 4 +- web/src/lib/services/user.service.ts | 18 +++ 11 files changed, 144 insertions(+), 189 deletions(-) create mode 100644 web/src/lib/services/job.service.ts create mode 100644 web/src/lib/services/user.service.ts diff --git a/web/src/lib/components/user-settings-page/PinCodeChangeForm.svelte b/web/src/lib/components/user-settings-page/PinCodeChangeForm.svelte index 1aadb7b783..2edb8fa606 100644 --- a/web/src/lib/components/user-settings-page/PinCodeChangeForm.svelte +++ b/web/src/lib/components/user-settings-page/PinCodeChangeForm.svelte @@ -1,8 +1,9 @@ + +
{#if hasPinCode}
- +
{:else}
diff --git a/web/src/lib/managers/event-manager.svelte.ts b/web/src/lib/managers/event-manager.svelte.ts index 9fbe16b68a..7124fc4524 100644 --- a/web/src/lib/managers/event-manager.svelte.ts +++ b/web/src/lib/managers/event-manager.svelte.ts @@ -52,6 +52,8 @@ export type Events = { TagUpdate: [TagResponseDto]; TagDelete: [TreeNode]; + UserPinCodeReset: []; + UserAdminCreate: [UserAdminResponseDto]; UserAdminUpdate: [UserAdminResponseDto]; UserAdminRestore: [UserAdminResponseDto]; diff --git a/web/src/lib/modals/ApiKeyCreateModal.svelte b/web/src/lib/modals/ApiKeyCreateModal.svelte index c5078ca3dc..68216aa1fa 100644 --- a/web/src/lib/modals/ApiKeyCreateModal.svelte +++ b/web/src/lib/modals/ApiKeyCreateModal.svelte @@ -1,8 +1,9 @@ - (confirmed ? handleCreate() : onClose(false))} -> - {#snippet promptSnippet()} -
-
- -
-
- {/snippet} -
+ + + diff --git a/web/src/lib/modals/ObtainiumConfigModal.svelte b/web/src/lib/modals/ObtainiumConfigModal.svelte index bc74379ac8..8ffe3b7a50 100644 --- a/web/src/lib/modals/ObtainiumConfigModal.svelte +++ b/web/src/lib/modals/ObtainiumConfigModal.svelte @@ -1,10 +1,8 @@ -
- - {$t('obtainium_configurator_instructions')} - -
-
- -
+ {$t('obtainium_configurator_instructions')} -
- + + + -
- -
-
+ + + - - - - {#if inputUrl && inputApiKey && archVariant} -
-
-
- - Get it on Obtainium - -
-
- {/if} +
+
+ + + + {#if inputUrl && inputApiKey && archVariant} +
+
+
+ + Get it on Obtainium + +
+
+ {/if} diff --git a/web/src/lib/modals/PinCodeResetModal.svelte b/web/src/lib/modals/PinCodeResetModal.svelte index 1a8ce86e41..024f0c8528 100644 --- a/web/src/lib/modals/PinCodeResetModal.svelte +++ b/web/src/lib/modals/PinCodeResetModal.svelte @@ -1,20 +1,7 @@ - - -
- -
{$t('reset_pin_code_description')}
- {#if passwordLoginEnabled} -
-
- - - - {$t('reset_pin_code_with_password')} - - -
- {/if} -
-
-
- - - {#if passwordLoginEnabled} - - - - - {:else} - - {/if} - -
+{#if featureFlagsManager.value.passwordLogin === false} + + +
{$t('reset_pin_code_description')}
+
+
+ + + {$t('reset_pin_code_with_password')} + +
+
+
+{:else} + + +
{$t('reset_pin_code_description')}
+
+
+{/if} diff --git a/web/src/lib/services/api-key.service.ts b/web/src/lib/services/api-key.service.ts index 4833bafadc..dec333c0bc 100644 --- a/web/src/lib/services/api-key.service.ts +++ b/web/src/lib/services/api-key.service.ts @@ -1,6 +1,5 @@ import { eventManager } from '$lib/managers/event-manager.svelte'; import ApiKeyCreateModal from '$lib/modals/ApiKeyCreateModal.svelte'; -import ApiKeySecretModal from '$lib/modals/ApiKeySecretModal.svelte'; import ApiKeyUpdateModal from '$lib/modals/ApiKeyUpdateModal.svelte'; import { handleError } from '$lib/utils/handle-error'; import { getFormatter } from '$lib/utils/i18n'; @@ -56,14 +55,10 @@ export const handleCreateApiKey = async (dto: ApiKeyCreateDto) => { return; } - const { apiKey, secret } = await createApiKey({ apiKeyCreateDto: dto }); + const response = await createApiKey({ apiKeyCreateDto: dto }); + eventManager.emit('ApiKeyCreate', response.apiKey); - eventManager.emit('ApiKeyCreate', apiKey); - - // no nested modal - void modalManager.show(ApiKeySecretModal, { secret }); - - return true; + return response; } catch (error) { handleError(error, $t('errors.unable_to_create_api_key')); } diff --git a/web/src/lib/services/job.service.ts b/web/src/lib/services/job.service.ts new file mode 100644 index 0000000000..3241afc5b0 --- /dev/null +++ b/web/src/lib/services/job.service.ts @@ -0,0 +1,16 @@ +import { handleError } from '$lib/utils/handle-error'; +import { getFormatter } from '$lib/utils/i18n'; +import { createJob, type JobCreateDto } from '@immich/sdk'; +import { toastManager } from '@immich/ui'; + +export const handleCreateJob = async (dto: JobCreateDto) => { + const $t = await getFormatter(); + + try { + await createJob({ jobCreateDto: dto }); + toastManager.success($t('admin.job_created')); + return true; + } catch (error) { + handleError(error, $t('errors.unable_to_submit_job')); + } +}; diff --git a/web/src/lib/services/queue.service.ts b/web/src/lib/services/queue.service.ts index 8217e73634..d7063c29eb 100644 --- a/web/src/lib/services/queue.service.ts +++ b/web/src/lib/services/queue.service.ts @@ -64,9 +64,7 @@ export const getQueuesActions = ($t: MessageFormatter, queues: QueueResponseDto[ title: $t('admin.create_job'), type: $t('command'), shortcuts: { shift: true, key: 'n' }, - onAction: async () => { - await modalManager.show(JobCreateModal, {}); - }, + onAction: () => modalManager.show(JobCreateModal, {}), }; const ManageConcurrency: ActionItem = { diff --git a/web/src/lib/services/user.service.ts b/web/src/lib/services/user.service.ts new file mode 100644 index 0000000000..7d137449ae --- /dev/null +++ b/web/src/lib/services/user.service.ts @@ -0,0 +1,18 @@ +import { eventManager } from '$lib/managers/event-manager.svelte'; +import { handleError } from '$lib/utils/handle-error'; +import { getFormatter } from '$lib/utils/i18n'; +import { resetPinCode, type PinCodeResetDto } from '@immich/sdk'; +import { toastManager } from '@immich/ui'; + +export const handleResetPinCode = async (dto: PinCodeResetDto) => { + const $t = await getFormatter(); + + try { + await resetPinCode({ pinCodeResetDto: dto }); + toastManager.success($t('pin_code_reset_successfully')); + eventManager.emit('UserPinCodeReset'); + return true; + } catch (error) { + handleError(error, $t('errors.failed_to_reset_pin_code')); + } +};