Skip to content

Commit 7757894

Browse files
committed
more refactor
1 parent 76ec9e3 commit 7757894

File tree

2 files changed

+44
-23
lines changed

2 files changed

+44
-23
lines changed

web/src/lib/components/workflows/WorkflowPickerField.svelte

Lines changed: 10 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22
import WorkflowPickerItemCard from '$lib/components/workflows/WorkflowPickerItemCard.svelte';
33
import AlbumPickerModal from '$lib/modals/AlbumPickerModal.svelte';
44
import PeoplePickerModal from '$lib/modals/PeoplePickerModal.svelte';
5+
import { fetchPickerMetadata, type PickerMetadata } from '$lib/services/workflow.service';
56
import type { ComponentConfig } from '$lib/utils/workflow';
6-
import { getAlbumInfo, getPerson, type AlbumResponseDto, type PersonResponseDto } from '@immich/sdk';
7+
import type { AlbumResponseDto, PersonResponseDto } from '@immich/sdk';
78
import { Button, Field, modalManager } from '@immich/ui';
89
import { mdiPlus } from '@mdi/js';
910
import { t } from 'svelte-i18n';
@@ -22,42 +23,28 @@
2223
const isAlbum = $derived(subType === 'album-picker');
2324
const multiple = $derived(component.type === 'multiselect' || Array.isArray(value));
2425
25-
let pickerMetadata = $state<AlbumResponseDto | PersonResponseDto | AlbumResponseDto[] | PersonResponseDto[]>();
26+
let pickerMetadata = $state<PickerMetadata | undefined>();
2627
2728
$effect(() => {
2829
if (!value) {
2930
pickerMetadata = undefined;
3031
return;
3132
}
3233
33-
void fetchMetadata();
34-
});
35-
36-
const fetchMetadata = async () => {
37-
if (!value || pickerMetadata) {
38-
return;
34+
if (!pickerMetadata) {
35+
void loadMetadata();
3936
}
37+
});
4038
41-
try {
42-
if (Array.isArray(value) && value.length > 0) {
43-
// Multiple selection
44-
pickerMetadata = await (isAlbum
45-
? Promise.all(value.map((id) => getAlbumInfo({ id })))
46-
: Promise.all(value.map((id) => getPerson({ id }))));
47-
} else if (typeof value === 'string' && value) {
48-
// Single selection
49-
pickerMetadata = await (isAlbum ? getAlbumInfo({ id: value }) : getPerson({ id: value }));
50-
}
51-
} catch (error) {
52-
console.error(`Failed to fetch metadata for ${configKey}:`, error);
53-
}
39+
const loadMetadata = async () => {
40+
pickerMetadata = await fetchPickerMetadata(value, subType);
5441
};
5542
5643
const handlePicker = async () => {
5744
if (isAlbum) {
5845
const albums = await modalManager.show(AlbumPickerModal, { shared: false });
5946
if (albums && albums.length > 0) {
60-
const newValue = multiple ? albums.map((a) => a.id) : albums[0].id;
47+
const newValue = multiple ? albums.map((album) => album.id) : albums[0].id;
6148
onchange(newValue);
6249
pickerMetadata = multiple ? albums : albums[0];
6350
}
@@ -66,7 +53,7 @@
6653
const excludedIds = multiple ? currentIds : [];
6754
const people = await modalManager.show(PeoplePickerModal, { multiple, excludedIds });
6855
if (people && people.length > 0) {
69-
const newValue = multiple ? people.map((p) => p.id) : people[0].id;
56+
const newValue = multiple ? people.map((person) => person.id) : people[0].id;
7057
onchange(newValue);
7158
pickerMetadata = multiple ? people : people[0];
7259
}

web/src/lib/services/workflow.service.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,12 @@ import { getFormatter } from '$lib/utils/i18n';
66
import {
77
createWorkflow,
88
deleteWorkflow,
9+
getAlbumInfo,
10+
getPerson,
911
PluginTriggerType,
1012
updateWorkflow,
13+
type AlbumResponseDto,
14+
type PersonResponseDto,
1115
type PluginActionResponseDto,
1216
type PluginContextType,
1317
type PluginFilterResponseDto,
@@ -21,6 +25,9 @@ import { modalManager, toastManager, type ActionItem } from '@immich/ui';
2125
import { mdiCodeJson, mdiDelete, mdiPause, mdiPencil, mdiPlay } from '@mdi/js';
2226
import type { MessageFormatter } from 'svelte-i18n';
2327

28+
export type PickerSubType = 'album-picker' | 'people-picker';
29+
export type PickerMetadata = AlbumResponseDto | PersonResponseDto | AlbumResponseDto[] | PersonResponseDto[];
30+
2431
export interface WorkflowPayload {
2532
name: string;
2633
description: string;
@@ -412,3 +419,30 @@ export const handleDeleteWorkflow = async (workflow: WorkflowResponseDto): Promi
412419
export const handleNavigateToWorkflow = async (workflow: WorkflowResponseDto): Promise<void> => {
413420
await goto(`${AppRoute.WORKFLOWS}/${workflow.id}`);
414421
};
422+
423+
export const fetchPickerMetadata = async (
424+
value: string | string[] | undefined,
425+
subType: PickerSubType,
426+
): Promise<PickerMetadata | undefined> => {
427+
if (!value) {
428+
return undefined;
429+
}
430+
431+
const isAlbum = subType === 'album-picker';
432+
433+
try {
434+
if (Array.isArray(value) && value.length > 0) {
435+
// Multiple selection
436+
return isAlbum
437+
? await Promise.all(value.map((id) => getAlbumInfo({ id })))
438+
: await Promise.all(value.map((id) => getPerson({ id })));
439+
} else if (typeof value === 'string' && value) {
440+
// Single selection
441+
return isAlbum ? await getAlbumInfo({ id: value }) : await getPerson({ id: value });
442+
}
443+
} catch (error) {
444+
console.error(`Failed to fetch picker metadata:`, error);
445+
}
446+
447+
return undefined;
448+
};

0 commit comments

Comments
 (0)