import { FocusContext, useFocusable } from '@noriginmedia/norigin-spatial-navigation'; import { HeaderButton, StickyHeaderUI } from './Header'; import { GameList } from './GameList'; import { ArrowDownAz, CalendarArrowDown, ClockArrowDown, Drama, Filter, FunnelX, HardDrive, Rocket, Search, Settings2, SortDesc, Store, Tags, User, UserLock } from 'lucide-react'; import { JSX, Suspense, useRef, useState } from 'react'; import { FloatingShortcuts } from './Shortcuts'; import { AutoFocus } from './AutoFocus'; import { GamePadButtonCode, useShortcuts } from '../scripts/shortcuts'; import { GameListFilterSchema, GameListFilterType } from '@/shared/constants'; import { HandleGoBack } from '../scripts/utils'; import LoadingCardList from './LoadingCardList'; import { useQuery, useQueryClient } from '@tanstack/react-query'; import { gameQuery } from '../scripts/queries/romm'; import { useNavigate, useRouter } from '@tanstack/react-router'; import SelectMenu from './SelectMenu'; import { RoundButton } from './RoundButton'; import { ContextList, DialogEntry, useContextDialog } from './ContextDialog'; import classNames from 'classnames'; import { sourceIconMap } from './Constants'; import { stat } from 'fs-extra'; import { FilterUI } from './Filters'; import SideFilters from './SideFilters'; export interface CollectionsDetailParams { id?: string; setBackground?: (url: string) => void; filters?: GameListFilterType; setLocalFilter: (filter: GameListFilterType) => void, localFilter: GameListFilterType, headerTitle?: JSX.Element; headerChildren?: any; title?: JSX.Element; footer?: JSX.Element; focus?: string; countHint?: number; headerButtons?: HeaderButton[]; headerButtonElements?: JSX.Element | JSX.Element[]; } export function CollectionsDetail (data: CollectionsDetailParams) { const router = useRouter(); const [filterValues, setFilterValues] = useState(); const queryClient = useQueryClient(); const finalFilter = { ...data.localFilter, ...data.filters }; const focusKey = `game-list-${data.id}`; const { ref, focusSelf } = useFocusable({ focusKey, preferredChildFocusKey: `${focusKey}-list` }); useShortcuts(focusKey, () => [{ label: "Back", button: GamePadButtonCode.B, action: (e) => HandleGoBack(router, e) }], [router]); const handleScroll: FocusParams['onFocus'] = (cardId, node, details) => { const [source, id] = cardId.split('@'); queryClient.prefetchQuery(gameQuery(source, id)); if (!(details.nativeEvent instanceof MouseEvent)) { node.scrollIntoView({ block: 'center', behavior: details.instant ? 'instant' : 'smooth' }); } }; return (
{data.headerChildren}
{finalFilter && data.title} {}> }
{data.footer}
); }