From a47b23223536a816942e8a98c4d7f04c8d367552 Mon Sep 17 00:00:00 2001
From: Michel Heusschen <59014050+michelheusschen@users.noreply.github.com>
Date: Mon, 9 Mar 2026 17:11:32 +0100
Subject: [PATCH] fix(web): refresh recent albums sidebar after album changes
(#26757)
---
.../album-page/album-description.svelte | 4 +++-
.../components/album-page/album-title.svelte | 7 +++++--
.../components/album-page/albums-list.svelte | 10 ++--------
.../actions/set-album-cover-action.svelte | 4 +++-
.../side-bar/recent-albums.svelte | 17 +++++++++--------
web/src/lib/managers/event-manager.svelte.ts | 1 +
web/src/lib/modals/AlbumPickerModal.svelte | 2 ++
web/src/lib/stores/user.svelte.ts | 7 +++++++
web/src/lib/utils/album-utils.ts | 2 ++
.../[[assetId=id]]/+page.svelte | 4 +++-
10 files changed, 37 insertions(+), 21 deletions(-)
diff --git a/web/src/lib/components/album-page/album-description.svelte b/web/src/lib/components/album-page/album-description.svelte
index 00744832a7..481e110fb0 100644
--- a/web/src/lib/components/album-page/album-description.svelte
+++ b/web/src/lib/components/album-page/album-description.svelte
@@ -1,5 +1,6 @@
diff --git a/web/src/lib/components/asset-viewer/actions/set-album-cover-action.svelte b/web/src/lib/components/asset-viewer/actions/set-album-cover-action.svelte
index 22ca22b0d9..98d01ff9d3 100644
--- a/web/src/lib/components/asset-viewer/actions/set-album-cover-action.svelte
+++ b/web/src/lib/components/asset-viewer/actions/set-album-cover-action.svelte
@@ -1,5 +1,6 @@
diff --git a/web/src/lib/managers/event-manager.svelte.ts b/web/src/lib/managers/event-manager.svelte.ts
index 2095a001bd..25e1b3c45b 100644
--- a/web/src/lib/managers/event-manager.svelte.ts
+++ b/web/src/lib/managers/event-manager.svelte.ts
@@ -39,6 +39,7 @@ export type Events = {
AssetsTag: [string[]];
AlbumAddAssets: [{ assetIds: string[]; albumIds: string[] }];
+ AlbumCreate: [AlbumResponseDto];
AlbumUpdate: [AlbumResponseDto];
AlbumDelete: [AlbumResponseDto];
AlbumShare: [];
diff --git a/web/src/lib/modals/AlbumPickerModal.svelte b/web/src/lib/modals/AlbumPickerModal.svelte
index b2420215bc..081c7f49d7 100644
--- a/web/src/lib/modals/AlbumPickerModal.svelte
+++ b/web/src/lib/modals/AlbumPickerModal.svelte
@@ -5,6 +5,7 @@
AlbumModalRowType,
isSelectableRowType,
} from '$lib/components/shared-components/album-selection/album-selection-utils';
+ import { eventManager } from '$lib/managers/event-manager.svelte';
import { albumViewSettings } from '$lib/stores/preferences.store';
import { createAlbum, getAllAlbums, type AlbumResponseDto } from '@immich/sdk';
import { Button, Icon, Modal, ModalBody, ModalFooter, Text } from '@immich/ui';
@@ -43,6 +44,7 @@
const onNewAlbum = async (name: string) => {
const album = await createAlbum({ createAlbumDto: { albumName: name } });
+ eventManager.emit('AlbumCreate', album);
onClose([album]);
};
diff --git a/web/src/lib/stores/user.svelte.ts b/web/src/lib/stores/user.svelte.ts
index 508fd156b8..2605feebba 100644
--- a/web/src/lib/stores/user.svelte.ts
+++ b/web/src/lib/stores/user.svelte.ts
@@ -22,10 +22,17 @@ const defaultUserInteraction: UserInteractions = {
export const userInteraction = $state(defaultUserInteraction);
+const resetRecentAlbums = () => {
+ userInteraction.recentAlbums = undefined;
+};
+
const reset = () => {
Object.assign(userInteraction, defaultUserInteraction);
};
eventManager.on({
+ AlbumCreate: () => resetRecentAlbums(),
+ AlbumUpdate: () => resetRecentAlbums(),
+ AlbumDelete: () => resetRecentAlbums(),
AuthLogout: () => reset(),
});
diff --git a/web/src/lib/utils/album-utils.ts b/web/src/lib/utils/album-utils.ts
index 1689d43585..497642847d 100644
--- a/web/src/lib/utils/album-utils.ts
+++ b/web/src/lib/utils/album-utils.ts
@@ -1,4 +1,5 @@
import { goto } from '$app/navigation';
+import { eventManager } from '$lib/managers/event-manager.svelte';
import { Route } from '$lib/route';
import {
AlbumFilter,
@@ -29,6 +30,7 @@ export const createAlbum = async (name?: string, assetIds?: string[]) => {
assetIds,
},
});
+ eventManager.emit('AlbumCreate', newAlbum);
return newAlbum;
} catch (error) {
const $t = get(t);
diff --git a/web/src/routes/(user)/albums/[albumId=id]/[[photos=photos]]/[[assetId=id]]/+page.svelte b/web/src/routes/(user)/albums/[albumId=id]/[[photos=photos]]/[[assetId=id]]/+page.svelte
index 44a0c5e678..e354d2c1fc 100644
--- a/web/src/routes/(user)/albums/[albumId=id]/[[photos=photos]]/[[assetId=id]]/+page.svelte
+++ b/web/src/routes/(user)/albums/[albumId=id]/[[photos=photos]]/[[assetId=id]]/+page.svelte
@@ -30,6 +30,7 @@
import { AlbumPageViewMode } from '$lib/constants';
import { activityManager } from '$lib/managers/activity-manager.svelte';
import { assetViewerManager } from '$lib/managers/asset-viewer-manager.svelte';
+ import { eventManager } from '$lib/managers/event-manager.svelte';
import { featureFlagsManager } from '$lib/managers/feature-flags-manager.svelte';
import { TimelineManager } from '$lib/managers/timeline-manager/timeline-manager.svelte';
import type { TimelineAsset } from '$lib/managers/timeline-manager/types';
@@ -192,12 +193,13 @@
const updateThumbnail = async (assetId: string) => {
try {
- await updateAlbumInfo({
+ const response = await updateAlbumInfo({
id: album.id,
updateAlbumDto: {
albumThumbnailAssetId: assetId,
},
});
+ eventManager.emit('AlbumUpdate', response);
toastManager.success($t('album_cover_updated'));
} catch (error) {
handleError(error, $t('errors.unable_to_update_album_cover'));