diff --git a/web/src/lib/components/album-page/albums-list.svelte b/web/src/lib/components/album-page/albums-list.svelte index eb7530973d..0a90ca525b 100644 --- a/web/src/lib/components/album-page/albums-list.svelte +++ b/web/src/lib/components/album-page/albums-list.svelte @@ -1,7 +1,7 @@ <script lang="ts"> import { onMount } from 'svelte'; import { groupBy, orderBy } from 'lodash-es'; - import { addUsersToAlbum, deleteAlbum, type AlbumUserAddDto, type AlbumResponseDto } from '@immich/sdk'; + import { addUsersToAlbum, deleteAlbum, type AlbumUserAddDto, type AlbumResponseDto, isHttpError } from '@immich/sdk'; import { mdiDeleteOutline, mdiShareVariantOutline, mdiFolderDownloadOutline, mdiRenameOutline } from '@mdi/js'; import Icon from '$lib/components/elements/icon.svelte'; import EditAlbumForm from '$lib/components/forms/edit-album-form.svelte'; @@ -267,9 +267,19 @@ }; const handleDeleteAlbum = async (albumToDelete: AlbumResponseDto) => { - await deleteAlbum({ - id: albumToDelete.id, - }); + try { + await deleteAlbum({ + id: albumToDelete.id, + }); + } catch (error) { + // In rare cases deleting an album completes after the list of albums has been requested, + // leading to a bad request error. + // Since the album is already deleted, the error is ignored. + const isBadRequest = isHttpError(error) && error.status === 400; + if (!isBadRequest) { + throw error; + } + } ownedAlbums = ownedAlbums.filter(({ id }) => id !== albumToDelete.id); sharedAlbums = sharedAlbums.filter(({ id }) => id !== albumToDelete.id); 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 9e62f2a5fa..0b368c3733 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 @@ -1,5 +1,5 @@ <script lang="ts"> - import { afterNavigate, goto } from '$app/navigation'; + import { afterNavigate, goto, onNavigate } from '$app/navigation'; import AlbumDescription from '$lib/components/album-page/album-description.svelte'; import AlbumOptions from '$lib/components/album-page/album-options.svelte'; import AlbumSummary from '$lib/components/album-page/album-summary.svelte'; @@ -405,6 +405,12 @@ handleError(error, 'Unable to update album cover'); } }; + + onNavigate(async () => { + if (album.assetCount === 0 && !album.albumName) { + await deleteAlbum(album); + } + }); </script> <div class="flex overflow-hidden" bind:clientWidth={globalWidth}> @@ -559,7 +565,7 @@ {#if viewMode !== ViewMode.SELECT_THUMBNAIL} <!-- ALBUM TITLE --> <section class="pt-24"> - <AlbumTitle id={album.id} albumName={album.albumName} {isOwned} /> + <AlbumTitle id={album.id} bind:albumName={album.albumName} {isOwned} /> {#if album.assetCount > 0} <AlbumSummary {album} />