import type { MouseEvent } from 'react'; import { useCallback } from 'react'; import { Group } from '@mantine/core'; import { Button, Slider, PageHeader, DropdownMenu } from '/@/renderer/components'; import throttle from 'lodash/throttle'; import { RiArrowDownSLine } from 'react-icons/ri'; import { SongListSort, SortOrder } from '/@/renderer/api/types'; import { useCurrentServer, useAppStoreActions, useSongRouteStore } from '/@/renderer/store'; import { CardDisplayType } from '/@/renderer/types'; const FILTERS = { jellyfin: [ { name: 'Album Artist', value: SongListSort.ALBUM_ARTIST }, { name: 'Artist', value: SongListSort.ARTIST }, { name: 'Duration', value: SongListSort.DURATION }, { name: 'Name', value: SongListSort.NAME }, { name: 'Name', value: SongListSort.PLAY_COUNT }, { name: 'Random', value: SongListSort.RANDOM }, { name: 'Recently Added', value: SongListSort.RECENTLY_ADDED }, { name: 'Recently Played', value: SongListSort.RECENTLY_PLAYED }, { name: 'Release Date', value: SongListSort.RELEASE_DATE }, ], navidrome: [ { name: 'Album Artist', value: SongListSort.ALBUM_ARTIST }, { name: 'Artist', value: SongListSort.ARTIST }, { name: 'BPM', value: SongListSort.BPM }, { name: 'Channels', value: SongListSort.CHANNELS }, { name: 'Comment', value: SongListSort.COMMENT }, { name: 'Duration', value: SongListSort.DURATION }, { name: 'Favorited', value: SongListSort.FAVORITED }, { name: 'Genre', value: SongListSort.GENRE }, { name: 'Name', value: SongListSort.NAME }, { name: 'Play Count', value: SongListSort.PLAY_COUNT }, { name: 'Rating', value: SongListSort.RATING }, { name: 'Recently Added', value: SongListSort.RECENTLY_ADDED }, { name: 'Recently Played', value: SongListSort.RECENTLY_PLAYED }, { name: 'Year', value: SongListSort.YEAR }, ], }; const ORDER = [ { name: 'Ascending', value: SortOrder.ASC }, { name: 'Descending', value: SortOrder.DESC }, ]; export const SongListHeader = () => { const server = useCurrentServer(); const { setPage } = useAppStoreActions(); const page = useSongRouteStore(); const filters = page.list.filter; const sortByLabel = (server?.type && (FILTERS[server.type as keyof typeof FILTERS] as { name: string; value: string }[]).find( (f) => f.value === filters.sortBy, )?.name) || 'Unknown'; const sortOrderLabel = ORDER.find((s) => s.value === filters.sortOrder)?.name; const setSize = throttle( (e: number) => setPage('songs', { ...page, list: { ...page.list, size: e }, }), 200, ); const handleSetFilter = useCallback( (e: MouseEvent) => { if (!e.currentTarget?.value) return; setPage('songs', { list: { ...page.list, filter: { ...page.list.filter, sortBy: e.currentTarget.value as SongListSort, }, }, }); }, [page.list, setPage], ); const handleSetOrder = useCallback( (e: MouseEvent) => { if (!e.currentTarget?.value) return; setPage('songs', { list: { ...page.list, filter: { ...page.list.filter, sortOrder: e.currentTarget.value as SortOrder, }, }, }); }, [page.list, setPage], ); const handleSetViewType = useCallback( (e: MouseEvent) => { if (!e.currentTarget?.value) return; const type = e.currentTarget.value; if (type === CardDisplayType.CARD) { setPage('songs', { ...page, list: { ...page.list, display: CardDisplayType.CARD, type: 'grid', }, }); } else if (type === CardDisplayType.POSTER) { setPage('songs', { ...page, list: { ...page.list, display: CardDisplayType.POSTER, type: 'grid', }, }); } else { setPage('songs', { ...page, list: { ...page.list, type: 'list', }, }); } }, [page, setPage], ); return ( Card Poster List {FILTERS[server?.type as keyof typeof FILTERS].map((filter) => ( {filter.name} ))} {ORDER.map((sort) => ( {sort.name} ))} {/* {serverFolders?.map((folder) => ( {folder.name} ))} */} ); };