import { twMerge } from "tailwind-merge"; import { RPC_URL } from "@/shared/constants"; import { Button } from "../options/Button"; import useActiveControl from "@/mainview/scripts/gamepads"; import { useFocusable } from "@noriginmedia/norigin-spatial-navigation"; import { GamePadButtonCode, useShortcuts } from "@/mainview/scripts/shortcuts"; import { BadgeCheck, ChevronRight, CircleFadingArrowUp, EllipsisVertical, FileQuestion, IceCream2, Package, Sparkles, Store, WandSparkles } from "lucide-react"; import { FOCUS_KEYS } from "@/mainview/scripts/types"; import { FlatpackIcon } from "@/mainview/scripts/brandIcons"; import { JSX } from "react"; import { oneShot } from "@/mainview/scripts/audio/audio"; import { useQuery } from "@tanstack/react-query"; import { getUpdateInfoForEmulator } from "@/mainview/scripts/queries/store"; export const emulatorStatusIcons: Record = { store: , custom: , flatpak: FlatpackIcon, winget: , scoop: }; export function StoreEmulatorCard (data: { id: string; emulator: FrontEndEmulator; onSelect?: (id: string, focusKey: string) => void; onFocus?: (data: { id: string; node: HTMLElement; details: Record; }) => void; className?: string; }) { const handleSelect = () => { data.onSelect?.(data.emulator.name, focusKey); oneShot('click'); }; const { ref, focusKey } = useFocusable({ focusKey: FOCUS_KEYS.EMULATOR_CARD(data.id), onEnterPress: handleSelect, onFocus: (_l, _p, details) => { data.onFocus?.({ id: data.emulator.name, node: ref.current as HTMLElement, details }); } }); const { data: updateInfo } = useQuery(getUpdateInfoForEmulator(data.emulator.name)); useShortcuts(focusKey, () => [{ button: GamePadButtonCode.A, label: "Details", action: handleSelect }], [handleSelect]); return (
s.exists)} onClick={handleSelect} className={twMerge("relative focusable focusable-info focusable-hover bg-base-100 rounded-4xl transition-shadow focused:not-control-mouse:animate-scale-small shadow-lg border border-base-content/10 active:ring-4 active:ring-base-content active:transition-none cursor-pointer", data.className)} >

{data.emulator.name}

    {data.emulator.systems.map(({ id, name, iconUrl }) => { return
    {!!iconUrl && }

    {name}

    ; })}
{updateInfo?.hasUpdate &&
} {data.emulator.integrations.length > 0 &&
i.supportLevel)} data-full-support={data.emulator.integrations.some(i => i.supportLevel === 'full')} className="tooltip not-aria-disabled:tooltip-primary" data-tip={data.emulator.integrations.some(i => i.supportLevel) ? data.emulator.integrations.some(i => i.supportLevel === 'full') ? "Full Support" : "Partial SUpport" : "Can Integrate"} >
} {data.emulator.validSources.slice(0, 3).map(s => { return
{emulatorStatusIcons[s.type]}
; })}
); }