|
76 | 76 | isArchived: false,
|
77 | 77 | personId: data.person.id,
|
78 | 78 | });
|
| 79 | +
|
| 80 | + $: person = data.person; |
| 81 | + $: thumbnailData = getPeopleThumbnailUrl(person); |
| 82 | + $: if (person) { |
| 83 | + void assetStore.updateOptions({ personId: person.id }); |
| 84 | + } |
| 85 | +
|
79 | 86 | const assetInteractionStore = createAssetInteractionStore();
|
80 | 87 | const { selectedAssets, isMultiSelectState } = assetInteractionStore;
|
81 | 88 |
|
82 | 89 | let viewMode: ViewMode = ViewMode.VIEW_ASSETS;
|
83 | 90 | let isEditingName = false;
|
84 | 91 | let previousRoute: string = AppRoute.EXPLORE;
|
85 |
| - let previousPersonId: string = data.person.id; |
86 | 92 | let people: PersonResponseDto[] = [];
|
87 | 93 | let personMerge1: PersonResponseDto;
|
88 | 94 | let personMerge2: PersonResponseDto;
|
|
91 | 97 | let refreshAssetGrid = false;
|
92 | 98 |
|
93 | 99 | let personName = '';
|
94 |
| - $: thumbnailData = getPeopleThumbnailUrl(data.person); |
95 |
| -
|
96 |
| - let name: string = data.person.name; |
97 | 100 | let suggestedPeople: PersonResponseDto[] = [];
|
98 | 101 |
|
99 | 102 | /**
|
|
120 | 123 | }
|
121 | 124 |
|
122 | 125 | return websocketEvents.on('on_person_thumbnail', (personId: string) => {
|
123 |
| - if (data.person.id === personId) { |
124 |
| - thumbnailData = getPeopleThumbnailUrl(data.person, Date.now().toString()); |
| 126 | + if (person.id === personId) { |
| 127 | + thumbnailData = getPeopleThumbnailUrl(person, Date.now().toString()); |
125 | 128 | }
|
126 | 129 | });
|
127 | 130 | });
|
|
141 | 144 |
|
142 | 145 | const updateAssetCount = async () => {
|
143 | 146 | try {
|
144 |
| - const { assets } = await getPersonStatistics({ id: data.person.id }); |
| 147 | + const { assets } = await getPersonStatistics({ id: person.id }); |
145 | 148 | numberOfAssets = assets;
|
146 | 149 | } catch (error) {
|
147 | 150 | handleError(error, "Can't update the asset count");
|
|
150 | 153 |
|
151 | 154 | afterNavigate(({ from }) => {
|
152 | 155 | // Prevent setting previousRoute to the current page.
|
153 |
| - if (from && from.route.id !== $page.route.id) { |
| 156 | + if (from?.url && from.route.id !== $page.route.id) { |
154 | 157 | previousRoute = from.url.href;
|
155 | 158 | }
|
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 |
| - } |
| 159 | +
|
| 160 | + handlePromiseError(updateAssetCount()); |
167 | 161 | });
|
168 | 162 |
|
169 | 163 | const handleUnmerge = () => {
|
|
179 | 173 | const toggleHidePerson = async () => {
|
180 | 174 | try {
|
181 | 175 | await updatePerson({
|
182 |
| - id: data.person.id, |
183 |
| - personUpdateDto: { isHidden: !data.person.isHidden }, |
| 176 | + id: person.id, |
| 177 | + personUpdateDto: { isHidden: !person.isHidden }, |
184 | 178 | });
|
185 | 179 |
|
186 | 180 | notificationController.show({
|
|
208 | 202 | return;
|
209 | 203 | }
|
210 | 204 | try {
|
211 |
| - await updatePerson({ id: data.person.id, personUpdateDto: { featureFaceAssetId: asset.id } }); |
| 205 | + await updatePerson({ id: person.id, personUpdateDto: { featureFaceAssetId: asset.id } }); |
212 | 206 | notificationController.show({ message: $t('feature_photo_updated'), type: NotificationType.Info });
|
213 | 207 | } catch (error) {
|
214 | 208 | handleError(error, $t('errors.unable_to_set_feature_photo'));
|
|
233 | 227 | type: NotificationType.Info,
|
234 | 228 | });
|
235 | 229 | people = people.filter((person: PersonResponseDto) => person.id !== personToMerge.id);
|
236 |
| - if (personToBeMergedIn.name != personName && data.person.id === personToBeMergedIn.id) { |
| 230 | + if (personToBeMergedIn.name != personName && person.id === personToBeMergedIn.id) { |
237 | 231 | await updateAssetCount();
|
238 | 232 | refreshAssetGrid = !refreshAssetGrid;
|
239 | 233 | return;
|
|
244 | 238 | }
|
245 | 239 | };
|
246 | 240 |
|
247 |
| - const handleSuggestPeople = (person: PersonResponseDto) => { |
| 241 | + const handleSuggestPeople = (person2: PersonResponseDto) => { |
248 | 242 | isEditingName = false;
|
249 | 243 | potentialMergePeople = [];
|
250 | 244 | personName = person.name;
|
251 |
| - personMerge1 = data.person; |
252 |
| - personMerge2 = person; |
| 245 | + personMerge1 = person; |
| 246 | + personMerge2 = person2; |
253 | 247 | viewMode = ViewMode.SUGGEST_MERGE;
|
254 | 248 | };
|
255 | 249 |
|
256 | 250 | const changeName = async () => {
|
257 | 251 | viewMode = ViewMode.VIEW_ASSETS;
|
258 |
| - data.person.name = personName; |
| 252 | + person.name = personName; |
259 | 253 | try {
|
260 | 254 | isEditingName = false;
|
261 | 255 |
|
262 |
| - await updatePerson({ id: data.person.id, personUpdateDto: { name: personName } }); |
| 256 | + await updatePerson({ id: person.id, personUpdateDto: { name: personName } }); |
263 | 257 |
|
264 | 258 | notificationController.show({
|
265 | 259 | message: $t('change_name_successfully'),
|
|
283 | 277 | potentialMergePeople = [];
|
284 | 278 | personName = name;
|
285 | 279 |
|
286 |
| - if (data.person.name === personName) { |
| 280 | + if (person.name === personName) { |
287 | 281 | return;
|
288 | 282 | }
|
289 | 283 | if (name === '') {
|
|
294 | 288 | const result = await searchPerson({ name: personName, withHidden: true });
|
295 | 289 |
|
296 | 290 | const existingPerson = result.find(
|
297 |
| - (person: PersonResponseDto) => |
298 |
| - person.name.toLowerCase() === personName.toLowerCase() && person.id !== data.person.id && person.name, |
| 291 | + ({ name, id }: PersonResponseDto) => name.toLowerCase() === personName.toLowerCase() && id !== person.id && name, |
299 | 292 | );
|
300 | 293 | if (existingPerson) {
|
301 | 294 | personMerge2 = existingPerson;
|
302 |
| - personMerge1 = data.person; |
| 295 | + personMerge1 = person; |
303 | 296 | potentialMergePeople = result
|
304 | 297 | .filter(
|
305 | 298 | (person: PersonResponseDto) =>
|
|
318 | 311 | const handleSetBirthDate = async (birthDate: string) => {
|
319 | 312 | try {
|
320 | 313 | viewMode = ViewMode.VIEW_ASSETS;
|
321 |
| - data.person.birthDate = birthDate; |
| 314 | + person.birthDate = birthDate; |
322 | 315 |
|
323 | 316 | const updatedPerson = await updatePerson({
|
324 |
| - id: data.person.id, |
| 317 | + id: person.id, |
325 | 318 | personUpdateDto: { birthDate: birthDate.length > 0 ? birthDate : null },
|
326 | 319 | });
|
327 | 320 |
|
|
354 | 347 | {#if viewMode === ViewMode.UNASSIGN_ASSETS}
|
355 | 348 | <UnMergeFaceSelector
|
356 | 349 | assetIds={[...$selectedAssets].map((a) => a.id)}
|
357 |
| - personAssets={data.person} |
| 350 | + personAssets={person} |
358 | 351 | on:close={() => (viewMode = ViewMode.VIEW_ASSETS)}
|
359 | 352 | on:confirm={handleUnmerge}
|
360 | 353 | />
|
|
373 | 366 |
|
374 | 367 | {#if viewMode === ViewMode.BIRTH_DATE}
|
375 | 368 | <SetBirthDateModal
|
376 |
| - birthDate={data.person.birthDate ?? ''} |
| 369 | + birthDate={person.birthDate ?? ''} |
377 | 370 | on:close={() => (viewMode = ViewMode.VIEW_ASSETS)}
|
378 | 371 | on:updated={(event) => handleSetBirthDate(event.detail)}
|
379 | 372 | />
|
380 | 373 | {/if}
|
381 | 374 |
|
382 | 375 | {#if viewMode === ViewMode.MERGE_PEOPLE}
|
383 |
| - <MergeFaceSelector person={data.person} on:back={handleGoBack} on:merge={({ detail }) => handleMerge(detail)} /> |
| 376 | + <MergeFaceSelector {person} on:back={handleGoBack} on:merge={({ detail }) => handleMerge(detail)} /> |
384 | 377 | {/if}
|
385 | 378 |
|
386 | 379 | <header>
|
|
394 | 387 | </ButtonContextMenu>
|
395 | 388 | <FavoriteAction removeFavorite={isAllFavorite} onFavorite={() => assetStore.triggerUpdate()} />
|
396 | 389 | <ButtonContextMenu icon={mdiDotsVertical} title={$t('add')}>
|
397 |
| - <DownloadAction menuItem filename="{data.person.name || 'immich'}.zip" /> |
| 390 | + <DownloadAction menuItem filename="{person.name || 'immich'}.zip" /> |
398 | 391 | <MenuOption
|
399 | 392 | icon={mdiAccountMultipleCheckOutline}
|
400 | 393 | text={$t('fix_incorrect_match')}
|
|
417 | 410 | onClick={() => (viewMode = ViewMode.SELECT_PERSON)}
|
418 | 411 | />
|
419 | 412 | <MenuOption
|
420 |
| - text={data.person.isHidden ? $t('unhide_person') : $t('hide_person')} |
421 |
| - icon={data.person.isHidden ? mdiEyeOutline : mdiEyeOffOutline} |
| 413 | + text={person.isHidden ? $t('unhide_person') : $t('hide_person')} |
| 414 | + icon={person.isHidden ? mdiEyeOutline : mdiEyeOffOutline} |
422 | 415 | onClick={() => toggleHidePerson()}
|
423 | 416 | />
|
424 | 417 | <MenuOption
|
|
445 | 438 | </header>
|
446 | 439 |
|
447 | 440 | <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} |
| 441 | + {#key person.id} |
449 | 442 | <AssetGrid
|
450 | 443 | enableRouting={true}
|
451 | 444 | {assetStore}
|
|
468 | 461 | <section class="flex w-64 sm:w-96 place-items-center border-black">
|
469 | 462 | {#if isEditingName}
|
470 | 463 | <EditNameInput
|
471 |
| - person={data.person} |
| 464 | + {person} |
472 | 465 | bind:suggestedPeople
|
473 |
| - bind:name |
| 466 | + name={person.name} |
474 | 467 | bind:isSearchingPeople
|
475 | 468 | on:change={(event) => handleNameChange(event.detail)}
|
476 | 469 | {thumbnailData}
|
|
487 | 480 | circle
|
488 | 481 | shadow
|
489 | 482 | url={thumbnailData}
|
490 |
| - altText={data.person.name} |
| 483 | + altText={person.name} |
491 | 484 | widthStyle="3.375rem"
|
492 | 485 | heightStyle="3.375rem"
|
493 | 486 | />
|
494 | 487 | <div
|
495 | 488 | class="flex flex-col justify-center text-left px-4 h-14 text-immich-primary dark:text-immich-dark-primary"
|
496 | 489 | >
|
497 |
| - {#if data.person.name} |
498 |
| - <p class="w-40 sm:w-72 font-medium truncate">{data.person.name}</p> |
| 490 | + {#if person.name} |
| 491 | + <p class="w-40 sm:w-72 font-medium truncate">{person.name}</p> |
499 | 492 | <p class="absolute w-fit text-sm text-gray-500 dark:text-immich-gray bottom-0">
|
500 | 493 | {$t('assets_count', { values: { count: numberOfAssets } })}
|
501 | 494 | </p>
|
|
0 commit comments