import { AnimatedBackground } from './AnimatedBackground'; import { FocusContext, setFocus, useFocusable } from '@noriginmedia/norigin-spatial-navigation'; import { HeaderUI, StickyHeaderUI } from './Header'; import { GameList } from './GameList'; import { Search, Settings2 } from 'lucide-react'; import { JSX, Suspense, useEffect } from 'react'; import Shortcuts from './Shortcuts'; import { AutoFocus } from './AutoFocus'; import { GamePadButtonCode, useShortcutContext, useShortcuts } from '../scripts/shortcuts'; import { GameListFilterType } from '@/shared/constants'; import { GameCardFocusHandler } from './CardElement'; import { HandleGoBack, useStickyDataAttr } from '../scripts/utils'; import LoadingCardList from './LoadingCardList'; import { useQuery, useQueryClient } from '@tanstack/react-query'; import { gameQuery } from '../scripts/queries/romm'; export interface CollectionsDetailParams { id?: string; setBackground?: (url: string) => void; filters?: GameListFilterType; builder?: () => Promise<{ filter?: GameListFilterType, title?: JSX.Element; }>; headerTitle?: JSX.Element; title?: JSX.Element; footer?: JSX.Element; focus?: string; countHit?: number; } export function CollectionsDetail (data: CollectionsDetailParams) { const builtData = useQuery({ queryKey: ['filter', data.id], queryFn: async () => { return data.builder?.() ?? { filter: data.filters, title: data.title }; } }); const queryClient = useQueryClient(); const focusKey = `game-list-${data.id}-${data?.filters ? Object.values(data?.filters).map(f => String(f)).join(",") : ''}`; const { ref, focusSelf } = useFocusable({ focusKey, preferredChildFocusKey: `${focusKey}-list` }); useShortcuts(focusKey, () => [{ label: "Back", button: GamePadButtonCode.B, action: HandleGoBack }]); const { shortcuts } = useShortcutContext(); const handleScroll: GameCardFocusHandler = (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 (
}, { id: "filter", icon: }]} ref={ref} />
{builtData.data?.filter && data.title} {(builtData.data?.filter || (!data.filters && !data.builder)) && }> }
); }