From 7bf0984698e43b9aa2dd879f65951318ed410390 Mon Sep 17 00:00:00 2001
From: Maze <167211895+mazeincoding@users.noreply.github.com>
Date: Sat, 31 Jan 2026 00:20:04 +0100
Subject: codebase overhaul (#697)
---
apps/web/src/app/editor/[project_id]/layout.tsx | 9 -
apps/web/src/app/editor/[project_id]/page.tsx | 543 +++++-------------------
2 files changed, 96 insertions(+), 456 deletions(-)
delete mode 100644 apps/web/src/app/editor/[project_id]/layout.tsx
(limited to 'apps/web/src/app/editor')
diff --git a/apps/web/src/app/editor/[project_id]/layout.tsx b/apps/web/src/app/editor/[project_id]/layout.tsx
deleted file mode 100644
index c37e78b7..00000000
--- a/apps/web/src/app/editor/[project_id]/layout.tsx
+++ /dev/null
@@ -1,9 +0,0 @@
-"use client";
-
-export default function EditorLayout({
- children,
-}: {
- children: React.ReactNode;
-}) {
- return
{children}
;
-}
diff --git a/apps/web/src/app/editor/[project_id]/page.tsx b/apps/web/src/app/editor/[project_id]/page.tsx
index 1b53b6b5..e652e928 100644
--- a/apps/web/src/app/editor/[project_id]/page.tsx
+++ b/apps/web/src/app/editor/[project_id]/page.tsx
@@ -1,459 +1,108 @@
"use client";
-import { useEffect, useRef } from "react";
-import { useParams, useRouter } from "next/navigation";
+import { useParams } from "next/navigation";
import {
- ResizablePanelGroup,
- ResizablePanel,
- ResizableHandle,
+ ResizablePanelGroup,
+ ResizablePanel,
+ ResizableHandle,
} from "@/components/ui/resizable";
-import { MediaPanel } from "@/components/editor/media-panel";
-import { PropertiesPanel } from "@/components/editor/properties-panel";
+import { AssetsPanel } from "@/components/editor/panels/assets";
+import { PropertiesPanel } from "@/components/editor/panels/properties";
import { Timeline } from "@/components/editor/timeline";
-import { PreviewPanel } from "@/components/editor/preview-panel";
+import { PreviewPanel } from "@/components/editor/panels/preview";
import { EditorHeader } from "@/components/editor/editor-header";
-import { usePanelStore } from "@/stores/panel-store";
-import { useProjectStore } from "@/stores/project-store";
import { EditorProvider } from "@/components/providers/editor-provider";
-import { usePlaybackControls } from "@/hooks/use-playback-controls";
import { Onboarding } from "@/components/editor/onboarding";
+import { MigrationDialog } from "@/components/editor/dialogs/migration-dialog";
+import { usePanelStore } from "@/stores/panel-store";
export default function Editor() {
- const {
- toolsPanel,
- previewPanel,
- mainContent,
- timeline,
- setToolsPanel,
- setPreviewPanel,
- setMainContent,
- setTimeline,
- propertiesPanel,
- setPropertiesPanel,
- activePreset,
- resetCounter,
- } = usePanelStore();
-
- const {
- activeProject,
- loadProject,
- createNewProject,
- isInvalidProjectId,
- markProjectIdAsInvalid,
- } = useProjectStore();
- const params = useParams();
- const router = useRouter();
- const projectId = params.project_id as string;
- const handledProjectIds = useRef>(new Set());
- const isInitializingRef = useRef(false);
-
- usePlaybackControls();
-
- useEffect(() => {
- let isCancelled = false;
-
- const initProject = async () => {
- if (!projectId) {
- return;
- }
-
- // Prevent duplicate initialization
- if (isInitializingRef.current) {
- return;
- }
-
- // Check if project is already loaded
- if (activeProject?.id === projectId) {
- return;
- }
-
- // Check global invalid tracking first (most important for preventing duplicates)
- if (isInvalidProjectId(projectId)) {
- return;
- }
-
- // Check if we've already handled this project ID locally
- if (handledProjectIds.current.has(projectId)) {
- return;
- }
-
- // Mark as initializing to prevent race conditions
- isInitializingRef.current = true;
- handledProjectIds.current.add(projectId);
-
- try {
- await loadProject(projectId);
-
- // Check if component was unmounted during async operation
- if (isCancelled) {
- return;
- }
-
- // Project loaded successfully
- isInitializingRef.current = false;
- } catch (error) {
- // Check if component was unmounted during async operation
- if (isCancelled) {
- return;
- }
-
- // More specific error handling - only create new project for actual "not found" errors
- const isProjectNotFound =
- error instanceof Error &&
- (error.message.includes("not found") ||
- error.message.includes("does not exist") ||
- error.message.includes("Project not found"));
-
- if (isProjectNotFound) {
- // Mark this project ID as invalid globally BEFORE creating project
- markProjectIdAsInvalid(projectId);
-
- try {
- const newProjectId = await createNewProject("Untitled Project");
-
- // Check again if component was unmounted
- if (isCancelled) {
- return;
- }
-
- router.replace(`/editor/${newProjectId}`);
- } catch (createError) {
- console.error("Failed to create new project:", createError);
- }
- } else {
- // For other errors (storage issues, corruption, etc.), don't create new project
- console.error(
- "Project loading failed with recoverable error:",
- error
- );
- // Remove from handled set so user can retry
- handledProjectIds.current.delete(projectId);
- }
-
- isInitializingRef.current = false;
- }
- };
-
- initProject();
-
- // Cleanup function to cancel async operations
- return () => {
- isCancelled = true;
- isInitializingRef.current = false;
- };
- }, [
- projectId,
- loadProject,
- createNewProject,
- router,
- isInvalidProjectId,
- markProjectIdAsInvalid,
- ]);
-
- return (
-
-
-
-
- {activePreset === "media" ? (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ) : activePreset === "inspector" ? (
-
- setPropertiesPanel(100 - size)}
- className="min-w-0 min-h-0"
- >
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ) : activePreset === "vertical-preview" ? (
-
- setPreviewPanel(100 - size)}
- className="min-w-0 min-h-0"
- >
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ) : (
-
-
- {/* Main content area */}
-
- {/* Tools Panel */}
-
-
-
-
-
-
- {/* Preview Area */}
-
-
-
-
-
-
-
-
-
-
-
-
-
+ const params = useParams();
+ const projectId = params.project_id as string;
+
+ return (
+
+
+
+ );
+}
- {/* Timeline */}
-
-
-
-
- )}
-
-
-
-
- );
+function EditorLayout() {
+ const { panels, setPanel } = usePanelStore();
+
+ return (
+ {
+ setPanel("mainContent", sizes[0] ?? panels.mainContent);
+ setPanel("timeline", sizes[1] ?? panels.timeline);
+ }}
+ >
+
+ {
+ setPanel("tools", sizes[0] ?? panels.tools);
+ setPanel("preview", sizes[1] ?? panels.preview);
+ setPanel("properties", sizes[2] ?? panels.properties);
+ }}
+ >
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
}
--
cgit v1.3.1