import { useQuery } from '@tanstack/react-query'; import { forwardRef, useMemo } 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'; import { useItemListScrollPersist } from '/@/renderer/components/item-list/helpers/use-item-list-scroll-persist'; 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 { usePlayer } from '/@/renderer/features/player/context/player-context'; import { playlistsQueries } from '/@/renderer/features/playlists/api/playlists-api'; import { usePlaylistSongListFilters } from '/@/renderer/features/playlists/hooks/use-playlist-song-list-filters'; import { useSearchTermFilter } from '/@/renderer/features/shared/hooks/use-search-term-filter'; import { searchLibraryItems } from '/@/renderer/features/shared/utils'; import { usePlayerSong } from '/@/renderer/store'; import { sortSongList } from '/@/shared/api/utils'; import { LibraryItem, PlaylistSongListQuery, Song } from '/@/shared/types/domain-types'; import { ItemListKey, Play } from '/@/shared/types/types'; interface PlaylistDetailSongListTableProps extends Omit, 'query'> { playlistId: string; } export const PlaylistDetailSongListTable = forwardRef( ( { autoFitColumns = false, columns, enableAlternateRowColors = false, enableHorizontalBorders = false, enableRowHoverHighlight = true, enableSelection = true, enableVerticalBorders = false, playlistId, saveScrollOffset = true, serverId, size = 'default', }, ref, ) => { const playlistSongs = useQuery( playlistsQueries.songList({ query: { id: playlistId }, serverId: serverId, }), ); const { handleOnScrollEnd, scrollOffset } = useItemListScrollPersist({ enabled: saveScrollOffset, }); const { handleColumnReordered } = useItemListColumnReorder({ itemListKey: ItemListKey.PLAYLIST_SONG, }); const { handleColumnResized } = useItemListColumnResize({ itemListKey: ItemListKey.PLAYLIST_SONG, }); const { searchTerm } = useSearchTermFilter(); const { query } = usePlaylistSongListFilters(); const filterSortedSongs = useMemo(() => { let items = playlistSongs.data?.items || []; if (searchTerm) { if (searchTerm) { items = searchLibraryItems(items, searchTerm, LibraryItem.SONG); } return sortSongList(items, query.sortBy, query.sortOrder); } return sortSongList(items, query.sortBy, query.sortOrder); }, [playlistSongs.data?.items, searchTerm, query.sortBy, query.sortOrder]); const player = usePlayer(); const currentSong = usePlayerSong(); const overrideControls: Partial = useMemo(() => { return { onDoubleClick: ({ index, internalState, item }) => { if (!item) { return; } const items = internalState?.getData() as Song[]; if (index !== undefined) { player.addToQueueByData(items, Play.NOW); player.mediaPlayByIndex(index); } }, }; }, [player]); return ( ); }, );