import { ChangeEvent, MutableRefObject, useEffect, useRef } from 'react'; import type { AgGridReact as AgGridReactType } from '@ag-grid-community/react/lib/agGridReact'; import { Flex, Group, Stack } from '@mantine/core'; import debounce from 'lodash/debounce'; import { useTranslation } from 'react-i18next'; import { LibraryItem } from '/@/renderer/api/types'; import { PageHeader, SearchInput } from '/@/renderer/components'; import { FilterBar, LibraryHeaderBar } from '/@/renderer/features/shared'; import { SongListHeaderFilters } from '/@/renderer/features/songs/components/song-list-header-filters'; import { useContainerQuery } from '/@/renderer/hooks'; import { SongListFilter, useCurrentServer } from '/@/renderer/store'; import { usePlayButtonBehavior } from '/@/renderer/store/settings.store'; import { VirtualInfiniteGridRef } from '/@/renderer/components/virtual-grid'; import { useDisplayRefresh } from '/@/renderer/hooks/use-display-refresh'; interface SongListHeaderProps { genreId?: string; gridRef: MutableRefObject; itemCount?: number; tableRef: MutableRefObject; title?: string; } export const SongListHeader = ({ genreId, gridRef, title, itemCount, tableRef, }: SongListHeaderProps) => { const { t } = useTranslation(); const server = useCurrentServer(); const cq = useContainerQuery(); const genreRef = useRef(); const { customFilters, filter, handlePlay, refresh, search } = useDisplayRefresh({ gridRef, itemType: LibraryItem.SONG, server, tableRef, }); const handleSearch = debounce((e: ChangeEvent) => { const updatedFilters = search(e) as SongListFilter; const filterWithCustom = { ...updatedFilters, ...customFilters, }; refresh(filterWithCustom); }, 500); useEffect(() => { if (genreRef.current && genreRef.current !== genreId) { refresh(customFilters); } genreRef.current = genreId; }, [customFilters, genreId, refresh, tableRef]); const playButtonBehavior = usePlayButtonBehavior(); return ( handlePlay?.({ playType: playButtonBehavior })} /> {title || t('page.trackList.title', { postProcess: 'titleCase' })} {itemCount} ); };