From 7ac47377f15c902d79c283f4ec688a4e7f5d30fe Mon Sep 17 00:00:00 2001 From: jeffvli Date: Thu, 4 Dec 2025 19:50:48 -0800 Subject: [PATCH] maintain playlist order on header play (#1318) --- src/renderer/context/list-context.tsx | 2 ++ .../playlist-detail-song-list-header.tsx | 6 +++--- .../playlist-detail-song-list-table.tsx | 19 ++++++++++++------- .../playlist-detail-song-list-route.tsx | 5 ++++- 4 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/renderer/context/list-context.tsx b/src/renderer/context/list-context.tsx index 363ae0408..7adc593e9 100644 --- a/src/renderer/context/list-context.tsx +++ b/src/renderer/context/list-context.tsx @@ -6,8 +6,10 @@ interface ListContextProps { customFilters?: Record; id?: string; itemCount?: number; + listData?: unknown[]; pageKey: ItemListKey | string; setItemCount?: (itemCount: number) => void; + setListData?: (items: unknown[]) => void; } export const ListContext = createContext({ diff --git a/src/renderer/features/playlists/components/playlist-detail-song-list-header.tsx b/src/renderer/features/playlists/components/playlist-detail-song-list-header.tsx index d27c7ecc7..bddacd32c 100644 --- a/src/renderer/features/playlists/components/playlist-detail-song-list-header.tsx +++ b/src/renderer/features/playlists/components/playlist-detail-song-list-header.tsx @@ -12,7 +12,7 @@ import { ListSearchInput } from '/@/renderer/features/shared/components/list-sea import { useCurrentServer } from '/@/renderer/store'; import { formatDurationString } from '/@/renderer/utils'; import { Stack } from '/@/shared/components/stack/stack'; -import { LibraryItem } from '/@/shared/types/domain-types'; +import { LibraryItem, Song } from '/@/shared/types/domain-types'; interface PlaylistDetailSongListHeaderProps { isSmartPlaylist?: boolean; @@ -26,7 +26,7 @@ export const PlaylistDetailSongListHeader = ({ }: PlaylistDetailSongListHeaderProps) => { const { t } = useTranslation(); const { playlistId } = useParams() as { playlistId: string }; - const { itemCount } = useListContext(); + const { itemCount, listData } = useListContext(); const server = useCurrentServer(); const location = useLocation(); @@ -43,8 +43,8 @@ export const PlaylistDetailSongListHeader = ({ {detailQuery?.data?.name} {isSmartPlaylist && ( diff --git a/src/renderer/features/playlists/components/playlist-detail-song-list-table.tsx b/src/renderer/features/playlists/components/playlist-detail-song-list-table.tsx index 0cde2fd6b..5dcece674 100644 --- a/src/renderer/features/playlists/components/playlist-detail-song-list-table.tsx +++ b/src/renderer/features/playlists/components/playlist-detail-song-list-table.tsx @@ -1,4 +1,5 @@ import { forwardRef, useMemo } from 'react'; +import { useEffect } from 'react'; import { useItemListColumnReorder } from '/@/renderer/components/item-list/helpers/use-item-list-column-reorder'; import { useItemListColumnResize } from '/@/renderer/components/item-list/helpers/use-item-list-column-resize'; @@ -6,6 +7,7 @@ import { useItemListScrollPersist } from '/@/renderer/components/item-list/helpe import { ItemTableList } from '/@/renderer/components/item-list/item-table-list/item-table-list'; import { ItemTableListColumn } from '/@/renderer/components/item-list/item-table-list/item-table-list-column'; import { ItemControls, ItemListTableComponentProps } from '/@/renderer/components/item-list/types'; +import { useListContext } from '/@/renderer/context/list-context'; import { usePlayer } from '/@/renderer/features/player/context/player-context'; import { usePlaylistSongListFilters } from '/@/renderer/features/playlists/hooks/use-playlist-song-list-filters'; import { useSearchTermFilter } from '/@/renderer/features/shared/hooks/use-search-term-filter'; @@ -55,21 +57,24 @@ export const PlaylistDetailSongListTable = forwardRef { + const songData = useMemo(() => { let items = data?.items || []; if (searchTerm) { - if (searchTerm) { - items = searchLibraryItems(items, searchTerm, LibraryItem.SONG); - } - - return sortSongList(items, query.sortBy, query.sortOrder); + items = searchLibraryItems(items, searchTerm, LibraryItem.SONG); } return sortSongList(items, query.sortBy, query.sortOrder); }, [data?.items, searchTerm, query.sortBy, query.sortOrder]); + useEffect(() => { + if (setListData) { + setListData(songData); + } + }, [songData, setListData]); + const player = usePlayer(); const currentSong = usePlayerSong(); @@ -97,7 +102,7 @@ export const PlaylistDetailSongListTable = forwardRef { }; const [itemCount, setItemCount] = useState(undefined); + const [listData, setListData] = useState([]); const providerValue = useMemo(() => { return { customFilters: undefined, id: playlistId, itemCount, + listData, pageKey: ItemListKey.PLAYLIST_SONG, setItemCount, + setListData, }; - }, [playlistId, itemCount]); + }, [playlistId, itemCount, listData]); return (