Abstract LayoutContext

This commit is contained in:
1ilit 2024-03-09 19:42:09 +02:00
parent c9ad695abb
commit 610e2fa5c5
12 changed files with 77 additions and 27 deletions

View File

@ -6,6 +6,7 @@ import Shortcuts from "./pages/Shortcuts";
import Templates from "./pages/Templates"; import Templates from "./pages/Templates";
import { useEffect } from "react"; import { useEffect } from "react";
import LandingPage from "./pages/LandingPage"; import LandingPage from "./pages/LandingPage";
import LayoutContextProvider from "./context/LayoutContext";
const Wrapper = ({ children }) => { const Wrapper = ({ children }) => {
const location = useLocation(); const location = useLocation();
@ -21,7 +22,14 @@ function App() {
<Wrapper> <Wrapper>
<Routes> <Routes>
<Route path="/" element={<LandingPage />} /> <Route path="/" element={<LandingPage />} />
<Route path="/editor" element={<Editor />} /> <Route
path="/editor"
element={
<LayoutContextProvider>
<Editor />
</LayoutContextProvider>
}
/>
<Route path="/survey" element={<Survey />} /> <Route path="/survey" element={<Survey />} />
<Route path="/shortcuts" element={<Shortcuts />} /> <Route path="/shortcuts" element={<Shortcuts />} />
<Route path="/bug_report" element={<BugReport />} /> <Route path="/bug_report" element={<BugReport />} />

View File

@ -15,17 +15,19 @@ import {
} from "../data/data"; } from "../data/data";
import { import {
AreaContext, AreaContext,
LayoutContext,
SelectContext, SelectContext,
SettingsContext, SettingsContext,
StateContext,
TabContext, TabContext,
UndoRedoContext, UndoRedoContext,
} from "../pages/Editor"; } from "../pages/Editor";
import useLayout from "../hooks/useLayout";
export default function Area(props) { export default function Area(props) {
const [hovered, setHovered] = useState(false); const [hovered, setHovered] = useState(false);
const [editField, setEditField] = useState({}); const [editField, setEditField] = useState({});
const { layout, setState } = useContext(LayoutContext); const { setState } = useContext(StateContext);
const {layout} = useLayout();
const { settings } = useContext(SettingsContext); const { settings } = useContext(SettingsContext);
const { tab, setTab } = useContext(TabContext); const { tab, setTab } = useContext(TabContext);
const { updateArea, deleteArea } = useContext(AreaContext); const { updateArea, deleteArea } = useContext(AreaContext);

View File

@ -26,10 +26,10 @@ import {
ObjectType, ObjectType,
State, State,
} from "../data/data"; } from "../data/data";
import { AreaContext, LayoutContext, UndoRedoContext } from "../pages/Editor"; import { AreaContext, StateContext, UndoRedoContext } from "../pages/Editor";
export default function AreaOverview() { export default function AreaOverview() {
const { setState } = useContext(LayoutContext); const { setState } = useContext(StateContext);
const { areas, addArea, deleteArea, updateArea } = useContext(AreaContext); const { areas, addArea, deleteArea, updateArea } = useContext(AreaContext);
const { setUndoStack, setRedoStack } = useContext(UndoRedoContext); const { setUndoStack, setRedoStack } = useContext(UndoRedoContext);
const [editField, setEditField] = useState({}); const [editField, setEditField] = useState({});

View File

@ -50,10 +50,10 @@ import {
} from "../utils"; } from "../utils";
import { import {
AreaContext, AreaContext,
LayoutContext,
NoteContext, NoteContext,
SelectContext, SelectContext,
SettingsContext, SettingsContext,
StateContext,
TabContext, TabContext,
TableContext, TableContext,
TypeContext, TypeContext,
@ -71,6 +71,7 @@ import { useLiveQuery } from "dexie-react-hooks";
import { Parser } from "node-sql-parser"; import { Parser } from "node-sql-parser";
import Todo from "./Todo"; import Todo from "./Todo";
import { Thumbnail } from "./Thumbnail"; import { Thumbnail } from "./Thumbnail";
import useLayout from "../hooks/useLayout";
export default function ControlPanel({ export default function ControlPanel({
diagramId, diagramId,
@ -120,7 +121,8 @@ export default function ControlPanel({
message: "", message: "",
}); });
const [data, setData] = useState(null); const [data, setData] = useState(null);
const { layout, setLayout, state, setState } = useContext(LayoutContext); const { state, setState } = useContext(StateContext);
const {layout, setLayout} = useLayout();
const { settings, setSettings } = useContext(SettingsContext); const { settings, setSettings } = useContext(SettingsContext);
const { const {
relationships, relationships,

View File

@ -1,10 +1,10 @@
import { useContext, useState } from "react"; import { useContext, useState } from "react";
import { import {
LayoutContext,
NoteContext, NoteContext,
UndoRedoContext, UndoRedoContext,
TabContext, TabContext,
SelectContext, SelectContext,
StateContext,
} from "../pages/Editor"; } from "../pages/Editor";
import { Action, ObjectType, noteThemes, Tab, State } from "../data/data"; import { Action, ObjectType, noteThemes, Tab, State } from "../data/data";
import { Input, Button, Popover, Toast } from "@douyinfe/semi-ui"; import { Input, Button, Popover, Toast } from "@douyinfe/semi-ui";
@ -13,6 +13,7 @@ import {
IconDeleteStroked, IconDeleteStroked,
IconCheckboxTick, IconCheckboxTick,
} from "@douyinfe/semi-icons"; } from "@douyinfe/semi-icons";
import useLayout from "../hooks/useLayout";
export default function Note(props) { export default function Note(props) {
const [editField, setEditField] = useState({}); const [editField, setEditField] = useState({});
@ -22,7 +23,8 @@ export default function Note(props) {
const fold = 24; const fold = 24;
const { updateNote, deleteNote } = useContext(NoteContext); const { updateNote, deleteNote } = useContext(NoteContext);
const { setUndoStack, setRedoStack } = useContext(UndoRedoContext); const { setUndoStack, setRedoStack } = useContext(UndoRedoContext);
const { layout, setState } = useContext(LayoutContext); const { setState } = useContext(StateContext);
const { layout } = useLayout();
const { tab, setTab } = useContext(TabContext); const { tab, setTab } = useContext(TabContext);
const { selectedElement, setSelectedElement } = useContext(SelectContext); const { selectedElement, setSelectedElement } = useContext(SelectContext);

View File

@ -4,14 +4,15 @@ import TableOverview from "./TableOverview";
import ReferenceOverview from "./ReferenceOverview"; import ReferenceOverview from "./ReferenceOverview";
import AreaOverview from "./AreaOverview"; import AreaOverview from "./AreaOverview";
import { Tab } from "../data/data"; import { Tab } from "../data/data";
import { LayoutContext, TabContext } from "../pages/Editor"; import { TabContext } from "../pages/Editor";
import NotesOverview from "./NotesOverview"; import NotesOverview from "./NotesOverview";
import Issues from "./Issues"; import Issues from "./Issues";
import TypesOverview from "./TypesOverview"; import TypesOverview from "./TypesOverview";
import useLayout from "../hooks/useLayout";
const SidePanel = (props) => { const SidePanel = (props) => {
const { tab, setTab } = useContext(TabContext); const { tab, setTab } = useContext(TabContext);
const { layout } = useContext(LayoutContext); const { layout } = useLayout();
const tabList = [ const tabList = [
{ tab: "Tables", itemKey: Tab.tables }, { tab: "Tables", itemKey: Tab.tables },

View File

@ -32,7 +32,6 @@ import {
Toast, Toast,
} from "@douyinfe/semi-ui"; } from "@douyinfe/semi-ui";
import { import {
LayoutContext,
SelectContext, SelectContext,
SettingsContext, SettingsContext,
TabContext, TabContext,
@ -41,12 +40,13 @@ import {
UndoRedoContext, UndoRedoContext,
} from "../pages/Editor"; } from "../pages/Editor";
import { getSize, hasCheck, hasPrecision, isSized } from "../utils"; import { getSize, hasCheck, hasPrecision, isSized } from "../utils";
import useLayout from "../hooks/useLayout";
export default function Table(props) { export default function Table(props) {
const [isHovered, setIsHovered] = useState(false); const [isHovered, setIsHovered] = useState(false);
const [hoveredField, setHoveredField] = useState(-1); const [hoveredField, setHoveredField] = useState(-1);
const [editField, setEditField] = useState({}); const [editField, setEditField] = useState({});
const { layout } = useContext(LayoutContext); const { layout } = useLayout();
const { deleteTable, updateTable, updateField, setRelationships } = const { deleteTable, updateTable, updateField, setRelationships } =
useContext(TableContext); useContext(TableContext);
const { tab, setTab } = useContext(TabContext); const { tab, setTab } = useContext(TabContext);

View File

@ -19,7 +19,7 @@ import {
IconDeleteStroked, IconDeleteStroked,
IconCaretdown, IconCaretdown,
} from "@douyinfe/semi-icons"; } from "@douyinfe/semi-icons";
import { LayoutContext, TaskContext } from "../pages/Editor"; import { StateContext, TaskContext } from "../pages/Editor";
import { State } from "../data/data"; import { State } from "../data/data";
export default function Todo() { export default function Todo() {
const Priority = { const Priority = {
@ -37,7 +37,7 @@ export default function Todo() {
const [activeTask, setActiveTask] = useState(-1); const [activeTask, setActiveTask] = useState(-1);
const [, setSortOrder] = useState(SortOrder.ORIGINAL); const [, setSortOrder] = useState(SortOrder.ORIGINAL);
const { tasks, setTasks, updateTask } = useContext(TaskContext); const { tasks, setTasks, updateTask } = useContext(TaskContext);
const { setState } = useContext(LayoutContext); const { setState } = useContext(StateContext);
const priorityLabel = (p) => { const priorityLabel = (p) => {
switch (p) { switch (p) {

View File

@ -0,0 +1,19 @@
import { createContext, useState } from "react";
export const LayoutContext = createContext();
export default function LayoutContextProvider({ children }) {
const [layout, setLayout] = useState({
header: true,
sidebar: true,
issues: true,
toolbar: true,
fullscreen: false,
});
return (
<LayoutContext.Provider value={{ layout, setLayout }}>
{children}
</LayoutContext.Provider>
);
}

13
src/hooks/useLayout.js Normal file
View File

@ -0,0 +1,13 @@
import { useContext } from "react";
import { LayoutContext } from "../context/LayoutContext";
/**
* Access layout state
*
* Layout includes: header, sidebar, toolbar, issues, fullscreen
*
* @returns `{ layout, setLayout }`
*/
export default function useLayout() {
return useContext(LayoutContext);
}

View File

@ -72,7 +72,7 @@ function Form({ theme }) {
}) })
.then(() => { .then(() => {
Toast.success("Bug reported!"); Toast.success("Bug reported!");
editor.dispatchCommand(CLEAR_EDITOR_COMMAND, undefined); editor.dispatchCommand(CLEAR_EDITOR_COMMAND, null);
resetForm(); resetForm();
}) })
.catch(() => { .catch(() => {

View File

@ -13,8 +13,10 @@ import {
import { db } from "../data/db"; import { db } from "../data/db";
import { Divider, Tooltip } from "@douyinfe/semi-ui"; import { Divider, Tooltip } from "@douyinfe/semi-ui";
import { exitFullscreen } from "../utils"; import { exitFullscreen } from "../utils";
import useLayout from "../hooks/useLayout";
import LayoutContextProvider from "../context/LayoutContext";
export const LayoutContext = createContext(); export const StateContext = createContext();
export const TableContext = createContext(); export const TableContext = createContext();
export const AreaContext = createContext(); export const AreaContext = createContext();
export const TabContext = createContext(); export const TabContext = createContext();
@ -28,6 +30,14 @@ export const BotMessageContext = createContext();
export const TypeContext = createContext(); export const TypeContext = createContext();
export default function Editor() { export default function Editor() {
return (
<LayoutContextProvider>
<WorkSpace />
</LayoutContextProvider>
);
}
function WorkSpace() {
const [id, setId] = useState(0); const [id, setId] = useState(0);
const [title, setTitle] = useState("Untitled Diagram"); const [title, setTitle] = useState("Untitled Diagram");
const [state, setState] = useState(State.NONE); const [state, setState] = useState(State.NONE);
@ -40,14 +50,7 @@ export default function Editor() {
const [resize, setResize] = useState(false); const [resize, setResize] = useState(false);
const [width, setWidth] = useState(340); const [width, setWidth] = useState(340);
const [tab, setTab] = useState(Tab.tables); const [tab, setTab] = useState(Tab.tables);
const [layout, setLayout] = useState({ const { layout, setLayout } = useLayout();
header: true,
sidebar: true,
services: true,
issues: true,
toolbar: true,
fullscreen: false,
});
const [settings, setSettings] = useState({ const [settings, setSettings] = useState({
strictMode: false, strictMode: false,
showFieldSummary: true, showFieldSummary: true,
@ -704,7 +707,7 @@ export default function Editor() {
}, []); }, []);
return ( return (
<LayoutContext.Provider value={{ layout, setLayout, state, setState }}> <StateContext.Provider value={{ state, setState }}>
<TableContext.Provider <TableContext.Provider
value={{ value={{
tables, tables,
@ -833,6 +836,6 @@ export default function Editor() {
</NoteContext.Provider> </NoteContext.Provider>
</AreaContext.Provider> </AreaContext.Provider>
</TableContext.Provider> </TableContext.Provider>
</LayoutContext.Provider> </StateContext.Provider>
); );
} }