Skip to content

Commit b0af9be

Browse files
authored
fix(web): person asset grid (#12370)
1 parent d6729c5 commit b0af9be

File tree

1 file changed

+38
-46
lines changed
  • web/src/routes/(user)/people/[personId]/[[photos=photos]]/[[assetId=id]]

1 file changed

+38
-46
lines changed

Diff for: web/src/routes/(user)/people/[personId]/[[photos=photos]]/[[assetId=id]]/+page.svelte

+38-46
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,20 @@
7676
isArchived: false,
7777
personId: data.person.id,
7878
});
79+
80+
$: person = data.person;
81+
$: thumbnailData = getPeopleThumbnailUrl(person);
82+
$: if (person) {
83+
handlePromiseError(updateAssetCount());
84+
handlePromiseError(assetStore.updateOptions({ personId: person.id }));
85+
}
86+
7987
const assetInteractionStore = createAssetInteractionStore();
8088
const { selectedAssets, isMultiSelectState } = assetInteractionStore;
8189
8290
let viewMode: ViewMode = ViewMode.VIEW_ASSETS;
8391
let isEditingName = false;
8492
let previousRoute: string = AppRoute.EXPLORE;
85-
let previousPersonId: string = data.person.id;
8693
let people: PersonResponseDto[] = [];
8794
let personMerge1: PersonResponseDto;
8895
let personMerge2: PersonResponseDto;
@@ -91,9 +98,6 @@
9198
let refreshAssetGrid = false;
9299
93100
let personName = '';
94-
$: thumbnailData = getPeopleThumbnailUrl(data.person);
95-
96-
let name: string = data.person.name;
97101
let suggestedPeople: PersonResponseDto[] = [];
98102
99103
/**
@@ -120,8 +124,8 @@
120124
}
121125
122126
return websocketEvents.on('on_person_thumbnail', (personId: string) => {
123-
if (data.person.id === personId) {
124-
thumbnailData = getPeopleThumbnailUrl(data.person, Date.now().toString());
127+
if (person.id === personId) {
128+
thumbnailData = getPeopleThumbnailUrl(person, Date.now().toString());
125129
}
126130
});
127131
});
@@ -141,7 +145,7 @@
141145
142146
const updateAssetCount = async () => {
143147
try {
144-
const { assets } = await getPersonStatistics({ id: data.person.id });
148+
const { assets } = await getPersonStatistics({ id: person.id });
145149
numberOfAssets = assets;
146150
} catch (error) {
147151
handleError(error, "Can't update the asset count");
@@ -150,20 +154,9 @@
150154
151155
afterNavigate(({ from }) => {
152156
// Prevent setting previousRoute to the current page.
153-
if (from && from.route.id !== $page.route.id) {
157+
if (from?.url && from.route.id !== $page.route.id) {
154158
previousRoute = from.url.href;
155159
}
156-
if (previousPersonId !== data.person.id) {
157-
handlePromiseError(updateAssetCount());
158-
assetStore.destroy();
159-
assetStore = new AssetStore({
160-
isArchived: false,
161-
personId: data.person.id,
162-
});
163-
previousPersonId = data.person.id;
164-
name = data.person.name;
165-
refreshAssetGrid = !refreshAssetGrid;
166-
}
167160
});
168161
169162
const handleUnmerge = () => {
@@ -179,8 +172,8 @@
179172
const toggleHidePerson = async () => {
180173
try {
181174
await updatePerson({
182-
id: data.person.id,
183-
personUpdateDto: { isHidden: !data.person.isHidden },
175+
id: person.id,
176+
personUpdateDto: { isHidden: !person.isHidden },
184177
});
185178
186179
notificationController.show({
@@ -208,7 +201,7 @@
208201
return;
209202
}
210203
try {
211-
await updatePerson({ id: data.person.id, personUpdateDto: { featureFaceAssetId: asset.id } });
204+
await updatePerson({ id: person.id, personUpdateDto: { featureFaceAssetId: asset.id } });
212205
notificationController.show({ message: $t('feature_photo_updated'), type: NotificationType.Info });
213206
} catch (error) {
214207
handleError(error, $t('errors.unable_to_set_feature_photo'));
@@ -233,7 +226,7 @@
233226
type: NotificationType.Info,
234227
});
235228
people = people.filter((person: PersonResponseDto) => person.id !== personToMerge.id);
236-
if (personToBeMergedIn.name != personName && data.person.id === personToBeMergedIn.id) {
229+
if (personToBeMergedIn.name != personName && person.id === personToBeMergedIn.id) {
237230
await updateAssetCount();
238231
refreshAssetGrid = !refreshAssetGrid;
239232
return;
@@ -244,22 +237,22 @@
244237
}
245238
};
246239
247-
const handleSuggestPeople = (person: PersonResponseDto) => {
240+
const handleSuggestPeople = (person2: PersonResponseDto) => {
248241
isEditingName = false;
249242
potentialMergePeople = [];
250243
personName = person.name;
251-
personMerge1 = data.person;
252-
personMerge2 = person;
244+
personMerge1 = person;
245+
personMerge2 = person2;
253246
viewMode = ViewMode.SUGGEST_MERGE;
254247
};
255248
256249
const changeName = async () => {
257250
viewMode = ViewMode.VIEW_ASSETS;
258-
data.person.name = personName;
251+
person.name = personName;
259252
try {
260253
isEditingName = false;
261254
262-
await updatePerson({ id: data.person.id, personUpdateDto: { name: personName } });
255+
await updatePerson({ id: person.id, personUpdateDto: { name: personName } });
263256
264257
notificationController.show({
265258
message: $t('change_name_successfully'),
@@ -283,7 +276,7 @@
283276
potentialMergePeople = [];
284277
personName = name;
285278
286-
if (data.person.name === personName) {
279+
if (person.name === personName) {
287280
return;
288281
}
289282
if (name === '') {
@@ -294,12 +287,11 @@
294287
const result = await searchPerson({ name: personName, withHidden: true });
295288
296289
const existingPerson = result.find(
297-
(person: PersonResponseDto) =>
298-
person.name.toLowerCase() === personName.toLowerCase() && person.id !== data.person.id && person.name,
290+
({ name, id }: PersonResponseDto) => name.toLowerCase() === personName.toLowerCase() && id !== person.id && name,
299291
);
300292
if (existingPerson) {
301293
personMerge2 = existingPerson;
302-
personMerge1 = data.person;
294+
personMerge1 = person;
303295
potentialMergePeople = result
304296
.filter(
305297
(person: PersonResponseDto) =>
@@ -318,10 +310,10 @@
318310
const handleSetBirthDate = async (birthDate: string) => {
319311
try {
320312
viewMode = ViewMode.VIEW_ASSETS;
321-
data.person.birthDate = birthDate;
313+
person.birthDate = birthDate;
322314
323315
const updatedPerson = await updatePerson({
324-
id: data.person.id,
316+
id: person.id,
325317
personUpdateDto: { birthDate: birthDate.length > 0 ? birthDate : null },
326318
});
327319
@@ -354,7 +346,7 @@
354346
{#if viewMode === ViewMode.UNASSIGN_ASSETS}
355347
<UnMergeFaceSelector
356348
assetIds={[...$selectedAssets].map((a) => a.id)}
357-
personAssets={data.person}
349+
personAssets={person}
358350
on:close={() => (viewMode = ViewMode.VIEW_ASSETS)}
359351
on:confirm={handleUnmerge}
360352
/>
@@ -373,14 +365,14 @@
373365

374366
{#if viewMode === ViewMode.BIRTH_DATE}
375367
<SetBirthDateModal
376-
birthDate={data.person.birthDate ?? ''}
368+
birthDate={person.birthDate ?? ''}
377369
on:close={() => (viewMode = ViewMode.VIEW_ASSETS)}
378370
on:updated={(event) => handleSetBirthDate(event.detail)}
379371
/>
380372
{/if}
381373

382374
{#if viewMode === ViewMode.MERGE_PEOPLE}
383-
<MergeFaceSelector person={data.person} on:back={handleGoBack} on:merge={({ detail }) => handleMerge(detail)} />
375+
<MergeFaceSelector {person} on:back={handleGoBack} on:merge={({ detail }) => handleMerge(detail)} />
384376
{/if}
385377

386378
<header>
@@ -394,7 +386,7 @@
394386
</ButtonContextMenu>
395387
<FavoriteAction removeFavorite={isAllFavorite} onFavorite={() => assetStore.triggerUpdate()} />
396388
<ButtonContextMenu icon={mdiDotsVertical} title={$t('add')}>
397-
<DownloadAction menuItem filename="{data.person.name || 'immich'}.zip" />
389+
<DownloadAction menuItem filename="{person.name || 'immich'}.zip" />
398390
<MenuOption
399391
icon={mdiAccountMultipleCheckOutline}
400392
text={$t('fix_incorrect_match')}
@@ -417,8 +409,8 @@
417409
onClick={() => (viewMode = ViewMode.SELECT_PERSON)}
418410
/>
419411
<MenuOption
420-
text={data.person.isHidden ? $t('unhide_person') : $t('hide_person')}
421-
icon={data.person.isHidden ? mdiEyeOutline : mdiEyeOffOutline}
412+
text={person.isHidden ? $t('unhide_person') : $t('hide_person')}
413+
icon={person.isHidden ? mdiEyeOutline : mdiEyeOffOutline}
422414
onClick={() => toggleHidePerson()}
423415
/>
424416
<MenuOption
@@ -445,7 +437,7 @@
445437
</header>
446438

447439
<main class="relative h-screen overflow-hidden bg-immich-bg tall:ml-4 pt-[var(--navbar-height)] dark:bg-immich-dark-bg">
448-
{#key refreshAssetGrid}
440+
{#key person.id}
449441
<AssetGrid
450442
enableRouting={true}
451443
{assetStore}
@@ -468,9 +460,9 @@
468460
<section class="flex w-64 sm:w-96 place-items-center border-black">
469461
{#if isEditingName}
470462
<EditNameInput
471-
person={data.person}
463+
{person}
472464
bind:suggestedPeople
473-
bind:name
465+
name={person.name}
474466
bind:isSearchingPeople
475467
on:change={(event) => handleNameChange(event.detail)}
476468
{thumbnailData}
@@ -487,15 +479,15 @@
487479
circle
488480
shadow
489481
url={thumbnailData}
490-
altText={data.person.name}
482+
altText={person.name}
491483
widthStyle="3.375rem"
492484
heightStyle="3.375rem"
493485
/>
494486
<div
495487
class="flex flex-col justify-center text-left px-4 h-14 text-immich-primary dark:text-immich-dark-primary"
496488
>
497-
{#if data.person.name}
498-
<p class="w-40 sm:w-72 font-medium truncate">{data.person.name}</p>
489+
{#if person.name}
490+
<p class="w-40 sm:w-72 font-medium truncate">{person.name}</p>
499491
<p class="absolute w-fit text-sm text-gray-500 dark:text-immich-gray bottom-0">
500492
{$t('assets_count', { values: { count: numberOfAssets } })}
501493
</p>

0 commit comments

Comments
 (0)