UNPKG

@zextras/carbonio-shell-ui

Version:

The Zextras Carbonio web client

222 lines • 7.41 kB
"use strict"; /* * SPDX-FileCopyrightText: 2021 Zextras <https://www.zextras.com> * * SPDX-License-Identifier: AGPL-3.0-only */ Object.defineProperty(exports, "__esModule", { value: true }); exports.useAppStore = void 0; const immer_1 = require("immer"); const lodash_1 = require("lodash"); const zustand_1 = require("zustand"); const utils_1 = require("./utils"); const constants_1 = require("../../constants"); const FOCUS_MODE_RESPONSE = 'focus-mode'; function addIfNotPresent(items, itemToAdd, onAdd) { if (!(0, lodash_1.some)(items, (item) => item.id === itemToAdd.id)) { items.push(itemToAdd); onAdd?.(items, itemToAdd); } } function sortByPosition(items) { items.sort((a, b) => a.position - b.position); } function addAndSort(items, itemToAdd) { addIfNotPresent(items, itemToAdd, sortByPosition); } function removeById(items, id) { const index = (0, lodash_1.findIndex)(items, (item) => item.id === id); if (index !== -1) { items.splice(index, 1); } } const initialState = { focusMode: false, apps: {}, appContexts: {}, shell: { commit: '', description: '', js_entrypoint: '', name: constants_1.SHELL_APP_ID, priority: -1, version: '', type: 'shell', attrKey: '', icon: '', display: 'Shell' }, entryPoints: {}, routes: {}, views: { primaryBar: [], secondaryBar: [], appView: [], board: [], utilityBar: [], settings: [], primaryBarAccessories: [], secondaryBarAccessories: [] } }; // extra currying as suggested in https://github.com/pmndrs/zustand/blob/main/docs/guides/typescript.md#basic-usage exports.useAppStore = (0, zustand_1.create)()((set, get) => ({ ...initialState, setApps: (apps) => { set(() => { const { moduleApps, shellApp, appContexts } = (0, lodash_1.reduce)(apps, (accumulator, app) => { if (app.name) { const normalizedApp = (0, utils_1.normalizeApp)(app); if (app.name !== constants_1.SHELL_APP_ID) { accumulator.moduleApps[app.name] = normalizedApp; } else { accumulator.shellApp = normalizedApp; } accumulator.appContexts[app.name] = {}; } return accumulator; }, { moduleApps: {}, shellApp: {}, appContexts: {} }); return { apps: moduleApps, shell: shellApp, appContexts }; }); }, upsertApp: (app) => { set((0, immer_1.produce)((state) => { state.apps[app.name] = { ...state.apps[app.name], ...app }; })); }, setAppContext: (app) => (context) => { set((0, immer_1.produce)((state) => { state.appContexts[app] = (0, lodash_1.merge)(state.appContexts[app], context); })); }, addRoute: (routeData) => { const { focusMode } = get(); if (focusMode && (routeData.route !== focusMode || !routeData.focusMode)) { return FOCUS_MODE_RESPONSE; } set((0, immer_1.produce)((state) => { state.routes[routeData.id] = routeData; if (routeData.primaryBar && !routeData.focusMode) { addAndSort(state.views.primaryBar, { app: routeData.app, id: routeData.id, route: routeData.route, component: routeData.primaryBar, badge: routeData.badge, position: routeData.position, visible: routeData.visible, label: routeData.label }); } if (routeData.secondaryBar) { addIfNotPresent(state.views.secondaryBar, { app: routeData.app, id: routeData.id, route: routeData.route, component: routeData.secondaryBar }); } if (routeData.appView) { addIfNotPresent(state.views.appView, { app: routeData.app, id: routeData.id, route: routeData.route, component: routeData.appView }); } })); return routeData.id; }, setRouteVisibility: (id, visible) => { set((0, immer_1.produce)((state) => { const idx = (0, lodash_1.findIndex)(state.views.primaryBar, (view) => view.id === id); if (idx >= 0) { state.views.primaryBar[idx].visible = visible; } })); }, removeRoute: (id) => { set((0, immer_1.produce)((state) => { delete state.routes[id]; removeById(state.views.primaryBar, id); removeById(state.views.secondaryBar, id); removeById(state.views.appView, id); })); }, addBoardView: (data) => { set((0, immer_1.produce)((state) => { addIfNotPresent(state.views.board, data); })); return data.id; }, removeBoardView: (id) => { set((0, immer_1.produce)((state) => { removeById(state.views.board, id); })); }, addSettingsView: (data) => { const { focusMode } = get(); if (focusMode && data.route !== focusMode) { return FOCUS_MODE_RESPONSE; } set((0, immer_1.produce)((state) => { addAndSort(state.views.settings, data); })); return data.id; }, removeSettingsView: (id) => { set((0, immer_1.produce)((state) => { removeById(state.views.settings, id); })); }, addUtilityView: (data) => { set((0, immer_1.produce)((state) => { addAndSort(state.views.utilityBar, data); })); return data.id; }, removeUtilityView: (id) => { set((0, immer_1.produce)((state) => { removeById(state.views.utilityBar, id); })); }, addPrimaryAccessoryView: (data) => { set((0, immer_1.produce)((state) => { addAndSort(state.views.primaryBarAccessories, data); })); return data.id; }, removePrimaryAccessoryView: (id) => { set((0, immer_1.produce)((state) => { removeById(state.views.primaryBarAccessories, id); })); }, addSecondaryAccessoryView: (data) => { set((0, immer_1.produce)((state) => { addAndSort(state.views.secondaryBarAccessories, data); })); return data.id; }, removeSecondaryAccessoryView: (id) => { set((0, immer_1.produce)((state) => { removeById(state.views.secondaryBarAccessories, id); })); }, updatePrimaryBadge: (badge, id) => { set((0, immer_1.produce)((state) => { const idx = (0, lodash_1.findIndex)(state.views.primaryBar, (bar) => bar.id === id); if (idx >= 0) { state.views.primaryBar[idx].badge = { ...state.views.primaryBar[idx].badge, ...badge }; } })); } })); //# sourceMappingURL=store.js.map