From 5540ca4e3262887bee13e2411a6c6a2cd377deac Mon Sep 17 00:00:00 2001 From: jeffvli Date: Wed, 3 Dec 2025 20:51:10 -0800 Subject: [PATCH] improve handlers for artist / sidebar configuration --- .../components/general/artist-settings.tsx | 50 ++++++++++++++++--- .../components/general/sidebar-reorder.tsx | 50 +++++++++++++++++-- 2 files changed, 91 insertions(+), 9 deletions(-) diff --git a/src/renderer/features/settings/components/general/artist-settings.tsx b/src/renderer/features/settings/components/general/artist-settings.tsx index 4df644183..076bcbeb9 100644 --- a/src/renderer/features/settings/components/general/artist-settings.tsx +++ b/src/renderer/features/settings/components/general/artist-settings.tsx @@ -1,5 +1,12 @@ +import { useMemo } from 'react'; + import { DraggableItems } from '/@/renderer/features/settings/components/general/draggable-items'; -import { ArtistItem, useGeneralSettings, useSettingsStoreActions } from '/@/renderer/store'; +import { + ArtistItem, + SortableItem, + useGeneralSettings, + useSettingsStoreActions, +} from '/@/renderer/store'; const ARTIST_ITEMS: Array<[ArtistItem, string]> = [ [ArtistItem.BIOGRAPHY, 'table.column.biography'], @@ -13,17 +20,48 @@ export const ArtistSettings = () => { const { artistItems } = useGeneralSettings(); const { setArtistItems } = useSettingsStoreActions(); - const mappedArtistItems = artistItems.map((item) => ({ - ...item, - id: item.id as ArtistItem, - })); + const mergedArtistItems = useMemo(() => { + const settingsMap = new Map( + artistItems.map((item) => [item.id, item as SortableItem]), + ); + + const merged = ARTIST_ITEMS.map(([itemId]) => { + const artistItemId = itemId as ArtistItem; + const existing = settingsMap.get(artistItemId); + if (existing) { + return { + ...existing, + id: artistItemId, + }; + } + + // Item not in settings, add it as disabled + return { + disabled: true, + id: artistItemId, + }; + }); + + // Add any items from settings that aren't in ARTIST_ITEMS (for backwards compatibility) + artistItems.forEach((item) => { + const existsInArtistItems = ARTIST_ITEMS.some(([itemId]) => itemId === item.id); + if (!existsInArtistItems) { + merged.push({ + ...item, + id: item.id as ArtistItem, + }); + } + }); + + return merged; + }, [artistItems]); return ( ); diff --git a/src/renderer/features/settings/components/general/sidebar-reorder.tsx b/src/renderer/features/settings/components/general/sidebar-reorder.tsx index 32b8061bb..4b4b50322 100644 --- a/src/renderer/features/settings/components/general/sidebar-reorder.tsx +++ b/src/renderer/features/settings/components/general/sidebar-reorder.tsx @@ -1,16 +1,23 @@ +import { useMemo } from 'react'; + import { DraggableItems } from '/@/renderer/features/settings/components/general/draggable-items'; -import { useGeneralSettings, useSettingsStoreActions } from '/@/renderer/store'; +import { + sidebarItems as defaultSidebarItems, + useGeneralSettings, + useSettingsStoreActions, +} from '/@/renderer/store'; const SIDEBAR_ITEMS: Array<[string, string]> = [ ['Albums', 'page.sidebar.albums'], ['Artists', 'page.sidebar.albumArtists'], ['Artists-all', 'page.sidebar.artists'], + ['Favorites', 'page.sidebar.favorites'], + ['Folders', 'page.sidebar.folders'], ['Genres', 'page.sidebar.genres'], ['Home', 'page.sidebar.home'], ['Now Playing', 'page.sidebar.nowPlaying'], ['Playlists', 'page.sidebar.playlists'], ['Search', 'page.sidebar.search'], - ['Favorites', 'page.sidebar.favorites'], ['Settings', 'page.sidebar.settings'], ['Tracks', 'page.sidebar.tracks'], ]; @@ -19,12 +26,49 @@ export const SidebarReorder = () => { const { sidebarItems } = useGeneralSettings(); const { setSidebarItems } = useSettingsStoreActions(); + const mergedSidebarItems = useMemo(() => { + const settingsMap = new Map(sidebarItems.map((item) => [item.id, item])); + const defaultMap = new Map(defaultSidebarItems.map((item) => [item.id, item])); + + const merged = SIDEBAR_ITEMS.map(([itemId]) => { + const existing = settingsMap.get(itemId); + if (existing) { + return { + ...existing, + id: itemId, + }; + } + + // Item not in settings, get default values and add it as disabled + const defaultItem = defaultMap.get(itemId); + return { + disabled: true, + id: itemId, + label: defaultItem?.label ?? itemId, + route: defaultItem?.route ?? '', + }; + }); + + // Add any items from settings that aren't in SIDEBAR_ITEMS (for backwards compatibility) + sidebarItems.forEach((item) => { + const existsInSidebarItems = SIDEBAR_ITEMS.some(([itemId]) => itemId === item.id); + if (!existsInSidebarItems) { + merged.push({ + ...item, + id: item.id, + }); + } + }); + + return merged; + }, [sidebarItems]); + return ( );