@gemx-dev/heatmap-react 3.5.44 → 3.5.46

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (303) hide show
  1. package/dist/esm/components/Layout/ContentHeader.d.ts +4 -0
  2. package/dist/esm/components/Layout/ContentHeader.d.ts.map +1 -0
  3. package/dist/esm/components/Layout/VizMode.d.ts +2 -0
  4. package/dist/esm/components/Layout/VizMode.d.ts.map +1 -0
  5. package/dist/esm/components/Test.d.ts +121 -0
  6. package/dist/esm/components/Test.d.ts.map +1 -0
  7. package/dist/esm/components/VizDom/VizDomContainer.d.ts +6 -0
  8. package/dist/esm/components/VizDom/VizDomContainer.d.ts.map +1 -0
  9. package/dist/esm/components/VizDom/VizDomRenderer.d.ts.map +1 -1
  10. package/dist/esm/components/VizElement/ClickedElementOverlay.d.ts +17 -0
  11. package/dist/esm/components/VizElement/ClickedElementOverlay.d.ts.map +1 -0
  12. package/dist/esm/components/VizElement/HeatmapElements.d.ts.map +1 -1
  13. package/dist/esm/components/VizElement/HoveredElementOverlay.d.ts +12 -0
  14. package/dist/esm/components/VizElement/HoveredElementOverlay.d.ts.map +1 -0
  15. package/dist/esm/components/VizElement/MissingElementMessage.d.ts +7 -0
  16. package/dist/esm/components/VizElement/MissingElementMessage.d.ts.map +1 -0
  17. package/dist/esm/components/VizElement/VizElements.d.ts.map +1 -1
  18. package/dist/esm/components/VizElement/temp/ClarityVisualizer.d.ts +150 -0
  19. package/dist/esm/components/VizElement/temp/ClarityVisualizer.d.ts.map +1 -0
  20. package/dist/esm/components/VizElement/temp/VizElementRank.d.ts +74 -0
  21. package/dist/esm/components/VizElement/temp/VizElementRank.d.ts.map +1 -0
  22. package/dist/esm/components/VizLive/VizLive.d.ts +2 -0
  23. package/dist/esm/components/VizLive/VizLive.d.ts.map +1 -0
  24. package/dist/esm/components/VizLive/VizLiveHeatmap.d.ts.map +1 -1
  25. package/dist/esm/components/VizLive/VizLiveRenderer.d.ts.map +1 -1
  26. package/dist/esm/configs/style.d.ts +0 -2
  27. package/dist/esm/configs/style.d.ts.map +1 -1
  28. package/dist/esm/helpers/index.d.ts +2 -1
  29. package/dist/esm/helpers/index.d.ts.map +1 -1
  30. package/dist/esm/helpers/viewport-fixer.d.ts +13 -0
  31. package/dist/esm/helpers/viewport-fixer.d.ts.map +1 -0
  32. package/dist/esm/helpers/viewport-replacer.d.ts +26 -0
  33. package/dist/esm/helpers/viewport-replacer.d.ts.map +1 -0
  34. package/dist/esm/hooks/vix-elements/useHoveredElement.d.ts.map +1 -1
  35. package/dist/esm/hooks/viz-canvas/useClickmap.d.ts +1 -3
  36. package/dist/esm/hooks/viz-canvas/useClickmap.d.ts.map +1 -1
  37. package/dist/esm/hooks/viz-canvas/useHeatmapVizCanvas.d.ts +1 -1
  38. package/dist/esm/hooks/viz-canvas/useHeatmapVizCanvas.d.ts.map +1 -1
  39. package/dist/esm/hooks/viz-canvas/useScrollmap.d.ts +1 -3
  40. package/dist/esm/hooks/viz-canvas/useScrollmap.d.ts.map +1 -1
  41. package/dist/esm/hooks/viz-live/index.d.ts +1 -1
  42. package/dist/esm/hooks/viz-live/{useVizLiveIframeMsg.d.ts → useIframeMessage.d.ts} +10 -2
  43. package/dist/esm/hooks/viz-live/useIframeMessage.d.ts.map +1 -0
  44. package/dist/esm/hooks/viz-render/useHeatmapRender.d.ts.map +1 -1
  45. package/dist/esm/hooks/viz-scale/useContainerDimensions.d.ts.map +1 -1
  46. package/dist/esm/hooks/viz-scale/useHeatmapScale.d.ts +1 -1
  47. package/dist/esm/hooks/viz-scale/useHeatmapScale.d.ts.map +1 -1
  48. package/dist/esm/hooks/viz-scale/useIframeHeight.d.ts +10 -0
  49. package/dist/esm/hooks/viz-scale/useIframeHeight.d.ts.map +1 -0
  50. package/dist/esm/index.d.ts +1 -1
  51. package/dist/esm/index.d.ts.map +1 -1
  52. package/dist/esm/index.js +203 -910
  53. package/dist/esm/index.mjs +203 -910
  54. package/dist/esm/stores/index.d.ts +0 -1
  55. package/dist/esm/stores/index.d.ts.map +1 -1
  56. package/dist/esm/stores/interaction.d.ts.map +1 -1
  57. package/dist/esm/stores/mode-live.d.ts +0 -4
  58. package/dist/esm/stores/mode-live.d.ts.map +1 -1
  59. package/dist/esm/stores/viz.d.ts +4 -0
  60. package/dist/esm/stores/viz.d.ts.map +1 -1
  61. package/dist/esm/types/index.d.ts +1 -1
  62. package/dist/esm/types/index.d.ts.map +1 -1
  63. package/dist/esm/types/viewport-fixer.d.ts +31 -0
  64. package/dist/esm/types/viewport-fixer.d.ts.map +1 -0
  65. package/dist/umd/components/Layout/ContentHeader.d.ts +4 -0
  66. package/dist/umd/components/Layout/ContentHeader.d.ts.map +1 -0
  67. package/dist/umd/components/Test.d.ts +121 -0
  68. package/dist/umd/components/Test.d.ts.map +1 -0
  69. package/dist/umd/components/VizDom/VizDomContainer.d.ts +2 -0
  70. package/dist/umd/components/VizDom/VizDomContainer.d.ts.map +1 -0
  71. package/dist/umd/components/VizDom/VizDomRenderer.d.ts.map +1 -1
  72. package/dist/umd/components/VizElement/ClickedElementOverlay.d.ts +17 -0
  73. package/dist/umd/components/VizElement/ClickedElementOverlay.d.ts.map +1 -0
  74. package/dist/umd/components/VizElement/HeatmapElements.d.ts.map +1 -1
  75. package/dist/umd/components/VizElement/HoveredElementOverlay.d.ts +12 -0
  76. package/dist/umd/components/VizElement/HoveredElementOverlay.d.ts.map +1 -0
  77. package/dist/umd/components/VizElement/MissingElementMessage.d.ts +7 -0
  78. package/dist/umd/components/VizElement/MissingElementMessage.d.ts.map +1 -0
  79. package/dist/umd/components/VizElement/VizElements.d.ts.map +1 -1
  80. package/dist/umd/components/VizElement/temp/ClarityVisualizer.d.ts +150 -0
  81. package/dist/umd/components/VizElement/temp/ClarityVisualizer.d.ts.map +1 -0
  82. package/dist/umd/components/VizElement/temp/VizElementRank.d.ts +74 -0
  83. package/dist/umd/components/VizElement/temp/VizElementRank.d.ts.map +1 -0
  84. package/dist/umd/components/VizLive/VizLiveHeatmap.d.ts.map +1 -1
  85. package/dist/umd/components/VizLive/VizLiveRenderer.d.ts.map +1 -1
  86. package/dist/umd/configs/style.d.ts +0 -2
  87. package/dist/umd/configs/style.d.ts.map +1 -1
  88. package/dist/umd/helpers/index.d.ts +2 -1
  89. package/dist/umd/helpers/index.d.ts.map +1 -1
  90. package/dist/umd/helpers/viewport-fixer.d.ts +13 -0
  91. package/dist/umd/helpers/viewport-fixer.d.ts.map +1 -0
  92. package/dist/umd/helpers/viewport-replacer.d.ts +26 -0
  93. package/dist/umd/helpers/viewport-replacer.d.ts.map +1 -0
  94. package/dist/umd/hooks/vix-elements/useHoveredElement.d.ts.map +1 -1
  95. package/dist/umd/hooks/viz-canvas/useClickmap.d.ts +1 -3
  96. package/dist/umd/hooks/viz-canvas/useClickmap.d.ts.map +1 -1
  97. package/dist/umd/hooks/viz-canvas/useHeatmapVizCanvas.d.ts +1 -1
  98. package/dist/umd/hooks/viz-canvas/useHeatmapVizCanvas.d.ts.map +1 -1
  99. package/dist/umd/hooks/viz-canvas/useScrollmap.d.ts +1 -3
  100. package/dist/umd/hooks/viz-canvas/useScrollmap.d.ts.map +1 -1
  101. package/dist/umd/hooks/viz-live/index.d.ts +1 -1
  102. package/dist/umd/hooks/viz-live/{useVizLiveIframeMsg.d.ts → useIframeMessage.d.ts} +10 -2
  103. package/dist/umd/hooks/viz-live/useIframeMessage.d.ts.map +1 -0
  104. package/dist/umd/hooks/viz-render/useHeatmapRender.d.ts.map +1 -1
  105. package/dist/umd/hooks/viz-scale/useContainerDimensions.d.ts.map +1 -1
  106. package/dist/umd/hooks/viz-scale/useHeatmapScale.d.ts +1 -1
  107. package/dist/umd/hooks/viz-scale/useHeatmapScale.d.ts.map +1 -1
  108. package/dist/umd/hooks/viz-scale/useIframeHeight.d.ts +10 -0
  109. package/dist/umd/hooks/viz-scale/useIframeHeight.d.ts.map +1 -0
  110. package/dist/umd/index.d.ts +1 -1
  111. package/dist/umd/index.d.ts.map +1 -1
  112. package/dist/umd/index.js +2 -2
  113. package/dist/umd/stores/index.d.ts +0 -1
  114. package/dist/umd/stores/index.d.ts.map +1 -1
  115. package/dist/umd/stores/interaction.d.ts.map +1 -1
  116. package/dist/umd/stores/mode-live.d.ts +0 -4
  117. package/dist/umd/stores/mode-live.d.ts.map +1 -1
  118. package/dist/umd/stores/viz.d.ts +4 -0
  119. package/dist/umd/stores/viz.d.ts.map +1 -1
  120. package/dist/umd/types/index.d.ts +1 -1
  121. package/dist/umd/types/index.d.ts.map +1 -1
  122. package/dist/umd/types/viewport-fixer.d.ts +31 -0
  123. package/dist/umd/types/viewport-fixer.d.ts.map +1 -0
  124. package/package.json +13 -15
  125. package/src/components/GraphView.tsx +58 -0
  126. package/src/components/Layout/ContentMetricBar.tsx +23 -0
  127. package/src/components/Layout/ContentToolbar.tsx +22 -0
  128. package/src/components/Layout/ContentTopBar.tsx +24 -0
  129. package/src/components/Layout/ContentVizByMode.tsx +14 -0
  130. package/src/components/Layout/HeatmapLayout.tsx +60 -0
  131. package/src/components/Layout/LeftSidebar.tsx +44 -0
  132. package/src/components/Layout/WrapperLayout.tsx +12 -0
  133. package/src/components/Layout/WrapperPreview.tsx +24 -0
  134. package/src/components/Layout/index.ts +1 -0
  135. package/src/components/VizDom/ReplayControls.tsx +48 -0
  136. package/src/components/VizDom/VizContainer.tsx +40 -0
  137. package/src/components/VizDom/VizDomHeatmap.tsx +28 -0
  138. package/src/components/VizDom/VizDomRenderer.tsx +82 -0
  139. package/src/components/VizDom/VizLoading.tsx +8 -0
  140. package/src/components/VizDom/WrapperVisual.tsx +73 -0
  141. package/src/components/VizDom/index.ts +5 -0
  142. package/src/components/VizElement/DefaultRankBadges.tsx +36 -0
  143. package/src/components/VizElement/ElementCallout.tsx +82 -0
  144. package/src/components/VizElement/ElementMissing.tsx +35 -0
  145. package/src/components/VizElement/ElementOverlay.tsx +66 -0
  146. package/src/components/VizElement/HeatmapElements.tsx +127 -0
  147. package/src/components/VizElement/HeatmapExample.tsx +70 -0
  148. package/src/components/VizElement/RankBadge.tsx +25 -0
  149. package/src/components/VizElement/VizElements.tsx +57 -0
  150. package/src/components/VizElement/index.ts +1 -0
  151. package/src/components/VizLive/VizLiveHeatmap.tsx +27 -0
  152. package/src/components/VizLive/VizLiveRenderer.tsx +47 -0
  153. package/src/components/VizLive/index.ts +1 -0
  154. package/src/components/VizScrollmap/AverageFoldLine.tsx +57 -0
  155. package/src/components/VizScrollmap/HoverZones.tsx +58 -0
  156. package/src/components/VizScrollmap/MetricRow.tsx +0 -0
  157. package/src/components/VizScrollmap/ScrollMapMinimap.tsx +64 -0
  158. package/src/components/VizScrollmap/ScrollMapOverlay.tsx +79 -0
  159. package/src/components/VizScrollmap/ScrollZoneHoverArea.tsx +35 -0
  160. package/src/components/VizScrollmap/ScrollZoneTooltip.tsx +146 -0
  161. package/src/components/VizScrollmap/ScrollmapMarker.tsx +106 -0
  162. package/src/components/VizScrollmap/VizScrollMap.tsx +36 -0
  163. package/src/components/VizScrollmap/index.ts +1 -0
  164. package/src/components/VizScrollmapV2/ScrollmapOverlay.css +94 -0
  165. package/src/components/VizScrollmapV2/ScrollmapOverlayV2.tsx +130 -0
  166. package/src/components/VizScrollmapV2/index.ts +1 -0
  167. package/src/components/VizScrollmapV2/scrollmap.types.ts +21 -0
  168. package/src/components/VizScrollmapV2/useScrollmapOverlay.ts +187 -0
  169. package/src/components/index.tsx +2 -0
  170. package/src/configs/iframe.ts +15 -0
  171. package/src/configs/index.ts +2 -0
  172. package/src/configs/style.ts +21 -0
  173. package/src/constants/index.ts +4 -0
  174. package/src/global.d.ts +5 -0
  175. package/src/helpers/elm-callout.ts +347 -0
  176. package/src/helpers/elm-getter.ts +70 -0
  177. package/src/helpers/iframe-helper/fixer.ts +100 -0
  178. package/src/helpers/iframe-helper/index.ts +1 -0
  179. package/src/helpers/iframe-helper/init.ts +56 -0
  180. package/src/helpers/iframe-helper/navigation-blocker-v2.ts +371 -0
  181. package/src/helpers/iframe-helper/navigation-blocker.ts +367 -0
  182. package/src/helpers/iframe-helper/style-replacer.ts +231 -0
  183. package/src/helpers/iframe.ts +42 -0
  184. package/src/helpers/index.ts +8 -0
  185. package/src/helpers/viz-canvas/area-clustering.ts +234 -0
  186. package/src/helpers/viz-canvas/area-overlay-manager-v2.ts +176 -0
  187. package/src/helpers/viz-canvas/area-overlay-manager.ts +273 -0
  188. package/src/helpers/viz-canvas/hierarchical-area-clustering.ts +420 -0
  189. package/src/helpers/viz-canvas/index.ts +2 -0
  190. package/src/helpers/viz-elements.ts +43 -0
  191. package/src/hooks/index.ts +8 -0
  192. package/src/hooks/register/index.ts +4 -0
  193. package/src/hooks/register/useRegisterConfig.ts +17 -0
  194. package/src/hooks/register/useRegisterControl.ts +13 -0
  195. package/src/hooks/register/useRegisterData.ts +36 -0
  196. package/src/hooks/register/useRegisterHeatmap.ts +38 -0
  197. package/src/hooks/viz-area/useAreaHeatmap.ts +336 -0
  198. package/src/hooks/viz-area/useAreaHeatmapManager.ts +692 -0
  199. package/src/hooks/viz-canvas/index.ts +1 -0
  200. package/src/hooks/viz-canvas/useAreamap.ts +162 -0
  201. package/src/hooks/viz-canvas/useClickmap.ts +24 -0
  202. package/src/hooks/viz-canvas/useHeatmapCanvas.ts +27 -0
  203. package/src/hooks/viz-canvas/useScrollmap.ts +22 -0
  204. package/src/hooks/viz-elements/index.ts +5 -0
  205. package/src/hooks/viz-elements/useClickedElement.ts +86 -0
  206. package/src/hooks/viz-elements/useElementCalloutVisible.ts +45 -0
  207. package/src/hooks/viz-elements/useHeatmapEffects.ts +30 -0
  208. package/src/hooks/viz-elements/useHeatmapElementPosition.ts +60 -0
  209. package/src/hooks/viz-elements/useHeatmapMouseHandler.ts +255 -0
  210. package/src/hooks/viz-elements/useHoveredElement.ts +170 -0
  211. package/src/hooks/viz-live/index.ts +1 -0
  212. package/src/hooks/viz-live/useVizLiveIframeMsg.ts +88 -0
  213. package/src/hooks/viz-live/useVizLiveRender.ts +67 -0
  214. package/src/hooks/viz-render/index.ts +1 -0
  215. package/src/hooks/viz-render/useHeatmapRender.ts +71 -0
  216. package/src/hooks/viz-render/useHeatmapVizRender.ts +20 -0
  217. package/src/hooks/viz-render/useReplayRender.ts +160 -0
  218. package/src/hooks/viz-scale/index.ts +2 -0
  219. package/src/hooks/viz-scale/useContainerDimensions.ts +48 -0
  220. package/src/hooks/viz-scale/useContentDimensions.ts +25 -0
  221. package/src/hooks/viz-scale/useHeatmapScale.ts +52 -0
  222. package/src/hooks/viz-scale/useObserveIframeHeight.ts +162 -0
  223. package/src/hooks/viz-scale/useScaleCalculation.ts +31 -0
  224. package/src/hooks/viz-scale/useScrollSync.ts +36 -0
  225. package/src/hooks/viz-scale/useWrapperRefHeight.ts +91 -0
  226. package/src/hooks/viz-scrollmap/index.ts +2 -0
  227. package/src/hooks/viz-scrollmap/useScrollmapZones.ts +165 -0
  228. package/src/hooks/viz-scrollmap/useZonePositions.ts +38 -0
  229. package/src/index.ts +10 -0
  230. package/src/stores/comp.ts +31 -0
  231. package/src/stores/config.ts +37 -0
  232. package/src/stores/data.ts +30 -0
  233. package/src/stores/index.ts +10 -0
  234. package/src/stores/interaction.ts +32 -0
  235. package/src/stores/mode-live.ts +38 -0
  236. package/src/stores/mode-single.ts +18 -0
  237. package/src/stores/viz-scrollmap.ts +22 -0
  238. package/src/stores/viz.ts +17 -0
  239. package/src/styles/base.css +1 -0
  240. package/src/styles/style.css +137 -0
  241. package/src/types/clarity.ts +45 -0
  242. package/src/types/control.ts +10 -0
  243. package/src/types/elm-callout.ts +9 -0
  244. package/src/types/heatmap-info.ts +11 -0
  245. package/src/types/heatmap.ts +25 -0
  246. package/src/types/iframe-helper.ts +18 -0
  247. package/src/types/index.ts +12 -0
  248. package/src/types/viz-canvas.ts +20 -0
  249. package/src/types/viz-element.ts +34 -0
  250. package/src/types/viz-scrollmap.ts +28 -0
  251. package/src/ui/BoxStack/BoxStack.tsx +136 -0
  252. package/src/ui/BoxStack/index.ts +1 -0
  253. package/src/ui/index.ts +1 -0
  254. package/src/utils/debounce.ts +10 -0
  255. package/src/utils/device.ts +7 -0
  256. package/src/utils/retry.ts +20 -0
  257. package/src/utils/sort.ts +5 -0
  258. package/dist/esm/helpers/iframe-helper/fixer.d.ts +0 -18
  259. package/dist/esm/helpers/iframe-helper/fixer.d.ts.map +0 -1
  260. package/dist/esm/helpers/iframe-helper/index.d.ts +0 -2
  261. package/dist/esm/helpers/iframe-helper/index.d.ts.map +0 -1
  262. package/dist/esm/helpers/iframe-helper/init.d.ts +0 -5
  263. package/dist/esm/helpers/iframe-helper/init.d.ts.map +0 -1
  264. package/dist/esm/helpers/iframe-helper/navigation-blocker-v2.d.ts +0 -28
  265. package/dist/esm/helpers/iframe-helper/navigation-blocker-v2.d.ts.map +0 -1
  266. package/dist/esm/helpers/iframe-helper/navigation-blocker.d.ts +0 -20
  267. package/dist/esm/helpers/iframe-helper/navigation-blocker.d.ts.map +0 -1
  268. package/dist/esm/helpers/iframe-helper/style-replacer.d.ts +0 -25
  269. package/dist/esm/helpers/iframe-helper/style-replacer.d.ts.map +0 -1
  270. package/dist/esm/hooks/vix-elements/useHeatmapMouseHandler.d.ts +0 -34
  271. package/dist/esm/hooks/vix-elements/useHeatmapMouseHandler.d.ts.map +0 -1
  272. package/dist/esm/hooks/viz-live/useVizLiveIframeMsg.d.ts.map +0 -1
  273. package/dist/esm/hooks/viz-live/useVizLiveRender.d.ts +0 -4
  274. package/dist/esm/hooks/viz-live/useVizLiveRender.d.ts.map +0 -1
  275. package/dist/esm/hooks/viz-scale/useObserveIframeHeight.d.ts +0 -10
  276. package/dist/esm/hooks/viz-scale/useObserveIframeHeight.d.ts.map +0 -1
  277. package/dist/esm/stores/mode-single.d.ts +0 -9
  278. package/dist/esm/stores/mode-single.d.ts.map +0 -1
  279. package/dist/esm/types/iframe-helper.d.ts +0 -20
  280. package/dist/esm/types/iframe-helper.d.ts.map +0 -1
  281. package/dist/umd/helpers/iframe-helper/fixer.d.ts +0 -18
  282. package/dist/umd/helpers/iframe-helper/fixer.d.ts.map +0 -1
  283. package/dist/umd/helpers/iframe-helper/index.d.ts +0 -2
  284. package/dist/umd/helpers/iframe-helper/index.d.ts.map +0 -1
  285. package/dist/umd/helpers/iframe-helper/init.d.ts +0 -5
  286. package/dist/umd/helpers/iframe-helper/init.d.ts.map +0 -1
  287. package/dist/umd/helpers/iframe-helper/navigation-blocker-v2.d.ts +0 -28
  288. package/dist/umd/helpers/iframe-helper/navigation-blocker-v2.d.ts.map +0 -1
  289. package/dist/umd/helpers/iframe-helper/navigation-blocker.d.ts +0 -20
  290. package/dist/umd/helpers/iframe-helper/navigation-blocker.d.ts.map +0 -1
  291. package/dist/umd/helpers/iframe-helper/style-replacer.d.ts +0 -25
  292. package/dist/umd/helpers/iframe-helper/style-replacer.d.ts.map +0 -1
  293. package/dist/umd/hooks/vix-elements/useHeatmapMouseHandler.d.ts +0 -34
  294. package/dist/umd/hooks/vix-elements/useHeatmapMouseHandler.d.ts.map +0 -1
  295. package/dist/umd/hooks/viz-live/useVizLiveIframeMsg.d.ts.map +0 -1
  296. package/dist/umd/hooks/viz-live/useVizLiveRender.d.ts +0 -4
  297. package/dist/umd/hooks/viz-live/useVizLiveRender.d.ts.map +0 -1
  298. package/dist/umd/hooks/viz-scale/useObserveIframeHeight.d.ts +0 -10
  299. package/dist/umd/hooks/viz-scale/useObserveIframeHeight.d.ts.map +0 -1
  300. package/dist/umd/stores/mode-single.d.ts +0 -9
  301. package/dist/umd/stores/mode-single.d.ts.map +0 -1
  302. package/dist/umd/types/iframe-helper.d.ts +0 -20
  303. package/dist/umd/types/iframe-helper.d.ts.map +0 -1
