UNPKG

@nlabs/gothamjs

Version:
107 lines (106 loc) 12.9 kB
import { Logger, LoggerDebugLevel } from "@nlabs/arkhamjs-middleware-logger"; import { BrowserStorage } from "@nlabs/arkhamjs-storage-browser"; import { useFlux } from "@nlabs/arkhamjs-utils-react"; import { merge } from "@nlabs/utils"; import { useEffect, useMemo, useState } from "react"; import { I18nextProvider } from "react-i18next"; import { createBrowserRouter, RouterProvider } from "react-router"; import { GothamActions } from "../../actions/GothamActions.js"; import { Config } from "../../config/appConfig.js"; import { GothamConstants } from "../../constants/GothamConstants.js"; import { gothamApp } from "../../stores/GothamAppStore.js"; import { GothamContext } from "../../utils/GothamContext.js"; import { parseRoutes } from "../../utils/routeUtils.js"; import { GothamRoot } from "./GothamRoot.js"; import { jsx, jsxs } from "react/jsx-runtime"; const defaultGothamConfig = { app: { name: "gotham", title: "GothamJS" }, baseUrl: "", isAuth: () => false, middleware: [], routes: [], storageType: "session", stores: [], theme: {}, translations: { translation: {} } }; const init = (config) => () => { const { onInit } = config; GothamActions.init(); if (onInit) { onInit(); } }; const signOut = (flux) => async () => { await flux.clearAppData(); await GothamActions.loading(false); GothamActions.navGoto("/signIn"); }; const GothamProvider = ({ children, config: appConfig }) => { const flux = useFlux(); const config = merge(defaultGothamConfig, appConfig); const { isAuth, middleware, routes = [], storageType, stores, i18n } = config; const name = config?.app?.name; const [session, setSession] = useState({}); const router = useMemo(() => { return createBrowserRouter( [ { Component: GothamRoot, children: parseRoutes(routes), index: false, path: "/" } ] ); }, [routes]); useEffect(() => { Config.set(config); if (flux) { const env = Config.get("environment"); const logger = new Logger({ debugLevel: env === "development" ? LoggerDebugLevel.DISPATCH : LoggerDebugLevel.DISABLED }); const storage = new BrowserStorage({ type: storageType }); flux.init({ middleware: [logger, ...middleware || []], name, // state: {app: {title}}, storage, stores: [gothamApp, ...stores || []] }); flux.on(GothamConstants.SIGN_OUT, signOut(flux)); flux.on(GothamConstants.UPDATE_SESSION, ({ session: session2 }) => { setSession(session2); }); } init(config); }, [flux, config, middleware, name, storageType, stores]); if (i18n) { return /* @__PURE__ */ jsx(I18nextProvider, { i18n, children: /* @__PURE__ */ jsxs(GothamContext.Provider, { value: { Flux: flux, isAuth, session }, children: [ router && /* @__PURE__ */ jsx(RouterProvider, { router }), children ] }) }); } return /* @__PURE__ */ jsxs(GothamContext.Provider, { value: { Flux: flux, isAuth, session }, children: [ router && /* @__PURE__ */ jsx(RouterProvider, { router }), children ] }); }; export { GothamProvider, defaultGothamConfig, init, signOut }; //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3ZpZXdzL0dvdGhhbS9Hb3RoYW1Qcm92aWRlci50c3giXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDI0LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQge0xvZ2dlciwgTG9nZ2VyRGVidWdMZXZlbH0gZnJvbSAnQG5sYWJzL2Fya2hhbWpzLW1pZGRsZXdhcmUtbG9nZ2VyJztcbmltcG9ydCB7QnJvd3NlclN0b3JhZ2V9IGZyb20gJ0BubGFicy9hcmtoYW1qcy1zdG9yYWdlLWJyb3dzZXInO1xuaW1wb3J0IHt1c2VGbHV4fSBmcm9tICdAbmxhYnMvYXJraGFtanMtdXRpbHMtcmVhY3QnO1xuaW1wb3J0IHttZXJnZX0gZnJvbSAnQG5sYWJzL3V0aWxzJztcbmltcG9ydCBpMThuIGZyb20gJ2kxOG5leHQnO1xuaW1wb3J0IHt1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZVN0YXRlfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge0kxOG5leHRQcm92aWRlcn0gZnJvbSAncmVhY3QtaTE4bmV4dCc7XG5pbXBvcnQge2NyZWF0ZUJyb3dzZXJSb3V0ZXIsIFJvdXRlclByb3ZpZGVyfSBmcm9tICdyZWFjdC1yb3V0ZXInO1xuXG5pbXBvcnQge0dvdGhhbUFjdGlvbnN9IGZyb20gJy4uLy4uL2FjdGlvbnMvR290aGFtQWN0aW9ucy5qcyc7XG5pbXBvcnQge0NvbmZpZ30gZnJvbSAnLi4vLi4vY29uZmlnL2FwcENvbmZpZy5qcyc7XG5pbXBvcnQge0dvdGhhbUNvbnN0YW50c30gZnJvbSAnLi4vLi4vY29uc3RhbnRzL0dvdGhhbUNvbnN0YW50cy5qcyc7XG5pbXBvcnQge2dvdGhhbUFwcH0gZnJvbSAnLi4vLi4vc3RvcmVzL0dvdGhhbUFwcFN0b3JlLmpzJztcbmltcG9ydCB7R290aGFtQ29udGV4dH0gZnJvbSAnLi4vLi4vdXRpbHMvR290aGFtQ29udGV4dC5qcyc7XG5cbmltcG9ydCB0eXBlIHtGbHV4RnJhbWV3b3JrLCBGbHV4TWlkZGxld2FyZVR5cGUsIEZsdXhPcHRpb25zfSBmcm9tICdAbmxhYnMvYXJraGFtanMnO1xuaW1wb3J0IHR5cGUge0ZDLCBSZWFjdE5vZGV9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHtHb3RoYW1Sb3V0ZURhdGF9IGZyb20gJy4uLy4uL3R5cGVzL2dvdGhhbS5qcyc7XG5pbXBvcnQge3BhcnNlUm91dGVzLCB0eXBlIEN1c3RvbVJvdXRlUHJvcHN9IGZyb20gJy4uLy4uL3V0aWxzL3JvdXRlVXRpbHMuanMnO1xuaW1wb3J0IHtHb3RoYW1Sb290fSBmcm9tICcuL0dvdGhhbVJvb3QuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEdvdGhhbVByb3ZpZGVyUHJvcHMge1xuICByZWFkb25seSBjaGlsZHJlbj86IFJlYWN0Tm9kZTtcbiAgcmVhZG9ubHkgY29uZmlnOiBHb3RoYW1Db25maWd1cmF0aW9uO1xuICByZWFkb25seSBzZXNzaW9uPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmV4cG9ydCB0eXBlIEdvdGhhbVBvc2l0aW9uID0gJ3QnIHwgJ3RjJyB8ICd0bCcgfCAndHInIHwgJ2InIHwgJ2JjJyB8ICdicicgfCAnYmwnO1xuXG5leHBvcnQgdHlwZSBHb3RoYW1TdGF0dXMgPSAnZGVmYXVsdCcgfCAnZXJyb3InIHwgJ2luZm8nIHwgJ3N1Y2Nlc3MnIHwgJ3dhcm5pbmcnIHwgbnVtYmVyO1xuXG5leHBvcnQgdHlwZSBUaGVtZURpc3BsYXlNb2RlID0gJ2F1dG8nIHwgJ2RhcmsnIHwgJ2xpZ2h0JztcblxuZXhwb3J0IGludGVyZmFjZSBHb3RoYW1Db25maWd1cmF0aW9uIHtcbiAgcmVhZG9ubHkgYXBwPzoge1xuICAgIHJlYWRvbmx5IGxvZ28/OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcbiAgICByZWFkb25seSB0aXRsZT86IHN0cmluZztcbiAgICByZWFkb25seSB0aXRsZUJhclNlcGFyYXRvcj86IHN0cmluZztcbiAgfTtcbiAgcmVhZG9ubHkgYmFzZVVybD86IHN0cmluZztcbiAgcmVhZG9ubHkgY29uZmlnPzogRmx1eE9wdGlvbnM7XG4gIHJlYWRvbmx5IGRpc3BsYXlNb2RlPzogVGhlbWVEaXNwbGF5TW9kZTtcbiAgcmVhZG9ubHkgZmx1eD86IEZsdXhGcmFtZXdvcms7XG4gIHJlYWRvbmx5IGlzQXV0aD86ICgpID0+IGJvb2xlYW47XG4gIHJlYWRvbmx5IG1pZGRsZXdhcmU/OiBGbHV4TWlkZGxld2FyZVR5cGVbXTtcbiAgcmVhZG9ubHkgb25Jbml0PzogKCkgPT4gdm9pZDtcbiAgcmVhZG9ubHkgcm91dGVzPzogR290aGFtUm91dGVEYXRhW107XG4gIHJlYWRvbmx5IHN0b3JhZ2VUeXBlPzogJ2xvY2FsJyB8ICdzZXNzaW9uJztcbiAgcmVhZG9ubHkgc3RvcmVzPzogdW5rbm93bltdO1xuICByZWFkb25seSB0aGVtZT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICByZWFkb25seSB0cmFuc2xhdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcmVhZG9ubHkgaTE4bj86IHR5cGVvZiBpMThuO1xufVxuXG5leHBvcnQgY29uc3QgZGVmYXVsdEdvdGhhbUNvbmZpZzogR290aGFtQ29uZmlndXJhdGlvbiA9IHtcbiAgYXBwOiB7XG4gICAgbmFtZTogJ2dvdGhhbScsXG4gICAgdGl0bGU6ICdHb3RoYW1KUydcbiAgfSxcbiAgYmFzZVVybDogJycsXG4gIGlzQXV0aDogKCkgPT4gZmFsc2UsXG4gIG1pZGRsZXdhcmU6IFtdLFxuICByb3V0ZXM6IFtdLFxuICBzdG9yYWdlVHlwZTogJ3Nlc3Npb24nLFxuICBzdG9yZXM6IFtdLFxuICB0aGVtZToge30sXG4gIHRyYW5zbGF0aW9uczoge3RyYW5zbGF0aW9uOiB7fX1cbn07XG5cbmV4cG9ydCBjb25zdCBpbml0ID0gKGNvbmZpZzogR290aGFtQ29uZmlndXJhdGlvbikgPT4gKCk6IHZvaWQgPT4ge1xuICBjb25zdCB7b25Jbml0fSA9IGNvbmZpZztcbiAgR290aGFtQWN0aW9ucy5pbml0KCk7XG5cbiAgaWYob25Jbml0KSB7XG4gICAgb25Jbml0KCk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBzaWduT3V0ID0gKGZsdXg6IEZsdXhGcmFtZXdvcmspID0+IGFzeW5jICgpID0+IHtcbiAgYXdhaXQgZmx1eC5jbGVhckFwcERhdGEoKTtcbiAgYXdhaXQgR290aGFtQWN0aW9ucy5sb2FkaW5nKGZhbHNlKTtcbiAgR290aGFtQWN0aW9ucy5uYXZHb3RvKCcvc2lnbkluJyk7XG59O1xuXG5leHBvcnQgY29uc3QgR290aGFtUHJvdmlkZXI6IEZDPEdvdGhhbVByb3ZpZGVyUHJvcHM+ID0gKHtjaGlsZHJlbiwgY29uZmlnOiBhcHBDb25maWd9KSA9PiB7XG4gIGNvbnN0IGZsdXggPSB1c2VGbHV4KCk7XG4gIGNvbnN0IGNvbmZpZzogR290aGFtQ29uZmlndXJhdGlvbiA9IG1lcmdlKGRlZmF1bHRHb3RoYW1Db25maWcsIGFwcENvbmZpZyk7XG4gIGNvbnN0IHtcbiAgICBpc0F1dGgsXG4gICAgbWlkZGxld2FyZSxcbiAgICByb3V0ZXMgPSBbXSxcbiAgICBzdG9yYWdlVHlwZSxcbiAgICBzdG9yZXMsXG4gICAgaTE4blxuICB9ID0gY29uZmlnO1xuICBjb25zdCBuYW1lID0gY29uZmlnPy5hcHA/Lm5hbWU7XG4gIGNvbnN0IFtzZXNzaW9uLCBzZXRTZXNzaW9uXSA9IHVzZVN0YXRlKHt9KTtcbiAgY29uc3Qgcm91dGVyID0gdXNlTWVtbygoKSA9PiB7XG4gICAgcmV0dXJuIGNyZWF0ZUJyb3dzZXJSb3V0ZXIoXG4gICAgICBbXG4gICAgICAgIHtcbiAgICAgICAgICBDb21wb25lbnQ6IEdvdGhhbVJvb3QsXG4gICAgICAgICAgY2hpbGRyZW46IHBhcnNlUm91dGVzKHJvdXRlcyBhcyB1bmtub3duIGFzIEN1c3RvbVJvdXRlUHJvcHNbXSksXG4gICAgICAgICAgaW5kZXg6IGZhbHNlLFxuICAgICAgICAgIHBhdGg6ICcvJ1xuICAgICAgICB9XG4gICAgICBdXG4gICAgKTtcbiAgfSwgW3JvdXRlc10pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgQ29uZmlnLnNldChjb25maWcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuXG4gICAgaWYoZmx1eCkge1xuICAgICAgY29uc3QgZW52OiBzdHJpbmcgPSBDb25maWcuZ2V0KCdlbnZpcm9ubWVudCcpIGFzIHN0cmluZztcbiAgICAgIGNvbnN0IGxvZ2dlcjogTG9nZ2VyID0gbmV3IExvZ2dlcih7XG4gICAgICAgIGRlYnVnTGV2ZWw6IGVudiA9PT0gJ2RldmVsb3BtZW50JyA/IExvZ2dlckRlYnVnTGV2ZWwuRElTUEFUQ0ggOiBMb2dnZXJEZWJ1Z0xldmVsLkRJU0FCTEVEXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHN0b3JhZ2U6IEJyb3dzZXJTdG9yYWdlID0gbmV3IEJyb3dzZXJTdG9yYWdlKHt0eXBlOiBzdG9yYWdlVHlwZX0pO1xuXG4gICAgICBmbHV4LmluaXQoe1xuICAgICAgICBtaWRkbGV3YXJlOiBbbG9nZ2VyLCAuLi4obWlkZGxld2FyZSB8fCBbXSldLFxuICAgICAgICBuYW1lLFxuICAgICAgICAvLyBzdGF0ZToge2FwcDoge3RpdGxlfX0sXG4gICAgICAgIHN0b3JhZ2UsXG4gICAgICAgIHN0b3JlczogW2dvdGhhbUFwcCwgLi4uKHN0b3JlcyB8fCBbXSldXG4gICAgICB9KTtcblxuICAgICAgZmx1eC5vbihHb3RoYW1Db25zdGFudHMuU0lHTl9PVVQsIHNpZ25PdXQoZmx1eCkpO1xuICAgICAgZmx1eC5vbihHb3RoYW1Db25zdGFudHMuVVBEQVRFX1NFU1NJT04sICh7c2Vzc2lvbn0pID0+IHtcbiAgICAgICAgc2V0U2Vzc2lvbihzZXNzaW9uKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGluaXQoY29uZmlnKTtcbiAgfSwgW2ZsdXgsIGNvbmZpZywgbWlkZGxld2FyZSwgbmFtZSwgc3RvcmFnZVR5cGUsIHN0b3Jlc10pO1xuXG4gIGlmKGkxOG4pIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEkxOG5leHRQcm92aWRlciBpMThuPXtpMThufT5cbiAgICAgICAgPEdvdGhhbUNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3tGbHV4OiBmbHV4LCBpc0F1dGgsIHNlc3Npb259fT5cbiAgICAgICAgICB7cm91dGVyICYmIDxSb3V0ZXJQcm92aWRlciByb3V0ZXI9e3JvdXRlcn0vPn1cbiAgICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgIDwvR290aGFtQ29udGV4dC5Qcm92aWRlcj5cbiAgICAgIDwvSTE4bmV4dFByb3ZpZGVyPlxuICAgICk7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxHb3RoYW1Db250ZXh0LlByb3ZpZGVyIHZhbHVlPXt7Rmx1eDogZmx1eCwgaXNBdXRoLCBzZXNzaW9ufX0+XG4gICAgICB7cm91dGVyICYmIDxSb3V0ZXJQcm92aWRlciByb3V0ZXI9e3JvdXRlcn0vPn1cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L0dvdGhhbUNvbnRleHQuUHJvdmlkZXI+XG4gICk7XG59OyJdLAogICJtYXBwaW5ncyI6ICJBQUlBLFNBQVEsUUFBUSx3QkFBdUI7QUFDdkMsU0FBUSxzQkFBcUI7QUFDN0IsU0FBUSxlQUFjO0FBQ3RCLFNBQVEsYUFBWTtBQUVwQixTQUFRLFdBQVcsU0FBUyxnQkFBZTtBQUMzQyxTQUFRLHVCQUFzQjtBQUM5QixTQUFRLHFCQUFxQixzQkFBcUI7QUFFbEQsU0FBUSxxQkFBb0I7QUFDNUIsU0FBUSxjQUFhO0FBQ3JCLFNBQVEsdUJBQXNCO0FBQzlCLFNBQVEsaUJBQWdCO0FBQ3hCLFNBQVEscUJBQW9CO0FBSzVCLFNBQVEsbUJBQXlDO0FBQ2pELFNBQVEsa0JBQWlCO0FBMEhqQixTQUNhLEtBRGI7QUF0RkQsTUFBTSxzQkFBMkM7QUFBQSxFQUN0RCxLQUFL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