import type { AgGridReact as AgGridReactType } from '@ag-grid-community/react/lib/agGridReact'; import debounce from 'lodash/debounce'; import { type ChangeEvent, type MutableRefObject, useEffect, useRef } from 'react'; import { useTranslation } from 'react-i18next'; import { PageHeader } from '/@/renderer/components/page-header/page-header'; import { VirtualInfiniteGridRef } from '/@/renderer/components/virtual-grid/virtual-infinite-grid'; import { AlbumListHeaderFilters } from '/@/renderer/features/albums/components/album-list-header-filters'; import { FilterBar } from '/@/renderer/features/shared/components/filter-bar'; import { LibraryHeaderBar } from '/@/renderer/features/shared/components/library-header-bar'; import { SearchInput } from '/@/renderer/features/shared/components/search-input'; import { useContainerQuery } from '/@/renderer/hooks'; import { useDisplayRefresh } from '/@/renderer/hooks/use-display-refresh'; import { AlbumListFilter, useCurrentServer, usePlayButtonBehavior } from '/@/renderer/store'; import { titleCase } from '/@/renderer/utils'; import { Flex } from '/@/shared/components/flex/flex'; import { Group } from '/@/shared/components/group/group'; import { Stack } from '/@/shared/components/stack/stack'; import { AlbumListQuery, LibraryItem } from '/@/shared/types/domain-types'; interface AlbumListHeaderProps { genreId?: string; gridRef: MutableRefObject; itemCount?: number; tableRef: MutableRefObject; title?: string; } export const AlbumListHeader = ({ genreId, gridRef, itemCount, tableRef, title, }: AlbumListHeaderProps) => { const { t } = useTranslation(); const server = useCurrentServer(); const cq = useContainerQuery(); const playButtonBehavior = usePlayButtonBehavior(); const genreRef = useRef(undefined); const { filter, handlePlay, refresh, search } = useDisplayRefresh({ gridRef, itemCount, itemType: LibraryItem.ALBUM, server, tableRef, }); const handleSearch = debounce((e: ChangeEvent) => { const updatedFilters = search(e) as AlbumListFilter; refresh(updatedFilters); }, 500); useEffect(() => { if (genreRef.current && genreRef.current !== genreId) { refresh(filter); } genreRef.current = genreId; }, [filter, genreId, refresh, tableRef]); return ( handlePlay?.({ playType: playButtonBehavior })} /> {title || titleCase(t('page.albumList.title', { postProcess: 'titleCase' }))} {itemCount} ); };