- Rename all DB tables: properties → projects, properties_addresses → projects_addresses, properties_models → projects_models, property_likes → projects_likes - Add projects_likes as proper Drizzle schema table (was SQL-only before) - Rename ID prefixes: property_xxx → project_xxx - Rename auth_sessions column: active_property_id → active_project_id - Simplify project creation: address is now optional (no longer required to get started) - Update all actions, stores, types, components, and routes - Rename route: /editor/[propertyId] → /editor/[projectId] - Add SQL migration for table/column/index/policy/function renames - Update RPC functions: increment_project_views, get_project_like_count - Update storage bucket reference: project-thumbnails - All types/exports follow existing Drizzle patterns (pgTable, relations, zod schemas)
82 lines
2.9 KiB
TypeScript
82 lines
2.9 KiB
TypeScript
'use client'
|
|
|
|
import { initSpaceDetectionSync, initSpatialGridSync, useScene } from '@pascal-app/core'
|
|
import { Viewer } from '@pascal-app/viewer'
|
|
import { useKeyboard } from '@/hooks/use-keyboard'
|
|
import useEditor from '@/store/use-editor'
|
|
import { useProjectScene } from '@/features/community/lib/models/hooks'
|
|
import { useLocalProjectScene } from '@/features/community/lib/local-storage/hooks'
|
|
import { useAuth } from '@/features/community/lib/auth/hooks'
|
|
import { ZoneSystem } from '../systems/zone/zone-system'
|
|
import { ToolManager } from '../tools/tool-manager'
|
|
import { ActionMenu } from '../ui/action-menu'
|
|
import { PascalRadio } from '../pascal-radio'
|
|
import { PanelManager } from '../ui/panels/panel-manager'
|
|
import { HelperManager } from '../ui/helpers/helper-manager'
|
|
import { SidebarProvider } from '../ui/primitives/sidebar'
|
|
import { AppSidebar } from '../ui/sidebar/app-sidebar'
|
|
import { CustomCameraControls } from './custom-camera-controls'
|
|
import { ExportManager } from './export-manager'
|
|
import { Grid } from './grid'
|
|
import { SelectionManager } from './selection-manager'
|
|
import { initSFXBus } from '@/lib/sfx-bus'
|
|
import { ThumbnailGenerator } from '@/app/viewer/[id]/thumbnail-generator'
|
|
|
|
// Load default scene initially (will be replaced when project loads)
|
|
useScene.getState().loadScene()
|
|
initSpatialGridSync()
|
|
initSpaceDetectionSync(useScene, useEditor)
|
|
|
|
// Initialize SFX bus to connect events to sound effects
|
|
initSFXBus()
|
|
|
|
interface EditorProps {
|
|
projectId?: string
|
|
}
|
|
|
|
export default function Editor({ projectId }: EditorProps) {
|
|
useKeyboard()
|
|
const { isAuthenticated } = useAuth()
|
|
|
|
// Determine which mode to use
|
|
const isLocalProject = projectId?.startsWith('local_')
|
|
const shouldUseCloud = isAuthenticated && !isLocalProject
|
|
const shouldUseLocal = !shouldUseCloud && !!projectId
|
|
|
|
// Call hooks unconditionally (hooks internally check if they should activate)
|
|
// Cloud hook activates when there's an activeProject in the store
|
|
useProjectScene()
|
|
// Local hook activates when projectId is provided and starts with 'local_'
|
|
useLocalProjectScene(shouldUseLocal ? projectId : undefined)
|
|
|
|
return (
|
|
<div className="w-full h-full">
|
|
<ActionMenu />
|
|
<PanelManager />
|
|
<HelperManager />
|
|
|
|
{/* Top-right controls */}
|
|
<div className="pointer-events-none fixed top-4 right-4 z-50 flex items-start gap-2">
|
|
<div className="pointer-events-auto">
|
|
<PascalRadio />
|
|
</div>
|
|
</div>
|
|
|
|
<SidebarProvider className="fixed z-20">
|
|
<AppSidebar />
|
|
</SidebarProvider>
|
|
<Viewer selectionManager="custom">
|
|
<SelectionManager />
|
|
<ExportManager />
|
|
{/* Editor only system to toggle zone visibility */}
|
|
<ZoneSystem />
|
|
{/* <Stats /> */}
|
|
<Grid cellColor="#aaa" sectionColor="#ccc" fadeDistance={500} />
|
|
<ToolManager />
|
|
<CustomCameraControls />
|
|
<ThumbnailGenerator projectId={projectId} />
|
|
</Viewer>
|
|
</div>
|
|
)
|
|
}
|