UNPKG

@ducor/react

Version:

admin template ui interface

98 lines (97 loc) 3.9 kB
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; // AdminProvider.tsx import { useContext, useState, useEffect, useRef, memo, useMemo, } from "react"; import Customizer from "../customizer/admin"; import ThemeProvider from "./theme"; import BreakpointProvider from "./breakpoint"; import LoadingProvider from "./loading"; import MemoComponent from "../components/memo-component"; import Style, { css } from "./components/style"; import { AdminContext } from "../hooks/use-admin"; const initialState = { //html DIRECTION HTML_DIRECTION: "ltr", // manage layout // LAYOUT_BOX: "full", HEADER_LOCATION: "top", SIDEBAR_LOCATION: "left", HEADER_POSITION: "static", SIDEBAR_POSITION: "static", SIDEBAR_TYPE: "full", SIDEBAR_SHOW: true, //SIDEBAR_RESIZE SIDEBAR_RESIZER_ISACTIVE: false, SIDEBAR_RESIZER_WIDTH: null, OVER_WRITE_LAYOUT: false, TYPOGRAPHY_LTR: "Poppins", TYPOGRAPHY_RTL: "Almarai", }; /** * Current theme mode * * @returns */ export const useLayout = (name) => { const context = useContext(AdminContext); if (!context) { throw new Error("useLayout must be used within an AdminProvider"); } useEffect(() => { if (typeof name === "string") { context.setLayout(name); } return () => { if (typeof name === "string") { context.setLayout(); } }; }, [name]); return null; }; const Provider = ({ children, config = {} }) => { const isMount = useRef(false); const [data, setDataState] = useState(initialState); const [layout, setLayout] = useState(null); useEffect(() => { isMount.current = true; return () => { isMount.current = false; }; }, []); const autoLayout = useMemo(() => { const { HEADER_LOCATION, SIDEBAR_LOCATION, SIDEBAR_SHOW, SIDEBAR_TYPE } = data; // remove all of classes // sidebar-layout="du-layout-1.1" const layout = `du-${SIDEBAR_TYPE}-hh-${HEADER_LOCATION}-ss-${SIDEBAR_LOCATION}${SIDEBAR_SHOW ? "-show" : ""}`; return layout; }, [data]); const setAdminData = (key, value) => { setDataState((prevData) => (Object.assign(Object.assign({}, prevData), { [key]: value }))); }; const toCss = () => { const { SIDEBAR_RESIZER_WIDTH, TYPOGRAPHY_LTR, TYPOGRAPHY_RTL } = data; if (!isMount.current) { return ""; } const root = { ":root": { "--sidebar-width": SIDEBAR_RESIZER_WIDTH ? SIDEBAR_RESIZER_WIDTH : "var(--du-sidebar-vertical-full)", "--font-sans": `"${TYPOGRAPHY_LTR}", sans-serif`, "--font-sans-rtl": `"${TYPOGRAPHY_RTL}", serif`, }, }; return css(Object.assign({}, root), true); }; const handleOverWiteLayout = (layoutName) => { setLayout(layoutName || null); setAdminData("OVER_WRITE_LAYOUT", typeof layoutName === "string"); }; return (_jsx(BreakpointProvider, { children: _jsxs(LoadingProvider, { defaultLoading: config.defaultLoading, children: [_jsx(Style, { href: `https://fonts.googleapis.com/css?family=${data.TYPOGRAPHY_LTR}` }), _jsx(Style, { href: `https://fonts.googleapis.com/css?family=${data.TYPOGRAPHY_RTL}` }), _jsx(Style, { value: toCss() }), _jsx(AdminContext.Provider, { value: { adminData: data, setAdminData, setLayout: handleOverWiteLayout, }, children: _jsx("div", { dir: data.HTML_DIRECTION, children: _jsxs(ThemeProvider, { children: [_jsx("div", { "data-layout": layout || autoLayout, children: _jsx(MemoComponent, { component: children }) }), _jsx(Customizer, {})] }) }) })] }) })); }; export const AdminProvider = memo(Provider);