@zextras/carbonio-shell-ui
Version:
The Zextras Carbonio web client
222 lines • 7.41 kB
JavaScript
;
/*
* 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