fix: albums page reactivity loops (#24046)
parent
24e5dabb51
commit
0498f6cb9d
|
|
@ -33,7 +33,6 @@
|
||||||
import { groupBy } from 'lodash-es';
|
import { groupBy } from 'lodash-es';
|
||||||
import { onMount, type Snippet } from 'svelte';
|
import { onMount, type Snippet } from 'svelte';
|
||||||
import { t } from 'svelte-i18n';
|
import { t } from 'svelte-i18n';
|
||||||
import { run } from 'svelte/legacy';
|
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
ownedAlbums?: AlbumResponseDto[];
|
ownedAlbums?: AlbumResponseDto[];
|
||||||
|
|
@ -128,63 +127,45 @@
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
let albums: AlbumResponseDto[] = $state([]);
|
let albums = $derived.by(() => {
|
||||||
let filteredAlbums: AlbumResponseDto[] = $state([]);
|
switch (userSettings.filter) {
|
||||||
let groupedAlbums: AlbumGroup[] = $state([]);
|
case AlbumFilter.Owned: {
|
||||||
|
return ownedAlbums;
|
||||||
|
}
|
||||||
|
case AlbumFilter.Shared: {
|
||||||
|
return sharedAlbums;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
const nonOwnedAlbums = sharedAlbums.filter((album) => album.ownerId !== $user.id);
|
||||||
|
return nonOwnedAlbums.length > 0 ? ownedAlbums.concat(nonOwnedAlbums) : ownedAlbums;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
const normalizedSearchQuery = $derived(normalizeSearchString(searchQuery));
|
||||||
|
let filteredAlbums = $derived(
|
||||||
|
normalizedSearchQuery
|
||||||
|
? albums.filter(({ albumName }) => normalizeSearchString(albumName).includes(normalizedSearchQuery))
|
||||||
|
: albums,
|
||||||
|
);
|
||||||
|
|
||||||
let albumGroupOption: string = $state(AlbumGroupBy.None);
|
let albumGroupOption = $derived(getSelectedAlbumGroupOption(userSettings));
|
||||||
|
let groupedAlbums = $derived.by(() => {
|
||||||
|
const groupFunc = groupOptions[albumGroupOption] ?? groupOptions[AlbumGroupBy.None];
|
||||||
|
const groupedAlbums = groupFunc(stringToSortOrder(userSettings.groupOrder), filteredAlbums);
|
||||||
|
|
||||||
|
return groupedAlbums.map((group) => ({
|
||||||
|
id: group.id,
|
||||||
|
name: group.name,
|
||||||
|
albums: sortAlbums(group.albums, { sortBy: userSettings.sortBy, orderBy: userSettings.sortOrder }),
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
|
||||||
let contextMenuPosition: ContextMenuPosition = $state({ x: 0, y: 0 });
|
let contextMenuPosition: ContextMenuPosition = $state({ x: 0, y: 0 });
|
||||||
let selectedAlbum: AlbumResponseDto | undefined = $state();
|
let selectedAlbum: AlbumResponseDto | undefined = $state();
|
||||||
let isOpen = $state(false);
|
let isOpen = $state(false);
|
||||||
|
|
||||||
// Step 1: Filter between Owned and Shared albums, or both.
|
// TODO get rid of this
|
||||||
run(() => {
|
$effect(() => {
|
||||||
switch (userSettings.filter) {
|
|
||||||
case AlbumFilter.Owned: {
|
|
||||||
albums = ownedAlbums;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case AlbumFilter.Shared: {
|
|
||||||
albums = sharedAlbums;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default: {
|
|
||||||
const userId = $user.id;
|
|
||||||
const nonOwnedAlbums = sharedAlbums.filter((album) => album.ownerId !== userId);
|
|
||||||
albums = nonOwnedAlbums.length > 0 ? ownedAlbums.concat(nonOwnedAlbums) : ownedAlbums;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Step 2: Filter using the given search query.
|
|
||||||
run(() => {
|
|
||||||
if (searchQuery) {
|
|
||||||
const searchAlbumNormalized = normalizeSearchString(searchQuery);
|
|
||||||
|
|
||||||
filteredAlbums = albums.filter((album) => {
|
|
||||||
return normalizeSearchString(album.albumName).includes(searchAlbumNormalized);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
filteredAlbums = albums;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Step 3: Group albums.
|
|
||||||
run(() => {
|
|
||||||
albumGroupOption = getSelectedAlbumGroupOption(userSettings);
|
|
||||||
const groupFunc = groupOptions[albumGroupOption] ?? groupOptions[AlbumGroupBy.None];
|
|
||||||
groupedAlbums = groupFunc(stringToSortOrder(userSettings.groupOrder), filteredAlbums);
|
|
||||||
});
|
|
||||||
|
|
||||||
// Step 4: Sort albums amongst each group.
|
|
||||||
run(() => {
|
|
||||||
groupedAlbums = groupedAlbums.map((group) => ({
|
|
||||||
id: group.id,
|
|
||||||
name: group.name,
|
|
||||||
albums: sortAlbums(group.albums, { sortBy: userSettings.sortBy, orderBy: userSettings.sortOrder }),
|
|
||||||
}));
|
|
||||||
|
|
||||||
albumGroupIds = groupedAlbums.map(({ id }) => id);
|
albumGroupIds = groupedAlbums.map(({ id }) => id);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue