import { FocusContext, useFocusable, } from "@noriginmedia/norigin-spatial-navigation"; import { GameMeta } from "../../shared/constants"; import GameCard, { GameCardParams } from "./GameCard"; import { JSX } from "react"; import { twMerge } from "tailwind-merge"; import { GamePadButtonCode, useShortcuts } from "../scripts/shortcuts"; export interface GameMetaExtra extends GameMeta { preview?: GameCardParams['preview']; badges?: JSX.Element[]; focusKey: string; } export function CardList (data: { id: string; type?: string; games: GameMetaExtra[]; grid?: boolean; onSelectGame?: (id: string) => void; onGameFocus?: (id: string, node: HTMLElement) => void; className?: string; }) { const { ref, focusKey } = useFocusable({ focusKey: data.id, }); function BuildCard (g: GameMetaExtra, i: number) { let preview: GameCardParams['preview'] = g.preview; if (!preview && g.previewUrl) { preview = g.previewUrl; } const handleAction = () => { g.onSelect?.(); data.onSelectGame?.(g.id); }; useShortcuts(g.focusKey, () => [{ label: "Select", button: GamePadButtonCode.A, action: handleAction }]); return ( { g.onFocus?.(); data.onGameFocus?.(id, node); }} onAction={handleAction} preview={preview} badges={g.badges} id={g.id} /> ); } return ( ); }