diff --git a/src/components/Area.jsx b/src/components/Area.jsx index 6c213ff..edf7819 100644 --- a/src/components/Area.jsx +++ b/src/components/Area.jsx @@ -13,11 +13,12 @@ import { defaultTableTheme, State, } from "../data/data"; -import { AreaContext, StateContext, TabContext } from "../pages/Editor"; +import { StateContext, TabContext } from "../pages/Editor"; import useLayout from "../hooks/useLayout"; import useSettings from "../hooks/useSettings"; import useUndoRedo from "../hooks/useUndoRedo"; import useSelect from "../hooks/useSelect"; +import useAreas from "../hooks/useAreas"; export default function Area(props) { const [hovered, setHovered] = useState(false); @@ -26,7 +27,7 @@ export default function Area(props) { const { layout } = useLayout(); const { settings } = useSettings(); const { tab, setTab } = useContext(TabContext); - const { updateArea, deleteArea } = useContext(AreaContext); + const { updateArea, deleteArea } = useAreas(); const { setUndoStack, setRedoStack } = useUndoRedo(); const { selectedElement, setSelectedElement } = useSelect(); diff --git a/src/components/AreaOverview.jsx b/src/components/AreaOverview.jsx index 5f49494..e9f431a 100644 --- a/src/components/AreaOverview.jsx +++ b/src/components/AreaOverview.jsx @@ -26,12 +26,13 @@ import { ObjectType, State, } from "../data/data"; -import { AreaContext, StateContext } from "../pages/Editor"; +import { StateContext } from "../pages/Editor"; import useUndoRedo from "../hooks/useUndoRedo"; +import useAreas from "../hooks/useAreas"; export default function AreaOverview() { const { setState } = useContext(StateContext); - const { areas, addArea, deleteArea, updateArea } = useContext(AreaContext); + const { areas, addArea, deleteArea, updateArea } = useAreas(); const { setUndoStack, setRedoStack } = useUndoRedo(); const [editField, setEditField] = useState({}); const [value, setValue] = useState(""); diff --git a/src/components/Canvas.jsx b/src/components/Canvas.jsx index d10ca38..28b48f0 100644 --- a/src/components/Canvas.jsx +++ b/src/components/Canvas.jsx @@ -3,7 +3,7 @@ import Table from "./Table"; import { Action, Cardinality, Constraint, ObjectType } from "../data/data"; import Area from "./Area"; import Relationship from "./Relationship"; -import { AreaContext, NoteContext } from "../pages/Editor"; +import { NoteContext } from "../pages/Editor"; import Note from "./Note"; import { Toast } from "@douyinfe/semi-ui"; import useSettings from "../hooks/useSettings"; @@ -11,10 +11,11 @@ import useTransform from "../hooks/useTransform"; import useTables from "../hooks/useTables"; import useUndoRedo from "../hooks/useUndoRedo"; import useSelect from "../hooks/useSelect"; +import useAreas from "../hooks/useAreas"; export default function Canvas() { const { tables, updateTable, relationships, addRelationship } = useTables(); - const { areas, updateArea } = useContext(AreaContext); + const { areas, updateArea } = useAreas(); const { notes, updateNote } = useContext(NoteContext); const { settings } = useSettings(); const { setUndoStack, setRedoStack } = useUndoRedo(); diff --git a/src/components/ControlPanel.jsx b/src/components/ControlPanel.jsx index 6a45935..fe5355d 100644 --- a/src/components/ControlPanel.jsx +++ b/src/components/ControlPanel.jsx @@ -44,7 +44,6 @@ import { jsonToSQLServer, } from "../utils/toSQL"; import { - AreaContext, NoteContext, StateContext, TabContext, @@ -71,6 +70,7 @@ import useSelect from "../hooks/useSelect"; import { enterFullscreen, exitFullscreen } from "../utils/fullscreen"; import { ddbDiagramIsValid, jsonDiagramIsValid } from "../utils/validateSchema"; import { dataURItoBlob } from "../utils/utils"; +import useAreas from "../hooks/useAreas"; export default function ControlPanel({ diagramId, @@ -139,8 +139,7 @@ export default function ControlPanel({ useContext(TypeContext); const { notes, setNotes, updateNote, addNote, deleteNote } = useContext(NoteContext); - const { areas, setAreas, updateArea, addArea, deleteArea } = - useContext(AreaContext); + const { areas, setAreas, updateArea, addArea, deleteArea } = useAreas(); const { undoStack, redoStack, setUndoStack, setRedoStack } = useUndoRedo(); const { selectedElement, setSelectedElement } = useSelect(); const { tab, setTab } = useContext(TabContext); diff --git a/src/context/AreasContext.jsx b/src/context/AreasContext.jsx new file mode 100644 index 0000000..88eb692 --- /dev/null +++ b/src/context/AreasContext.jsx @@ -0,0 +1,96 @@ +import { createContext, useState } from "react"; +import { Action, ObjectType, defaultTableTheme } from "../data/data"; +import useUndoRedo from "../hooks/useUndoRedo"; +import useTransform from "../hooks/useTransform"; +import useSelect from "../hooks/useSelect"; + +export const AreasContext = createContext(null); + +export default function AreasContextProvider({ children }) { + const [areas, setAreas] = useState([]); + const { transform } = useTransform(); + const { selectedElement, setSelectedElement } = useSelect(); + const { setUndoStack, setRedoStack } = useUndoRedo(); + + const addArea = (addToHistory = true, data) => { + if (data) { + setAreas((prev) => { + const temp = prev.slice(); + temp.splice(data.id, 0, data); + return temp.map((t, i) => ({ ...t, id: i })); + }); + } else { + setAreas((prev) => [ + ...prev, + { + id: prev.length, + name: `area_${prev.length}`, + x: -transform.pan.x, + y: -transform.pan.y, + width: 200, + height: 200, + color: defaultTableTheme, + }, + ]); + } + if (addToHistory) { + setUndoStack((prev) => [ + ...prev, + { + action: Action.ADD, + element: ObjectType.AREA, + message: `Add new subject area`, + }, + ]); + setRedoStack([]); + } + }; + + const deleteArea = (id, addToHistory = true) => { + if (addToHistory) { + setUndoStack((prev) => [ + ...prev, + { + action: Action.DELETE, + element: ObjectType.AREA, + data: areas[id], + message: `Delete subject area`, + }, + ]); + setRedoStack([]); + } + setAreas((prev) => + prev.filter((e) => e.id !== id).map((e, i) => ({ ...e, id: i })) + ); + if (id === selectedElement.id) { + setSelectedElement({ + element: ObjectType.NONE, + id: -1, + openDialogue: false, + openCollapse: false, + }); + } + }; + + const updateArea = (id, values) => { + setAreas((prev) => + prev.map((t) => { + if (t.id === id) { + return { + ...t, + ...values, + }; + } + return t; + }) + ); + }; + + return ( + + {children} + + ); +} diff --git a/src/context/TablesContext.jsx b/src/context/TablesContext.jsx index 6a8906f..13f323d 100644 --- a/src/context/TablesContext.jsx +++ b/src/context/TablesContext.jsx @@ -1,6 +1,6 @@ import { createContext, useState } from "react"; -import useTransform from "../hooks/useTransform"; import { Action, ObjectType, defaultTableTheme } from "../data/data"; +import useTransform from "../hooks/useTransform"; import useUndoRedo from "../hooks/useUndoRedo"; import useSelect from "../hooks/useSelect"; diff --git a/src/hooks/useAreas.js b/src/hooks/useAreas.js new file mode 100644 index 0000000..b523e61 --- /dev/null +++ b/src/hooks/useAreas.js @@ -0,0 +1,6 @@ +import { useContext } from "react"; +import { AreasContext } from "../context/AreasContext"; + +export default function useAreas() { + return useContext(AreasContext); +} diff --git a/src/main.jsx b/src/main.jsx index 2fcc23a..8727b25 100644 --- a/src/main.jsx +++ b/src/main.jsx @@ -1,17 +1,14 @@ import ReactDOM from "react-dom/client"; -import App from "./App.jsx"; -import "./index.css"; import { LocaleProvider } from "@douyinfe/semi-ui"; import { Analytics } from "@vercel/analytics/react"; - +import App from "./App.jsx"; import en_US from "@douyinfe/semi-ui/lib/es/locale/source/en_US"; +import "./index.css"; const root = ReactDOM.createRoot(document.getElementById("root")); root.render( - // - // ); diff --git a/src/pages/Editor.jsx b/src/pages/Editor.jsx index d2ad19d..ebe4844 100644 --- a/src/pages/Editor.jsx +++ b/src/pages/Editor.jsx @@ -2,14 +2,7 @@ import { useState, createContext, useEffect, useCallback } from "react"; import ControlPanel from "../components/ControlPanel"; import Canvas from "../components/Canvas"; import SidePanel from "../components/SidePanel"; -import { - Tab, - defaultTableTheme, - defaultNoteTheme, - Action, - ObjectType, - State, -} from "../data/data"; +import { Tab, defaultNoteTheme, Action, ObjectType, State } from "../data/data"; import { db } from "../data/db"; import useLayout from "../hooks/useLayout"; import LayoutContextProvider from "../context/LayoutContext"; @@ -21,11 +14,12 @@ import TablesContextProvider from "../context/TablesContext"; import useUndoRedo from "../hooks/useUndoRedo"; import UndoRedoContextProvider from "../context/UndoRedoContext"; import SelectContextProvider from "../context/SelectContext"; +import AreasContextProvider from "../context/AreasContext"; import useSelect from "../hooks/useSelect"; import Controls from "../components/Controls"; +import useAreas from "../hooks/useAreas"; export const StateContext = createContext(); -export const AreaContext = createContext(); export const TabContext = createContext(); export const NoteContext = createContext(); export const TaskContext = createContext(); @@ -37,9 +31,11 @@ export default function Editor() { - - - + + + + + @@ -53,7 +49,6 @@ function WorkSpace() { const [state, setState] = useState(State.NONE); const [lastSaved, setLastSaved] = useState(""); const { tables, relationships, setTables, setRelationships } = useTables(); - const [areas, setAreas] = useState([]); const [notes, setNotes] = useState([]); const [types, setTypes] = useState([]); const [resize, setResize] = useState(false); @@ -63,6 +58,7 @@ function WorkSpace() { const { settings, setSettings } = useSettings(); const { transform, setTransform } = useTransform(); const { selectedElement, setSelectedElement } = useSelect(); + const { areas, setAreas } = useAreas(); const [tasks, setTasks] = useState([]); const { undoStack, redoStack, setUndoStack, setRedoStack } = useUndoRedo(); @@ -125,40 +121,6 @@ function WorkSpace() { ); }; - const addArea = (addToHistory = true, data) => { - if (data) { - setAreas((prev) => { - const temp = prev.slice(); - temp.splice(data.id, 0, data); - return temp.map((t, i) => ({ ...t, id: i })); - }); - } else { - setAreas((prev) => [ - ...prev, - { - id: prev.length, - name: `area_${prev.length}`, - x: -transform.pan.x, - y: -transform.pan.y, - width: 200, - height: 200, - color: defaultTableTheme, - }, - ]); - } - if (addToHistory) { - setUndoStack((prev) => [ - ...prev, - { - action: Action.ADD, - element: ObjectType.AREA, - message: `Add new subject area`, - }, - ]); - setRedoStack([]); - } - }; - const addNote = (addToHistory = true, data) => { if (data) { setNotes((prev) => { @@ -193,32 +155,6 @@ function WorkSpace() { } }; - const deleteArea = (id, addToHistory = true) => { - if (addToHistory) { - setUndoStack((prev) => [ - ...prev, - { - action: Action.DELETE, - element: ObjectType.AREA, - data: areas[id], - message: `Delete subject area`, - }, - ]); - setRedoStack([]); - } - setAreas((prev) => - prev.filter((e) => e.id !== id).map((e, i) => ({ ...e, id: i })) - ); - if (id === selectedElement.id) { - setSelectedElement({ - element: ObjectType.NONE, - id: -1, - openDialogue: false, - openCollapse: false, - }); - } - }; - const deleteNote = (id, addToHistory = true) => { if (addToHistory) { setUndoStack((prev) => [ @@ -245,20 +181,6 @@ function WorkSpace() { } }; - const updateArea = (id, values) => { - setAreas((prev) => - prev.map((t) => { - if (t.id === id) { - return { - ...t, - ...values, - }; - } - return t; - }) - ); - }; - const updateNote = (id, values) => { setNotes((prev) => prev.map((t) => { @@ -510,63 +432,60 @@ function WorkSpace() { setUndoStack, setRelationships, setTables, + setAreas, ]); return ( - - - - -
- - + +
+ + + +
setResize(false)} + onMouseMove={dragHandler} + > + {layout.sidebar && ( + - -
setResize(false)} - onMouseMove={dragHandler} - > - {layout.sidebar && ( - + )} +
+ + {!(layout.sidebar || layout.toolbar || layout.header) && ( +
+ +
)} -
- - {!(layout.sidebar || layout.toolbar || layout.header) && ( -
- -
- )} -
- - - - +
+ + + ); }