diff --git a/src/app/run/page.tsx b/src/app/run/page.tsx index e56ed70..8daf170 100644 --- a/src/app/run/page.tsx +++ b/src/app/run/page.tsx @@ -6,13 +6,13 @@ import RunChat, { ChatMessage } from "./components/RunChat"; import { FileTree } from "./components/FileTree"; import { File } from "lucide-react"; import Editor from "./components/Editor"; -import useAction from "@/hook/use-action"; +import useAction, { useActionInterval } from "@/hook/use-action"; import { getLiveRun } from "@/modules/live-run/actions"; import ProblemCard from "../problems/components/ProblemCard"; import ProfileCard from "./components/ProfileCard"; export default function Run() { - const [runInfo] = useAction(getLiveRun); + const [runInfo] = useActionInterval(getLiveRun, 1000); const chatMessages: ChatMessage[] = [ { user: "Alice", message: "Nice split!", time: "1:53" }, diff --git a/src/hook/use-action.ts b/src/hook/use-action.ts index 0f7468a..4df2ca0 100644 --- a/src/hook/use-action.ts +++ b/src/hook/use-action.ts @@ -17,3 +17,29 @@ export default function useAction( return [value, loaded, error]; } + +export function useActionInterval( + action: () => Promise, + interval: number, + dependencies = [], +): [T | null, boolean, Error | null] { + const [value, setValue] = useState(null); + const [loaded, setLoaded] = useState(false); + const [error, setError] = useState(null); + + useEffect(() => { + const f = () => + action() + .then(setValue) + .catch(setError) + .finally(() => setLoaded(true)); + + f(); + + const inv = setInterval(f, interval); + + return () => clearInterval(inv); + }, dependencies); + + return [value, loaded, error]; +} diff --git a/src/modules/live-run/actions.ts b/src/modules/live-run/actions.ts index 7530f2b..c25967c 100644 --- a/src/modules/live-run/actions.ts +++ b/src/modules/live-run/actions.ts @@ -54,7 +54,7 @@ export async function getLiveRun(): Promise { return { id: "0", username: "selimaj", - start: new Date().getTime(), + start: 1770497350654, views: 230, problem: "solve", category: "any%",