drawDB/src/pages/editor.jsx

106 lines
3.6 KiB
React
Raw Normal View History

2023-09-19 20:48:51 +08:00
import React, { useState, createContext, useEffect } from "react";
2023-09-19 20:46:48 +08:00
import Sidebar from "../components/sidebar";
import ControlPanel from "../components/control_panel";
2023-09-19 20:47:01 +08:00
import { DndProvider } from "react-dnd";
import { HTML5Backend } from "react-dnd-html5-backend";
2023-09-19 20:47:43 +08:00
import Canvas from "../components/canvas";
2023-09-19 20:47:01 +08:00
import EditorPanel from "../components/editor_panel";
2023-09-19 20:48:57 +08:00
import { Tab } from "../data/data";
2023-09-19 20:48:46 +08:00
export const LayoutContext = createContext();
2023-09-19 20:48:48 +08:00
export const TableContext = createContext();
2023-09-19 20:48:49 +08:00
export const AreaContext = createContext();
2023-09-19 20:48:57 +08:00
export const TabContext = createContext();
2023-09-19 20:49:09 +08:00
export const NoteContext = createContext();
2023-09-19 20:49:14 +08:00
export const SettingsContext = createContext();
2023-09-19 20:48:46 +08:00
2023-09-19 20:46:46 +08:00
export default function Editor(props) {
2023-09-19 20:46:56 +08:00
const [code, setCode] = useState("");
const [tables, setTables] = useState([]);
const [relationships, setRelationships] = useState([]);
2023-09-19 20:48:04 +08:00
const [areas, setAreas] = useState([]);
2023-09-19 20:49:09 +08:00
const [notes, setNotes] = useState([]);
2023-09-19 20:48:30 +08:00
const [resize, setResize] = useState(false);
2023-09-19 20:49:14 +08:00
const [width, setWidth] = useState(320);
2023-09-19 20:48:53 +08:00
const [selectedTable, setSelectedTable] = useState("");
2023-09-19 20:48:57 +08:00
const [tab, setTab] = useState(Tab.tables);
2023-09-19 20:48:34 +08:00
const [layout, setLayout] = useState({
header: true,
sidebar: true,
services: true,
tables: true,
2023-09-19 20:48:55 +08:00
areas: true,
2023-09-19 20:48:34 +08:00
relationships: true,
issues: true,
editor: true,
2023-09-19 20:49:09 +08:00
notes: true,
2023-09-19 20:48:35 +08:00
fullscreen: false,
2023-09-19 20:48:34 +08:00
});
2023-09-19 20:49:14 +08:00
const [settings, setSettings] = useState({
strictMode: false,
2023-09-19 20:49:16 +08:00
showFieldSummary: true,
2023-09-19 20:49:36 +08:00
zoom: 1,
2023-09-19 20:49:37 +08:00
showGrid: true,
2023-09-19 20:49:14 +08:00
});
2023-09-19 20:48:31 +08:00
const dragHandler = (e) => {
if (!resize) return;
const w = e.clientX;
2023-09-19 20:49:14 +08:00
if (w > 320) setWidth(w);
2023-09-19 20:48:31 +08:00
};
2023-09-19 20:46:56 +08:00
2023-09-19 20:48:57 +08:00
useEffect(() => {
2023-09-19 20:48:51 +08:00
document.title = "Editor";
2023-09-19 20:48:57 +08:00
}, []);
2023-09-19 20:48:51 +08:00
2023-09-19 20:46:46 +08:00
return (
2023-09-19 20:48:49 +08:00
<LayoutContext.Provider value={{ layout, setLayout }}>
<TableContext.Provider
value={{ tables, setTables, relationships, setRelationships }}
>
<AreaContext.Provider value={{ areas, setAreas }}>
2023-09-19 20:49:09 +08:00
<NoteContext.Provider value={{ notes, setNotes }}>
<TabContext.Provider value={{ tab, setTab }}>
2023-09-19 20:49:14 +08:00
<SettingsContext.Provider value={{settings, setSettings}}>
<div className="h-[100vh] overflow-hidden">
<ControlPanel />
<div
className={
layout.header
? `flex h-[calc(100vh-123.93px)]`
: `flex h-[calc(100vh-51.97px)]`
}
onMouseUp={() => setResize(false)}
onMouseMove={dragHandler}
>
<DndProvider backend={HTML5Backend}>
{layout.sidebar && (
<EditorPanel
code={code}
setCode={setCode}
resize={resize}
setResize={setResize}
width={width}
selectedTable={selectedTable}
setSelectedTable={setSelectedTable}
/>
)}
<Canvas
2023-09-19 20:49:09 +08:00
code={code}
setCode={setCode}
selectedTable={selectedTable}
setSelectedTable={setSelectedTable}
/>
2023-09-19 20:49:14 +08:00
</DndProvider>
{layout.services && <Sidebar />}
</div>
2023-09-19 20:49:09 +08:00
</div>
2023-09-19 20:49:14 +08:00
</SettingsContext.Provider>
2023-09-19 20:49:09 +08:00
</TabContext.Provider>
</NoteContext.Provider>
2023-09-19 20:48:49 +08:00
</AreaContext.Provider>
2023-09-19 20:48:48 +08:00
</TableContext.Provider>
2023-09-19 20:48:46 +08:00
</LayoutContext.Provider>
2023-09-19 20:46:46 +08:00
);
}