import { useCallback, useState } from "react"; import { Canvas } from "@react-three/fiber"; import { EditorControls } from "@/features/editor/components/EditorControls"; import { useEditorHistory } from "@/features/editor/hooks/useEditorHistory"; import { useEditorSceneData } from "@/features/editor/hooks/useEditorSceneData"; import { EditorScene } from "@/features/editor/scene/EditorScene"; import type { MapNode, TransformMode } from "@/types/editor"; export function EditorPage(): React.JSX.Element { const { hasMapJson, isMapLoading, sceneData, setSceneData, handleFolderUpload, } = useEditorSceneData(); const [selectedNodeIndex, setSelectedNodeIndex] = useState( null, ); const [hoveredNodeIndex, setHoveredNodeIndex] = useState(null); const [transformMode, setTransformMode] = useState("translate"); const [isPlayerMode, setIsPlayerMode] = useState(false); const { undoCount, redoCount, handleUndo, handleRedo, handleTransformStart, handleTransformEnd, } = useEditorHistory(sceneData, setSceneData); const handleSelectNode = useCallback((index: number | null) => { setSelectedNodeIndex(index); }, []); const handleHoverNode = useCallback((index: number | null) => { setHoveredNodeIndex(index); }, []); const handleTransformModeChange = useCallback((mode: TransformMode) => { setTransformMode(mode); }, []); const handleSaveToServer = useCallback(async () => { if (!sceneData) return; const json = JSON.stringify(sceneData.mapNodes, null, 2); try { const response = await fetch("/api/save-map", { method: "POST", headers: { "Content-Type": "application/json" }, body: json, }); if (response.ok) { alert("Map enregistrée avec succès!"); } else { alert("Erreur lors de l'enregistrement"); } } catch (err) { console.error("Error saving map:", err); alert("Erreur lors de l'enregistrement"); } }, [sceneData]); const handleExportJson = useCallback(() => { if (!sceneData) return; const json = JSON.stringify(sceneData.mapNodes, null, 2); const blob = new Blob([json], { type: "application/json" }); const url = URL.createObjectURL(blob); const a = document.createElement("a"); a.href = url; a.download = "map.json"; a.click(); window.setTimeout(() => URL.revokeObjectURL(url), 0); }, [sceneData]); const handlePlayerMode = useCallback(() => { setIsPlayerMode((prev) => !prev); }, []); const handleNodeTransform = useCallback( (nodeIndex: number, updatedNode: MapNode) => { setSceneData((prev) => { if (!prev) return null; const newMapNodes = [...prev.mapNodes]; newMapNodes[nodeIndex] = updatedNode; return { ...prev, mapNodes: newMapNodes }; }); }, [setSceneData], ); if (isMapLoading) { return (

Chargement de l'éditeur...

Vérification de map.json dans public/

); } if (!hasMapJson) { return (

Erreur : map.json introuvable

Le fichier map.json est requis dans le dossier public/.

Télécharger un dossier contenant map.json

Structure requise :

                public/ ├── map.json (à la racine) └── models/
                ├── arbre/ │ └── model.gltf ├── building/ │ └── model.gltf └──
                ...
              
); } return (
{ gl.setClearColor("#050505"); }} > {sceneData && ( )}
); }