-
- {$t('obtainium_configurator_instructions')}
-
-
-
- {#if inputUrl && inputApiKey && archVariant}
-
-
-
-
-
-
-
-
- {/if}
+
+
+
+
+
+ {#if inputUrl && inputApiKey && archVariant}
+
+
+
+
+
+
+
+
+ {/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 @@
-
-
-
-
-
-
- {#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'));
+ }
+};