"use client"; import * as React from "react"; import { useImmer } from "use-immer"; import { enableMapSet, enablePatches } from "immer"; import { useKey, useKeyPressEvent } from "react-use"; import FlipMove from "react-flip-move"; import { createContest, createSubmissions, createTeams } from "@xcpcio/core"; import { TeamUI } from "./team-ui"; import { Resolver } from "@/lib/resolver"; import { cn } from "@/lib/utils"; import type { IBoardData } from "@/lib/types"; import "./resolver-ui.css"; enableMapSet(); enablePatches(); export interface ResolverUIProps { boardData: IBoardData; } const ResolverUI: React.FC = (props) => { const { boardData } = props; const [resolver, updateResolver] = useImmer(() => { const r = new Resolver( createContest(JSON.parse(boardData?.config ?? "{}")), createTeams(JSON.parse(boardData?.team ?? "[]")), createSubmissions(JSON.parse(boardData?.run ?? "[]")), ); r.buildResolver(); return r; }); const handleArrowUp = React.useCallback(() => { updateResolver((resolver) => { resolver.up(); }); }, [updateResolver]); const handleArrowDown = React.useCallback(() => { updateResolver((resolver) => { resolver.down(); }); }, [updateResolver]); const handleArrowRight = React.useCallback(() => { updateResolver((resolver) => { resolver.right(); }); }, [updateResolver]); const handleArrowLeft = React.useCallback(() => { updateResolver((resolver) => { resolver.left(); }); }, [updateResolver]); React.useEffect(() => { let timeoutId: NodeJS.Timeout | null = null; updateResolver((resolver) => { if (!resolver.startScrollUp) { return; } if (resolver.problemFlashingEnded === true) { resolver.problemFlashingEnded = false; timeoutId = setTimeout(() => { updateResolver((resolver) => { resolver.problemFlashingEnded = true; }); }, resolver.FLASHING_TIME_MS); } resolver.scrollUp(); }); if (timeoutId !== null) { return () => { clearTimeout(timeoutId as NodeJS.Timeout); }; } }, [resolver, updateResolver]); React.useEffect(() => { updateResolver((resolver) => { if (!resolver.startScrollDown) { return; } resolver.scrollDown(); }); }, [resolver, updateResolver]); useKey("w", handleArrowUp); useKeyPressEvent("i", undefined, handleArrowUp); useKey("s", handleArrowDown); useKeyPressEvent("k", undefined, handleArrowDown); useKey("d", handleArrowRight); useKeyPressEvent("l", undefined, handleArrowRight); useKey("a", handleArrowLeft); useKeyPressEvent("j", undefined, handleArrowLeft); const onStartAll = React.useCallback(() => { updateResolver((resolver) => { resolver.duringAnimation = true; }); }, [updateResolver]); const onFinishAll = React.useCallback(() => { setTimeout(() => { updateResolver((resolver) => { resolver.duringAnimation = false; }); }, 128); }, [updateResolver]); return ( <>
{resolver.teams.map((team, index) => (
))}
); }; export { ResolverUI }; export default ResolverUI;