UNPKG

analytica-frontend-lib

Version:

Repositório público dos componentes utilizados nas plataformas da Analytica Ensino

164 lines (162 loc) 4.48 kB
// src/components/BreadcrumbMenu/useBreadcrumbBuilder.ts import { useEffect } from "react"; // src/components/BreadcrumbMenu/breadcrumbStore.ts import { create } from "zustand"; var useBreadcrumbStore = create((set, get) => ({ breadcrumbs: {}, setBreadcrumbs: (namespace, items) => { set((state) => ({ breadcrumbs: { ...state.breadcrumbs, [namespace]: items } })); }, addBreadcrumb: (namespace, item) => { set((state) => { const current = state.breadcrumbs[namespace] || []; return { breadcrumbs: { ...state.breadcrumbs, [namespace]: [...current, item] } }; }); }, updateBreadcrumb: (namespace, itemId, updates) => { set((state) => { const current = state.breadcrumbs[namespace] || []; return { breadcrumbs: { ...state.breadcrumbs, [namespace]: current.map( (item) => item.id === itemId ? { ...item, ...updates } : item ) } }; }); }, removeBreadcrumbFrom: (namespace, itemId) => { set((state) => { const current = state.breadcrumbs[namespace] || []; const index = current.findIndex((item) => item.id === itemId); if (index === -1) return state; return { breadcrumbs: { ...state.breadcrumbs, [namespace]: current.slice(0, index) } }; }); }, sliceBreadcrumbs: (namespace, index) => { set((state) => { const current = state.breadcrumbs[namespace] || []; return { breadcrumbs: { ...state.breadcrumbs, [namespace]: current.slice(0, index + 1) } }; }); }, clearBreadcrumbs: (namespace) => { set((state) => { const { [namespace]: _, ...rest } = state.breadcrumbs; return { breadcrumbs: rest }; }); }, getBreadcrumbs: (namespace) => { return get().breadcrumbs[namespace] || []; } })); var useBreadcrumb = (namespace) => { const store = useBreadcrumbStore(); const breadcrumbs = store.breadcrumbs[namespace] || []; return { breadcrumbs, /** * Define todos os breadcrumbs de uma vez */ setBreadcrumbs: (items) => { store.setBreadcrumbs(namespace, items); }, /** * Adiciona um novo breadcrumb ao final */ addBreadcrumb: (item) => { store.addBreadcrumb(namespace, item); }, /** * Atualiza um breadcrumb existente */ updateBreadcrumb: (itemId, updates) => { store.updateBreadcrumb(namespace, itemId, updates); }, /** * Remove um breadcrumb e todos os seguintes */ removeBreadcrumbFrom: (itemId) => { store.removeBreadcrumbFrom(namespace, itemId); }, /** * Mantém apenas os breadcrumbs até o índice especificado (inclusivo) */ sliceBreadcrumbs: (index) => { store.sliceBreadcrumbs(namespace, index); }, /** * Limpa todos os breadcrumbs */ clearBreadcrumbs: () => { store.clearBreadcrumbs(namespace); } }; }; // src/components/BreadcrumbMenu/useBreadcrumbBuilder.ts var isBreadcrumbWithData = (level) => { return "data" in level; }; var useBreadcrumbBuilder = (config) => { const { namespace, root, levels } = config; const { breadcrumbs, setBreadcrumbs, sliceBreadcrumbs } = useBreadcrumb(namespace); const levelDependencies = levels.map( (level) => isBreadcrumbWithData(level) ? level.data : null ); const levelUrlIds = levels.map((level) => level.urlId); useEffect(() => { const newBreadcrumbs = [root]; const previousIds = []; for (const level of levels) { const { urlId } = level; if (isBreadcrumbWithData(level)) { const { data, getId, getName, getUrl } = level; if (!data) break; const dataId = getId(data); if (urlId === void 0 || dataId !== urlId) break; newBreadcrumbs.push({ id: dataId, name: getName(data), url: getUrl(data, previousIds) }); previousIds.push(dataId); } else { const { breadcrumb } = level; if (urlId === void 0) break; newBreadcrumbs.push(breadcrumb); previousIds.push(breadcrumb.id); } } setBreadcrumbs(newBreadcrumbs); }, [namespace, ...levelDependencies, ...levelUrlIds, root.id]); return { breadcrumbs, sliceBreadcrumbs }; }; export { useBreadcrumbBuilder }; //# sourceMappingURL=index.mjs.map