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