analytica-frontend-lib
Version:
Repositório público dos componentes utilizados nas plataformas da Analytica Ensino
164 lines (162 loc) • 4.48 kB
JavaScript
// 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