{"version":3,"file":"getNextClustersByPointClick.mjs","sources":[""],"sourcesContent":["import { mapDefaults, pointDefaults } from \"../../config\";\nimport type { TCluster } from \"../../config/types\";\n\nconst getLimit = (maxActivePoints?: number): number => {\n  const numericLimit = Number(maxActivePoints);\n  if (!Number.isFinite(numericLimit)) {\n    return mapDefaults.maxActivePoints!;\n  }\n  return Math.max(0, Math.floor(numericLimit));\n};\n\n/**\n * Получает данные о кластере при клике на метку\n * @returns {{\n *   nextClusters: TCluster[];\n *   nextIsActive: boolean;\n * }}\n */\nconst getNextClustersByPointClick = ({\n  clusters,\n  pointId,\n  maxActivePoints,\n}: {\n  clusters: TCluster[];\n  pointId: string;\n  maxActivePoints?: number;\n}): {\n  nextClusters: TCluster[];\n  nextIsActive: boolean;\n} => {\n  const safeClusters = Array.isArray(clusters) ? clusters : [];\n  const limit = getLimit(maxActivePoints);\n\n  const currentPoint = safeClusters\n    .flatMap((cluster) => cluster.points)\n    .find((point) => point.id === pointId);\n\n  const currentPointIsActive = currentPoint?.state?.isActive ?? pointDefaults.state.isActive;\n  let nextIsActive = false;\n\n  if (currentPointIsActive) {\n    nextIsActive = false;\n  } else if (limit === 0) {\n    nextIsActive = false;\n  } else if (limit === 1) {\n    nextIsActive = true;\n  } else {\n    const otherActiveCount = safeClusters\n      .flatMap((cluster) => cluster.points)\n      .filter((point) => point.state?.isActive && point.id !== pointId)\n      .length;\n    nextIsActive = otherActiveCount < limit;\n  }\n\n  const nextClusters = safeClusters.map((cluster) => ({\n    ...cluster,\n    points: cluster.points.map((point) => {\n      const isCurrentPointActive = point.state?.isActive ?? pointDefaults.state.isActive;\n\n      if (point.id === pointId) {\n        if (isCurrentPointActive === nextIsActive) {\n          return point;\n        }\n        return {\n          ...point,\n          state: {\n            ...point.state,\n            isActive: nextIsActive,\n          },\n        };\n      }\n\n      if (limit === 1 && nextIsActive && isCurrentPointActive) {\n        return {\n          ...point,\n          state: {\n            ...point.state,\n            isActive: false,\n          },\n        };\n      }\n\n      return point;\n    }),\n  }));\n\n  return {\n    nextClusters,\n    nextIsActive,\n  };\n};\n\nexport {\n  getNextClustersByPointClick,\n};\n\n"],"names":["getLimit","maxActivePoints","numericLimit","Number","isFinite","mapDefaults","Math","max","floor","getNextClustersByPointClick","clusters","pointId","safeClusters","Array","isArray","limit","currentPoint","flatMap","cluster","points","find","point","id","currentPointIsActive","state","isActive","pointDefaults","nextIsActive","otherActiveCount","filter","length","nextClusters","map","isCurrentPointActive"],"mappings":"8DAGA,MAAMA,SAAYC,kBAChB,MAAMC,aAAeC,OAAOF,iBAC5B,IAAKE,OAAOC,SAASF,cACnB,OAAOG,YAAYJ,gBAErB,OAAOK,KAAKC,IAAI,EAAGD,KAAKE,MAAMN;;;;;;;GAUhC,MAAMO,4BAA8B,EAClCC,kBACAC,gBACAV,oCASA,MAAMW,aAAeC,MAAMC,QAAQJ,UAAYA,SAAW,GAC1D,MAAMK,MAAQf,SAASC,iBAEvB,MAAMe,aAAeJ,aAClBK,QAASC,SAAYA,QAAQC,QAC7BC,KAAMC,OAAUA,MAAMC,KAAOX,SAEhC,MAAMY,qBAAuBP,cAAcQ,OAAOC,UAAYC,cAAcF,MAAMC,SAClF,IAAIE,aAAe,MAEnB,GAAIJ,qBACFI,aAAe,WACV,GAAIZ,QAAU,EACnBY,aAAe,WACV,GAAIZ,QAAU,EACnBY,aAAe,SACV,CACL,MAAMC,iBAAmBhB,aACtBK,QAASC,SAAYA,QAAQC,QAC7BU,OAAQR,OAAUA,MAAMG,OAAOC,UAAYJ,MAAMC,KAAOX,SACxDmB,OACHH,aAAeC,iBAAmBb,KACpC,CAEA,MAAMgB,aAAenB,aAAaoB,IAAKd,UAAO,IACzCA,QACHC,OAAQD,QAAQC,OAAOa,IAAKX,QAC1B,MAAMY,qBAAuBZ,MAAMG,OAAOC,UAAYC,cAAcF,MAAMC,SAE1E,GAAIJ,MAAMC,KAAOX,QAAS,CACxB,GAAIsB,uBAAyBN,aAC3B,OAAON,MAET,MAAO,IACFA,MACHG,MAAO,IACFH,MAAMG,MACTC,SAAUE,cAGhB,CAEA,GAAIZ,QAAU,GAAKY,cAAgBM,qBACjC,MAAO,IACFZ,MACHG,MAAO,IACFH,MAAMG,MACTC,SAAU,QAKhB,OAAOJ,WAIX,MAAO,CACLU,0BACAJ"}