import { FocusContext, getCurrentFocusKey, useFocusable } from '@noriginmedia/norigin-spatial-navigation'; import { createFileRoute, useNavigate, useSearch } from '@tanstack/react-router'; import { Gamepad2, HardDrive } from 'lucide-react'; import { JSX, useContext, useEffect, useState } from 'react'; import { useInfiniteQuery, useQuery, useQueryClient } from '@tanstack/react-query'; import FrontEndGameCard from '@/mainview/components/FrontEndGameCard'; import { GetFocusedElement } from '@/mainview/scripts/spatialNavigation'; import LoadMoreButton from '@/mainview/components/LoadMoreButton'; import { storeGamesInfiniteQuery } from '@queries/store'; import { StoreContext } from '@/mainview/scripts/contexts'; import InvalidStoreError from '@/mainview/components/store/InvalidStoreError'; import { CardList, GameMetaExtra } from '@/mainview/components/CardList'; import { GameListFilterType, RPC_URL } from '@/shared/constants'; import { useSessionStorage } from 'usehooks-ts'; import { zodValidator } from '@tanstack/zod-adapter'; import z from 'zod'; import SideFilters from '@/mainview/components/SideFilters'; import { gameFiltersQuery } from '@/mainview/scripts/queries/romm'; export const Route = createFileRoute('/store/tab/games')({ component: RouteComponent, errorComponent: InvalidStoreError, validateSearch: zodValidator(z.object({ search: z.string().optional() })) }); function RouteComponent () { const { focus } = Route.useSearch(); const [search] = useSessionStorage(`${Route.to}-search`, undefined); const navigator = useNavigate(); const { ref, focusKey, focusSelf } = useFocusable({ focusKey: "main-area", preferredChildFocusKey: focus }); const [filter, setFilter] = useSessionStorage('store-games-filters', {}); const { data, fetchNextPage, isFetchingNextPage, isFetching } = useInfiniteQuery(storeGamesInfiniteQuery(filter)); const { data: gameFilters } = useQuery(gameFiltersQuery({ source: 'store' })); useEffect(() => { setFilter(v => ({ ...v, search })); }, [search]); useEffect(() => { if (focus && !GetFocusedElement(getCurrentFocusKey())) { console.log(focus); focusSelf({ instant: true }); } }, [focus]); const handleFocus = (focusKey: string, node: HTMLElement, details: Record) => { node.scrollIntoView({ behavior: details.instant ? 'instant' : 'smooth', block: 'center' }); }; function handleDefaultSelect (g: FrontEndGameType) { navigator({ to: '/game/$source/$id', params: { id: g.id.id, source: g.id.source } }); }; return <>

Games

; }