UNPKG

@wener/console

Version:

Base console UI toolkit

99 lines (98 loc) 3.74 kB
import React, { useState } from "react"; import { createHashRouter, Outlet, RouterProvider } from "react-router-dom"; import { ErrorSuspenseBoundary, useAsyncEffect, useDebugRender } from "@wener/reaction"; import { useStore } from "zustand"; import { isDev } from "../const.js"; import { useLogger } from "../hooks/index.js"; import { getConsoleContext, NotFoundPage, PageErrorState } from "../web/index.js"; import { LoadingIndicator } from "./components/index.js"; import { RootRouterReactor } from "./components/RootRouterReactor.js"; import { getRouteStore, getSiteStore } from "./context.js"; var ServiceState = /*#__PURE__*/ function (ServiceState) { ServiceState["New"] = "New"; ServiceState["Pending"] = "Pending"; ServiceState["Done"] = "Done"; ServiceState["Error"] = "Error"; return ServiceState; }(ServiceState || {}); let _state = "New"; export const ConsoleLoader = ({ loadModule, modules = [], render, createRouter = createHashRouter, // createRootRoutes = _createRootRoutes, children, future = { v7_startTransition: true } }) => { const router = useStore(getRouteStore(), ({ router }) => router); useDebugRender(`ConsoleAppContent`); const log = useLogger("ConsoleContent"); const [state, _setState] = useState("New"); const setState = (s) => { // fixme avoid restrict mode rerender _state = s; _setState(s); }; useAsyncEffect(async () => { if (_state !== "New") { log(`Skip reinit APP`); return; } log("Initializing"); setState("Pending"); const moduleService = getConsoleContext().getModuleService(); moduleService.loader = loadModule; try { log(`Load modules: ${modules.join(", ")}`); await moduleService.loadModules(modules); if (isDev()) { console.log(`Loaded`, moduleService.modules); } } catch (e) { console.error("load module failed", e); setState("Error"); return; } const routes = await moduleService.createRoutes(); const router = createRouter(createRootRoutes({ children: routes, render })); getRouteStore().setState({ router, routes }); setState("Done"); log("Initialized"); if (isDev()) { log(`Final Store`, moduleService.store.getState()); } }, [ state ]); if (!router) { log(`Router not ready: ${state}`); return /*#__PURE__*/ React.createElement(LoadingIndicator, null); } return /*#__PURE__*/ React.createElement(React.Fragment, null, children, /*#__PURE__*/ React.createElement(RouterProvider, { router: router, fallbackElement: /*#__PURE__*/ React.createElement(LoadingIndicator, null), future: future })); }; function createRootRoutes({ children, render = (children) => children }) { return [ { element: /*#__PURE__*/ React.createElement(React.Fragment, null, /*#__PURE__*/ React.createElement(RootRouterReactor, null), render(/*#__PURE__*/ React.createElement(ErrorSuspenseBoundary, null, /*#__PURE__*/ React.createElement(Outlet, null)))), errorElement: /*#__PURE__*/ React.createElement(PageErrorState, null), handle: { title: getSiteStore().getState().title }, children: [ ...children, { path: "*", element: /*#__PURE__*/ React.createElement(NotFoundPage, null) } ] } ]; } //# sourceMappingURL=ConsoleLoader.js.map