"use client"; import { useEffect, useState } from "react"; import { useRouter } from "next/navigation"; import { Loader2 } from "lucide-react"; import { useEditor } from "@/hooks/use-editor"; import { useKeybindingsListener, useKeybindingDisabler, } from "@/hooks/use-keybindings"; import { useEditorActions } from "@/hooks/actions/use-editor-actions"; interface EditorProviderProps { projectId: string; children: React.ReactNode; } export function EditorProvider({ projectId, children }: EditorProviderProps) { const editor = useEditor(); const router = useRouter(); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); const { disableKeybindings, enableKeybindings } = useKeybindingDisabler(); const activeProject = editor.project.getActiveOrNull(); useEffect(() => { if (isLoading) { disableKeybindings(); } else { enableKeybindings(); } }, [isLoading, disableKeybindings, enableKeybindings]); useEffect(() => { let cancelled = false; const loadProject = async () => { try { setIsLoading(true); await editor.project.loadProject({ id: projectId }); if (cancelled) return; setIsLoading(false); } catch (err) { if (cancelled) return; const isNotFound = err instanceof Error && (err.message.includes("not found") || err.message.includes("does not exist")); if (isNotFound) { try { const newProjectId = await editor.project.createNewProject({ name: "Untitled Project", }); router.replace(`/editor/${newProjectId}`); } catch (createErr) { setError("Failed to create project"); setIsLoading(false); } } else { setError( err instanceof Error ? err.message : "Failed to load project", ); setIsLoading(false); } } }; loadProject(); return () => { cancelled = true; }; }, [projectId, editor, router]); if (error) { return (

{error}

); } if (isLoading) { return (

Loading project...

); } if (!activeProject) { return (

Exiting project...

); } return ( <> {children} ); } function EditorRuntimeBindings() { useEditorActions(); useKeybindingsListener(); return null; }