Abstract LayoutContext
This commit is contained in:
parent
c9ad695abb
commit
610e2fa5c5
10
src/App.jsx
10
src/App.jsx
@ -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 />} />
|
||||||
|
@ -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);
|
||||||
|
@ -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({});
|
||||||
|
@ -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,
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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 },
|
||||||
|
@ -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);
|
||||||
|
@ -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) {
|
||||||
|
19
src/context/LayoutContext.jsx
Normal file
19
src/context/LayoutContext.jsx
Normal 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
13
src/hooks/useLayout.js
Normal 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);
|
||||||
|
}
|
@ -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(() => {
|
||||||
|
@ -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>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user