import { mapDefaults, pointDefaults } from "../../config"; import type { TCluster } from "../../config/types"; const getLimit = (maxActivePoints?: number): number => { const numericLimit = Number(maxActivePoints); if (!Number.isFinite(numericLimit)) { return mapDefaults.maxActivePoints!; } return Math.max(0, Math.floor(numericLimit)); }; /** * Получает данные о кластере при клике на метку * @returns {{ * nextClusters: TCluster[]; * nextIsActive: boolean; * }} */ const getNextClustersByPointClick = ({ clusters, pointId, maxActivePoints, }: { clusters: TCluster[]; pointId: string; maxActivePoints?: number; }): { nextClusters: TCluster[]; nextIsActive: boolean; } => { const safeClusters = Array.isArray(clusters) ? clusters : []; const limit = getLimit(maxActivePoints); const currentPoint = safeClusters .flatMap((cluster) => cluster.points) .find((point) => point.id === pointId); const currentPointIsActive = currentPoint?.state?.isActive ?? pointDefaults.state.isActive; let nextIsActive = false; if (currentPointIsActive) { nextIsActive = false; } else if (limit === 0) { nextIsActive = false; } else if (limit === 1) { nextIsActive = true; } else { const otherActiveCount = safeClusters .flatMap((cluster) => cluster.points) .filter((point) => point.state?.isActive && point.id !== pointId) .length; nextIsActive = otherActiveCount < limit; } const nextClusters = safeClusters.map((cluster) => ({ ...cluster, points: cluster.points.map((point) => { const isCurrentPointActive = point.state?.isActive ?? pointDefaults.state.isActive; if (point.id === pointId) { if (isCurrentPointActive === nextIsActive) { return point; } return { ...point, state: { ...point.state, isActive: nextIsActive, }, }; } if (limit === 1 && nextIsActive && isCurrentPointActive) { return { ...point, state: { ...point.state, isActive: false, }, }; } return point; }), })); return { nextClusters, nextIsActive, }; }; export { getNextClustersByPointClick, };