@@ -0,0 +1,162 @@
1
+ import { useCallback, useEffect, useRef, useState } from 'react';
2
+ import { AreaMapData, AreaOverlayManagerV2 } from '../../helpers';
3
+ import { useHeatmapDataStore } from '../../stores';
4
+ import { IClusterArea } from '../../types';
5
+
6
+ interface IAreamapReturn {
7
+ start: () => void;
8
+ clear: () => void;
9
+ refresh: () => void;
10
+ isInitialized: boolean;
11
+ areas: IClusterArea[];
12
+ }
13
+
14
+ interface IAreamapProps {
15
+ iframeRef: React.RefObject<HTMLIFrameElement>;
16
+ }
17
+ export const useAreamap = ({ iframeRef }: IAreamapProps): IAreamapReturn => {
18
+ const [isInitialized, setIsInitialized] = useState(false);
19
+ const [areas, setAreas] = useState<IClusterArea[]>([]);
20
+
21
+ const clickmap = useHeatmapDataStore((state) => state.clickmap); // Area map data từ store
22
+
23
+ const managerRef = useRef<AreaOverlayManagerV2 | null>(null);
24
+ const resizeObserverRef = useRef<ResizeObserver | null>(null);
25
+
26
+ /**
27
+ * Start rendering area overlays
28
+ */
29
+ const start = useCallback(() => {
30
+ if (isInitialized) {
31
+ console.log('[useAreamap] Already initialized');
32
+ return;
33
+ }
34
+
35
+ const iframe = iframeRef?.current;
36
+ if (!iframe || !clickmap || clickmap.length === 0) {
37
+ console.warn('[useAreamap] Missing iframe or areamap data');
38
+ return;
39
+ }
40
+
41
+ try {
42
+ // Khởi tạo manager
43
+ if (!managerRef.current) {
44
+ managerRef.current = new AreaOverlayManagerV2(iframe);
45
+ }
46
+
47
+ managerRef.current.init();
48
+
49
+ // Transform data nếu cần
50
+ const areaMapData: AreaMapData = transformToAreaMapData(clickmap);
51
+
52
+ // Render areas
53
+ managerRef.current.render(areaMapData);
54
+ setAreas(managerRef.current.getAreas());
55
+ setIsInitialized(true);
56
+
57
+ // Setup resize observer để update positions khi iframe thay đổi
58
+ setupResizeObserver(iframe);
59
+
60
+ console.log('[useAreamap] Started successfully');
61
+ } catch (error) {
62
+ console.error('[useAreamap] Error:', error);
63
+ }
64
+ }, [iframeRef, clickmap, isInitialized]);
65
+
66
+ /**
67
+ * Clear all areas
68
+ */
69
+ const clear = useCallback(() => {
70
+ if (managerRef.current) {
71
+ managerRef.current.clear();
72
+ setAreas([]);
73
+ setIsInitialized(false);
74
+ }
75
+
76
+ cleanupResizeObserver();
77
+ }, []);
78
+
79
+ /**
80
+ * Refresh (re-render) areas
81
+ */
82
+ const refresh = useCallback(() => {
83
+ if (!managerRef.current || !clickmap) return;
84
+
85
+ const areaMapData: AreaMapData = transformToAreaMapData(clickmap);
86
+ managerRef.current.render(areaMapData);
87
+ setAreas(managerRef.current.getAreas());
88
+ }, [clickmap]);
89
+
90
+ /**
91
+ * Setup resize observer
92
+ */
93
+ const setupResizeObserver = (iframe: HTMLIFrameElement) => {
94
+ cleanupResizeObserver();
95
+
96
+ resizeObserverRef.current = new ResizeObserver(() => {
97
+ if (managerRef.current) {
98
+ // managerRef.current.updatePositions();
99
+ }
100
+ });
101
+
102
+ resizeObserverRef.current.observe(iframe);
103
+
104
+ // Observe iframe content document body
105
+ if (iframe.contentDocument?.body) {
106
+ resizeObserverRef.current.observe(iframe.contentDocument.body);
107
+ }
108
+ };
109
+
110
+ /**
111
+ * Cleanup resize observer
112
+ */
113
+ const cleanupResizeObserver = () => {
114
+ if (resizeObserverRef.current) {
115
+ resizeObserverRef.current.disconnect();
116
+ resizeObserverRef.current = null;
117
+ }
118
+ };
119
+
120
+ /**
121
+ * Cleanup on unmount
122
+ */
123
+ useEffect(() => {
124
+ return () => {
125
+ clear();
126
+ if (managerRef.current) {
127
+ managerRef.current.destroy();
128
+ managerRef.current = null;
129
+ }
130
+ };
131
+ }, []);
132
+
133
+ return {
134
+ start,
135
+ clear,
136
+ refresh,
137
+ isInitialized,
138
+ areas,
139
+ };
140
+ };
141
+
142
+ /**
143
+ * Transform raw areamap data to AreaMapData format
144
+ */
145
+ function transformToAreaMapData(areamap: any[]): AreaMapData {
146
+ // Giả sử areamap có format tương tự clickmap
147
+ // Adjust theo format thực tế của bạn
148
+ const totalClicks = areamap.reduce((sum, item) => sum + (item.totalclicks || 0), 0);
149
+
150
+ return {
151
+ clickData: areamap.map((item) => ({
152
+ hash: item.hash || '',
153
+ clicks: item.clicks || [],
154
+ x: item.x || [],
155
+ y: item.y || [],
156
+ points: item.points || 0,
157
+ totalclicks: item.totalclicks || 0,
158
+ selector: item.selector || '',
159
+ })),
160
+ totalClicks,
161
+ };
162
+ }
@@ -0,0 +1,24 @@
1
+ import { useCallback, useState } from 'react';
2
+ import { useHeatmapDataStore, useHeatmapSingleStore } from '../../stores';
3
+
4
+ export const useClickmap = () => {
5
+ const [isInitialized, setIsInitialized] = useState(false);
6
+
7
+ const clickmap = useHeatmapDataStore((state) => state.clickmap);
8
+ const vizRef = useHeatmapSingleStore((state) => state.vizRef);
9
+
10
+ const start = useCallback(() => {
11
+ if (isInitialized) return;
12
+ if (!vizRef || !clickmap || clickmap.length === 0) return;
13
+
14
+ try {
15
+ vizRef?.clearmap?.();
16
+ vizRef?.clickmap?.(clickmap);
17
+ setIsInitialized(true);
18
+ } catch (error) {
19
+ console.error(`🚀 🐥 ~ useClickmap ~ error:`, error);
20
+ }
21
+ }, [vizRef, clickmap]);
22
+
23
+ return { start };
24
+ };
@@ -0,0 +1,27 @@
1
+ import { useEffect } from 'react';
2
+ import { useHeatmapConfigStore } from '../../stores';
3
+ import { IHeatmapType } from '../../types';
4
+ import { useClickmap } from './useClickmap';
5
+ import { useScrollmap } from './useScrollmap';
6
+
7
+ export const useHeatmapCanvas = ({
8
+ iframeRef,
9
+ }: {
10
+ iframeRef: React.RefObject<HTMLIFrameElement>;
11
+ }) => {
12
+ const heatmapType = useHeatmapConfigStore((state) => state.heatmapType);
13
+
14
+ const { start: startClickmap } = useClickmap();
15
+ const { start: startScrollmap } = useScrollmap();
16
+
17
+ useEffect(() => {
18
+ switch (heatmapType) {
19
+ case IHeatmapType.Click:
20
+ startClickmap();
21
+ break;
22
+ case IHeatmapType.Scroll:
23
+ startScrollmap();
24
+ break;
25
+ }
26
+ }, [heatmapType, startClickmap, startScrollmap]);
27
+ };
@@ -0,0 +1,22 @@
1
+ import { useCallback } from 'react';
2
+ import { useHeatmapDataStore, useHeatmapSingleStore } from '../../stores';
3
+
4
+ export const useScrollmap = () => {
5
+ const vizRef = useHeatmapSingleStore((state) => state.vizRef);
6
+ const scrollmap = useHeatmapDataStore((state) => state.scrollmap);
7
+
8
+ const start = useCallback(() => {
9
+ // if (isInitialized) return;
10
+
11
+ if (!vizRef || !scrollmap || scrollmap.length === 0) return;
12
+ try {
13
+ vizRef?.clearmap?.();
14
+ vizRef?.scrollmap?.(scrollmap);
15
+ // setIsInitialized(true);
16
+ } catch (error) {
17
+ console.error(`🚀 🐥 ~ useScrollmap ~ error:`, error);
18
+ }
19
+ }, [vizRef, scrollmap]);
20
+
21
+ return { start };
22
+ };
@@ -0,0 +1,5 @@
1
+ export * from './useClickedElement';
2
+ export * from './useElementCalloutVisible';
3
+ export * from './useHeatmapEffects';
4
+ export * from './useHeatmapElementPosition';
5
+ export * from './useHoveredElement';
@@ -0,0 +1,86 @@
1
+ import type { ElementInfo, ElementRect } from '../../types';
2
+
3
+ import { useEffect, useState } from 'react';
4
+ import { buildElementInfo, isElementInViewport } from '../../helpers';
5
+ import { useHeatmapDataStore, useHeatmapInteractionStore, useHeatmapVizStore } from '../../stores';
6
+
7
+ interface Params {
8
+ visualRef: React.RefObject<HTMLDivElement>;
9
+ getRect: (el?: any) => ElementRect | null;
10
+ }
11
+
12
+ const scrollToElementIfNeeded = (
13
+ visualRef: React.RefObject<HTMLDivElement>,
14
+ rect: ElementRect,
15
+ scale: number,
16
+ ): void => {
17
+ if (!visualRef.current) return;
18
+
19
+ const visualRect = visualRef.current.getBoundingClientRect();
20
+ if (isElementInViewport(rect, visualRef, scale)) {
21
+ return;
22
+ }
23
+
24
+ const topRaw = rect.top; // - visualRect.top
25
+ const topScaled = topRaw * scale;
26
+
27
+ const viewportHeight = visualRect.height;
28
+ const elementHeightScaled = rect.height * scale;
29
+ const scrollTop = topScaled - (viewportHeight - elementHeightScaled) / 2;
30
+
31
+ visualRef.current.scrollTo({
32
+ top: Math.max(0, scrollTop),
33
+ behavior: 'smooth',
34
+ });
35
+ };
36
+
37
+ export const useClickedElement = ({ visualRef, getRect }: Params) => {
38
+ const heatmapInfo = useHeatmapDataStore((state) => state.dataInfo);
39
+ const selectedElement = useHeatmapInteractionStore((state) => state.selectedElement);
40
+ const shouldShowCallout = useHeatmapInteractionStore((state) => state.shouldShowCallout);
41
+ const setShouldShowCallout = useHeatmapInteractionStore((state) => state.setShouldShowCallout);
42
+ const scale = useHeatmapVizStore((state) => state.scale);
43
+
44
+ const [clickedElement, setClickedElement] = useState<ElementInfo | null>(null);
45
+ const [showMissingElement, setShowMissingElement] = useState(false);
46
+
47
+ const reset = () => {
48
+ setClickedElement(null);
49
+ setShowMissingElement(false);
50
+ setShouldShowCallout(false);
51
+ };
52
+
53
+ useEffect(() => {
54
+ if (!selectedElement || !heatmapInfo?.elementMapInfo) {
55
+ reset();
56
+ return;
57
+ }
58
+
59
+ const info = heatmapInfo.elementMapInfo[selectedElement];
60
+ if (!info) {
61
+ setClickedElement(null);
62
+ return;
63
+ }
64
+
65
+ const hash = selectedElement;
66
+ const selector = info.selector;
67
+ const rect = getRect({ hash: selectedElement, selector });
68
+ const elementInfo = buildElementInfo(hash, rect, heatmapInfo);
69
+
70
+ if (!rect) {
71
+ setClickedElement(elementInfo);
72
+ setShowMissingElement(true);
73
+ setShouldShowCallout(false);
74
+ return;
75
+ }
76
+
77
+ setShowMissingElement(false);
78
+ scrollToElementIfNeeded(visualRef, rect, scale);
79
+ setShouldShowCallout(true);
80
+ requestAnimationFrame(() => {
81
+ setClickedElement(elementInfo);
82
+ });
83
+ }, [selectedElement, heatmapInfo, getRect, visualRef, scale]);
84
+
85
+ return { clickedElement, showMissingElement, shouldShowCallout, setShouldShowCallout };
86
+ };
@@ -0,0 +1,45 @@
1
+ import { useEffect } from 'react';
2
+ import { isElementInViewport } from '../../helpers';
3
+ import { useHeatmapDataStore, useHeatmapInteractionStore, useHeatmapVizStore } from '../../stores';
4
+
5
+ interface Params {
6
+ visualRef: React.RefObject<HTMLDivElement>;
7
+ getRect: (el?: any) => any;
8
+ }
9
+
10
+ export const useElementCalloutVisible = ({ visualRef, getRect }: Params) => {
11
+ const scale = useHeatmapVizStore((state) => state.scale);
12
+ const selectedElement = useHeatmapInteractionStore((state) => state.selectedElement);
13
+ const heatmapInfo = useHeatmapDataStore((state) => state.dataInfo);
14
+ const setShouldShowCallout = useHeatmapInteractionStore((state) => state.setShouldShowCallout);
15
+
16
+ useEffect(() => {
17
+ if (!selectedElement) return;
18
+
19
+ const elementIsInViewportFn = () => {
20
+ const elementInfo = heatmapInfo?.elementMapInfo?.[selectedElement];
21
+ if (!elementInfo) return;
22
+
23
+ const rect = getRect({ hash: selectedElement, selector: elementInfo.selector });
24
+ const isInViewport = isElementInViewport(rect, visualRef, scale);
25
+ setShouldShowCallout(isInViewport);
26
+ };
27
+
28
+ elementIsInViewportFn();
29
+ const handleUpdate = () => {
30
+ requestAnimationFrame(elementIsInViewportFn);
31
+ };
32
+
33
+ window.addEventListener('scroll', handleUpdate, true);
34
+ window.addEventListener('resize', handleUpdate);
35
+ visualRef?.current?.addEventListener('scroll', handleUpdate);
36
+
37
+ return () => {
38
+ window.removeEventListener('scroll', handleUpdate, true);
39
+ window.removeEventListener('resize', handleUpdate);
40
+ visualRef?.current?.removeEventListener('scroll', handleUpdate);
41
+ };
42
+ }, [selectedElement, visualRef, getRect, scale, heatmapInfo, setShouldShowCallout]);
43
+
44
+ return {};
45
+ };
@@ -0,0 +1,30 @@
1
+ import { useEffect } from 'react';
2
+ import { useHeatmapInteractionStore } from '../../stores';
3
+
4
+ export const useHeatmapEffects = ({
5
+ isVisible,
6
+ isElementSidebarOpen,
7
+ setShouldShowCallout,
8
+ resetAll,
9
+ }: {
10
+ isVisible?: boolean;
11
+ isElementSidebarOpen?: boolean;
12
+ setShouldShowCallout: (v: boolean) => void;
13
+ resetAll: () => void;
14
+ }) => {
15
+ const selectedElement = useHeatmapInteractionStore((state) => state.selectedElement);
16
+
17
+ // Reset khi ẩn
18
+ useEffect(() => {
19
+ if (!isVisible) resetAll();
20
+ }, [isVisible, resetAll]);
21
+
22
+ // Ẩn callout khi sidebar mở
23
+ useEffect(() => {
24
+ if (isElementSidebarOpen && selectedElement) {
25
+ setShouldShowCallout(false);
26
+ } else if (!isElementSidebarOpen && selectedElement) {
27
+ setShouldShowCallout(true);
28
+ }
29
+ }, [isElementSidebarOpen, selectedElement, setShouldShowCallout]);
30
+ };
@@ -0,0 +1,60 @@
1
+ import type { ElementRect, HeatmapElement, WebVisualizer } from '../../types';
2
+
3
+ import { useCallback } from 'react';
4
+ import { getElementLayout } from '../../helpers';
5
+ import { useHeatmapConfigStore, useHeatmapSingleStore, useHeatmapVizStore } from '../../stores';
6
+
7
+ interface Params {
8
+ iframeRef: React.RefObject<HTMLIFrameElement>;
9
+ wrapperRef: React.RefObject<HTMLElement>;
10
+ visualizer?: WebVisualizer;
11
+ }
12
+
13
+ export const useHeatmapElementPosition = ({ iframeRef, wrapperRef, visualizer }: Params) => {
14
+ const widthScale = useHeatmapVizStore((state) => state.scale);
15
+ const iframeHeight = useHeatmapSingleStore((state) => state.iframeHeight);
16
+ const heatmapWidth = useHeatmapConfigStore((state) => state.width);
17
+
18
+ return useCallback(
19
+ (element?: HeatmapElement): ElementRect | null => {
20
+ const hash = element?.hash;
21
+ if (!iframeRef.current?.contentDocument || !hash || !visualizer) return null;
22
+
23
+ let domElement: HTMLElement | null = null;
24
+ try {
25
+ domElement = visualizer.get(hash);
26
+ } catch (error) {
27
+ console.error('Visualizer error:', { hash, error });
28
+ return null;
29
+ }
30
+
31
+ if (!domElement) return null;
32
+
33
+ const layout = getElementLayout(domElement);
34
+ if (!layout) return null;
35
+
36
+ const parentEl = wrapperRef.current;
37
+ if (!parentEl) return null;
38
+
39
+ const scrollOffset = parentEl.scrollTop / widthScale;
40
+ const adjustedTop = layout.top + scrollOffset;
41
+
42
+ const outOfBounds =
43
+ adjustedTop < 0 ||
44
+ adjustedTop > (iframeHeight || Infinity) ||
45
+ layout.left < 0 ||
46
+ (typeof heatmapWidth === 'number' && layout.left > heatmapWidth);
47
+
48
+ if (outOfBounds) return null;
49
+
50
+ return {
51
+ left: layout.left,
52
+ top: adjustedTop,
53
+ width: Math.min(layout.width, heatmapWidth || layout.width),
54
+ height: layout.height,
55
+ outOfBounds,
56
+ };
57
+ },
58
+ [iframeRef, wrapperRef, visualizer, heatmapWidth, iframeHeight, widthScale],
59
+ );
60
+ };