@fivepixels-js/react 0.1.0

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 (387) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +648 -0
  3. package/dist/components/ShortcutHint.d.ts +8 -0
  4. package/dist/components/ShortcutHint.d.ts.map +1 -0
  5. package/dist/components/ShortcutHint.js +9 -0
  6. package/dist/components/ShortcutHint.js.map +1 -0
  7. package/dist/components/icons/Icons.d.ts +70 -0
  8. package/dist/components/icons/Icons.d.ts.map +1 -0
  9. package/dist/components/icons/Icons.js +127 -0
  10. package/dist/components/icons/Icons.js.map +1 -0
  11. package/dist/components/icons/MaterialIcon.d.ts +8 -0
  12. package/dist/components/icons/MaterialIcon.d.ts.map +1 -0
  13. package/dist/components/icons/MaterialIcon.js +5 -0
  14. package/dist/components/icons/MaterialIcon.js.map +1 -0
  15. package/dist/components/motion/index.d.ts +48 -0
  16. package/dist/components/motion/index.d.ts.map +1 -0
  17. package/dist/components/motion/index.js +910 -0
  18. package/dist/components/motion/index.js.map +1 -0
  19. package/dist/components/overlay/ReportOverlayLayer.d.ts +7 -0
  20. package/dist/components/overlay/ReportOverlayLayer.d.ts.map +1 -0
  21. package/dist/components/overlay/ReportOverlayLayer.js +14 -0
  22. package/dist/components/overlay/ReportOverlayLayer.js.map +1 -0
  23. package/dist/components/overlay/TargetHighlights.d.ts +9 -0
  24. package/dist/components/overlay/TargetHighlights.d.ts.map +1 -0
  25. package/dist/components/overlay/TargetHighlights.js +24 -0
  26. package/dist/components/overlay/TargetHighlights.js.map +1 -0
  27. package/dist/components/panel/PanelDockGuides.d.ts +8 -0
  28. package/dist/components/panel/PanelDockGuides.d.ts.map +1 -0
  29. package/dist/components/panel/PanelDockGuides.js +15 -0
  30. package/dist/components/panel/PanelDockGuides.js.map +1 -0
  31. package/dist/components/panel/PanelDropdownMenu.d.ts +19 -0
  32. package/dist/components/panel/PanelDropdownMenu.d.ts.map +1 -0
  33. package/dist/components/panel/PanelDropdownMenu.js +132 -0
  34. package/dist/components/panel/PanelDropdownMenu.js.map +1 -0
  35. package/dist/components/panel/PanelMoreMenu.d.ts +20 -0
  36. package/dist/components/panel/PanelMoreMenu.d.ts.map +1 -0
  37. package/dist/components/panel/PanelMoreMenu.js +20 -0
  38. package/dist/components/panel/PanelMoreMenu.js.map +1 -0
  39. package/dist/components/panel/PanelOptionSwitch.d.ts +14 -0
  40. package/dist/components/panel/PanelOptionSwitch.d.ts.map +1 -0
  41. package/dist/components/panel/PanelOptionSwitch.js +10 -0
  42. package/dist/components/panel/PanelOptionSwitch.js.map +1 -0
  43. package/dist/components/panel/ReportCommandPanel.d.ts +18 -0
  44. package/dist/components/panel/ReportCommandPanel.d.ts.map +1 -0
  45. package/dist/components/panel/ReportCommandPanel.js +43 -0
  46. package/dist/components/panel/ReportCommandPanel.js.map +1 -0
  47. package/dist/components/panel/ReportCommandReplaceConfirmDialog.d.ts +9 -0
  48. package/dist/components/panel/ReportCommandReplaceConfirmDialog.d.ts.map +1 -0
  49. package/dist/components/panel/ReportCommandReplaceConfirmDialog.js +7 -0
  50. package/dist/components/panel/ReportCommandReplaceConfirmDialog.js.map +1 -0
  51. package/dist/components/panel/ReportControlPanel.d.ts +2 -0
  52. package/dist/components/panel/ReportControlPanel.d.ts.map +1 -0
  53. package/dist/components/panel/ReportControlPanel.js +119 -0
  54. package/dist/components/panel/ReportControlPanel.js.map +1 -0
  55. package/dist/components/panel/ReportDraftForm.d.ts +2 -0
  56. package/dist/components/panel/ReportDraftForm.d.ts.map +1 -0
  57. package/dist/components/panel/ReportDraftForm.js +33 -0
  58. package/dist/components/panel/ReportDraftForm.js.map +1 -0
  59. package/dist/components/panel/ReportFeedbackList.d.ts +2 -0
  60. package/dist/components/panel/ReportFeedbackList.d.ts.map +1 -0
  61. package/dist/components/panel/ReportFeedbackList.js +165 -0
  62. package/dist/components/panel/ReportFeedbackList.js.map +1 -0
  63. package/dist/components/panel/ReportImportConfirmDialog.d.ts +8 -0
  64. package/dist/components/panel/ReportImportConfirmDialog.d.ts.map +1 -0
  65. package/dist/components/panel/ReportImportConfirmDialog.js +7 -0
  66. package/dist/components/panel/ReportImportConfirmDialog.js.map +1 -0
  67. package/dist/components/panel/ReportImportProjectMismatchDialog.d.ts +12 -0
  68. package/dist/components/panel/ReportImportProjectMismatchDialog.d.ts.map +1 -0
  69. package/dist/components/panel/ReportImportProjectMismatchDialog.js +19 -0
  70. package/dist/components/panel/ReportImportProjectMismatchDialog.js.map +1 -0
  71. package/dist/components/panel/ReportPersonalKeyDialog.d.ts +8 -0
  72. package/dist/components/panel/ReportPersonalKeyDialog.d.ts.map +1 -0
  73. package/dist/components/panel/ReportPersonalKeyDialog.js +60 -0
  74. package/dist/components/panel/ReportPersonalKeyDialog.js.map +1 -0
  75. package/dist/components/panel/ReportRouteDetails.d.ts +2 -0
  76. package/dist/components/panel/ReportRouteDetails.d.ts.map +1 -0
  77. package/dist/components/panel/ReportRouteDetails.js +18 -0
  78. package/dist/components/panel/ReportRouteDetails.js.map +1 -0
  79. package/dist/components/panel/feedback/AuthorSelector.d.ts +9 -0
  80. package/dist/components/panel/feedback/AuthorSelector.d.ts.map +1 -0
  81. package/dist/components/panel/feedback/AuthorSelector.js +17 -0
  82. package/dist/components/panel/feedback/AuthorSelector.js.map +1 -0
  83. package/dist/components/panel/feedback/FeedbackComposer.d.ts +23 -0
  84. package/dist/components/panel/feedback/FeedbackComposer.d.ts.map +1 -0
  85. package/dist/components/panel/feedback/FeedbackComposer.js +48 -0
  86. package/dist/components/panel/feedback/FeedbackComposer.js.map +1 -0
  87. package/dist/components/panel/feedback/FeedbackCreatorBadge.d.ts +2 -0
  88. package/dist/components/panel/feedback/FeedbackCreatorBadge.d.ts.map +1 -0
  89. package/dist/components/panel/feedback/FeedbackCreatorBadge.js +7 -0
  90. package/dist/components/panel/feedback/FeedbackCreatorBadge.js.map +1 -0
  91. package/dist/components/panel/feedback/FeedbackFieldTags.d.ts +9 -0
  92. package/dist/components/panel/feedback/FeedbackFieldTags.d.ts.map +1 -0
  93. package/dist/components/panel/feedback/FeedbackFieldTags.js +8 -0
  94. package/dist/components/panel/feedback/FeedbackFieldTags.js.map +1 -0
  95. package/dist/components/panel/feedback/FeedbackHoverCard.d.ts +11 -0
  96. package/dist/components/panel/feedback/FeedbackHoverCard.d.ts.map +1 -0
  97. package/dist/components/panel/feedback/FeedbackHoverCard.js +14 -0
  98. package/dist/components/panel/feedback/FeedbackHoverCard.js.map +1 -0
  99. package/dist/components/panel/feedback/FeedbackIssueHeader.d.ts +12 -0
  100. package/dist/components/panel/feedback/FeedbackIssueHeader.d.ts.map +1 -0
  101. package/dist/components/panel/feedback/FeedbackIssueHeader.js +10 -0
  102. package/dist/components/panel/feedback/FeedbackIssueHeader.js.map +1 -0
  103. package/dist/components/panel/feedback/FeedbackStatusBadge.d.ts +8 -0
  104. package/dist/components/panel/feedback/FeedbackStatusBadge.d.ts.map +1 -0
  105. package/dist/components/panel/feedback/FeedbackStatusBadge.js +10 -0
  106. package/dist/components/panel/feedback/FeedbackStatusBadge.js.map +1 -0
  107. package/dist/components/panel/feedback/FeedbackThread.d.ts +21 -0
  108. package/dist/components/panel/feedback/FeedbackThread.d.ts.map +1 -0
  109. package/dist/components/panel/feedback/FeedbackThread.js +90 -0
  110. package/dist/components/panel/feedback/FeedbackThread.js.map +1 -0
  111. package/dist/components/panel/feedback/FieldTagSelector.d.ts +9 -0
  112. package/dist/components/panel/feedback/FieldTagSelector.d.ts.map +1 -0
  113. package/dist/components/panel/feedback/FieldTagSelector.js +15 -0
  114. package/dist/components/panel/feedback/FieldTagSelector.js.map +1 -0
  115. package/dist/components/panel/feedback/GitIssueButton.d.ts +12 -0
  116. package/dist/components/panel/feedback/GitIssueButton.d.ts.map +1 -0
  117. package/dist/components/panel/feedback/GitIssueButton.js +43 -0
  118. package/dist/components/panel/feedback/GitIssueButton.js.map +1 -0
  119. package/dist/components/panel/feedback/GitIssuedThreadEntry.d.ts +8 -0
  120. package/dist/components/panel/feedback/GitIssuedThreadEntry.d.ts.map +1 -0
  121. package/dist/components/panel/feedback/GitIssuedThreadEntry.js +25 -0
  122. package/dist/components/panel/feedback/GitIssuedThreadEntry.js.map +1 -0
  123. package/dist/components/point/ReportDraftMarker.d.ts +2 -0
  124. package/dist/components/point/ReportDraftMarker.d.ts.map +1 -0
  125. package/dist/components/point/ReportDraftMarker.js +28 -0
  126. package/dist/components/point/ReportDraftMarker.js.map +1 -0
  127. package/dist/components/point/ReportMarkersLayer.d.ts +2 -0
  128. package/dist/components/point/ReportMarkersLayer.d.ts.map +1 -0
  129. package/dist/components/point/ReportMarkersLayer.js +129 -0
  130. package/dist/components/point/ReportMarkersLayer.js.map +1 -0
  131. package/dist/components/report/FivePixels.d.ts +50 -0
  132. package/dist/components/report/FivePixels.d.ts.map +1 -0
  133. package/dist/components/report/FivePixels.js +15 -0
  134. package/dist/components/report/FivePixels.js.map +1 -0
  135. package/dist/components/report/ReportView.d.ts +2 -0
  136. package/dist/components/report/ReportView.d.ts.map +1 -0
  137. package/dist/components/report/ReportView.js +14 -0
  138. package/dist/components/report/ReportView.js.map +1 -0
  139. package/dist/components/report/ShadowReportRoot.d.ts +9 -0
  140. package/dist/components/report/ShadowReportRoot.d.ts.map +1 -0
  141. package/dist/components/report/ShadowReportRoot.js +80 -0
  142. package/dist/components/report/ShadowReportRoot.js.map +1 -0
  143. package/dist/components/report/index.d.ts +13 -0
  144. package/dist/components/report/index.d.ts.map +1 -0
  145. package/dist/components/report/index.js +9 -0
  146. package/dist/components/report/index.js.map +1 -0
  147. package/dist/components/ui/HoverTooltip.d.ts +10 -0
  148. package/dist/components/ui/HoverTooltip.d.ts.map +1 -0
  149. package/dist/components/ui/HoverTooltip.js +64 -0
  150. package/dist/components/ui/HoverTooltip.js.map +1 -0
  151. package/dist/components/ui/IconTooltipButton.d.ts +12 -0
  152. package/dist/components/ui/IconTooltipButton.d.ts.map +1 -0
  153. package/dist/components/ui/IconTooltipButton.js +7 -0
  154. package/dist/components/ui/IconTooltipButton.js.map +1 -0
  155. package/dist/constants/feedbackStatus.d.ts +6 -0
  156. package/dist/constants/feedbackStatus.d.ts.map +1 -0
  157. package/dist/constants/feedbackStatus.js +27 -0
  158. package/dist/constants/feedbackStatus.js.map +1 -0
  159. package/dist/constants/project.d.ts +2 -0
  160. package/dist/constants/project.d.ts.map +1 -0
  161. package/dist/constants/project.js +2 -0
  162. package/dist/constants/project.js.map +1 -0
  163. package/dist/constants/report.d.ts +7 -0
  164. package/dist/constants/report.d.ts.map +1 -0
  165. package/dist/constants/report.js +14 -0
  166. package/dist/constants/report.js.map +1 -0
  167. package/dist/constants/reportShortcuts.d.ts +31 -0
  168. package/dist/constants/reportShortcuts.d.ts.map +1 -0
  169. package/dist/constants/reportShortcuts.js +9 -0
  170. package/dist/constants/reportShortcuts.js.map +1 -0
  171. package/dist/constants/storageKeys.d.ts +5 -0
  172. package/dist/constants/storageKeys.d.ts.map +1 -0
  173. package/dist/constants/storageKeys.js +16 -0
  174. package/dist/constants/storageKeys.js.map +1 -0
  175. package/dist/hooks/report.api.d.ts +8 -0
  176. package/dist/hooks/report.api.d.ts.map +1 -0
  177. package/dist/hooks/report.api.js +20 -0
  178. package/dist/hooks/report.api.js.map +1 -0
  179. package/dist/hooks/report.query.d.ts +27 -0
  180. package/dist/hooks/report.query.d.ts.map +1 -0
  181. package/dist/hooks/report.query.js +137 -0
  182. package/dist/hooks/report.query.js.map +1 -0
  183. package/dist/hooks/useAppearancePreference.d.ts +6 -0
  184. package/dist/hooks/useAppearancePreference.d.ts.map +1 -0
  185. package/dist/hooks/useAppearancePreference.js +40 -0
  186. package/dist/hooks/useAppearancePreference.js.map +1 -0
  187. package/dist/hooks/useCurrentPathname.d.ts +2 -0
  188. package/dist/hooks/useCurrentPathname.d.ts.map +1 -0
  189. package/dist/hooks/useCurrentPathname.js +18 -0
  190. package/dist/hooks/useCurrentPathname.js.map +1 -0
  191. package/dist/hooks/useIsMobileViewport.d.ts +2 -0
  192. package/dist/hooks/useIsMobileViewport.d.ts.map +1 -0
  193. package/dist/hooks/useIsMobileViewport.js +12 -0
  194. package/dist/hooks/useIsMobileViewport.js.map +1 -0
  195. package/dist/hooks/useLocalePreference.d.ts +6 -0
  196. package/dist/hooks/useLocalePreference.d.ts.map +1 -0
  197. package/dist/hooks/useLocalePreference.js +40 -0
  198. package/dist/hooks/useLocalePreference.js.map +1 -0
  199. package/dist/hooks/useNativeHover.d.ts +7 -0
  200. package/dist/hooks/useNativeHover.d.ts.map +1 -0
  201. package/dist/hooks/useNativeHover.js +28 -0
  202. package/dist/hooks/useNativeHover.js.map +1 -0
  203. package/dist/hooks/usePanelDock.d.ts +29 -0
  204. package/dist/hooks/usePanelDock.d.ts.map +1 -0
  205. package/dist/hooks/usePanelDock.js +279 -0
  206. package/dist/hooks/usePanelDock.js.map +1 -0
  207. package/dist/hooks/usePanelFeedbackTransfer.d.ts +59 -0
  208. package/dist/hooks/usePanelFeedbackTransfer.d.ts.map +1 -0
  209. package/dist/hooks/usePanelFeedbackTransfer.js +250 -0
  210. package/dist/hooks/usePanelFeedbackTransfer.js.map +1 -0
  211. package/dist/hooks/usePersonalKey.d.ts +30 -0
  212. package/dist/hooks/usePersonalKey.d.ts.map +1 -0
  213. package/dist/hooks/usePersonalKey.js +72 -0
  214. package/dist/hooks/usePersonalKey.js.map +1 -0
  215. package/dist/hooks/useReportPersistence.d.ts +63 -0
  216. package/dist/hooks/useReportPersistence.d.ts.map +1 -0
  217. package/dist/hooks/useReportPersistence.js +142 -0
  218. package/dist/hooks/useReportPersistence.js.map +1 -0
  219. package/dist/hooks/useReportShortcuts.d.ts +5 -0
  220. package/dist/hooks/useReportShortcuts.d.ts.map +1 -0
  221. package/dist/hooks/useReportShortcuts.js +117 -0
  222. package/dist/hooks/useReportShortcuts.js.map +1 -0
  223. package/dist/hooks/useReportState.d.ts +177 -0
  224. package/dist/hooks/useReportState.d.ts.map +1 -0
  225. package/dist/hooks/useReportState.js +904 -0
  226. package/dist/hooks/useReportState.js.map +1 -0
  227. package/dist/hooks/useResolvedAppearance.d.ts +4 -0
  228. package/dist/hooks/useResolvedAppearance.d.ts.map +1 -0
  229. package/dist/hooks/useResolvedAppearance.js +23 -0
  230. package/dist/hooks/useResolvedAppearance.js.map +1 -0
  231. package/dist/hooks/useTooltipLayout.d.ts +21 -0
  232. package/dist/hooks/useTooltipLayout.d.ts.map +1 -0
  233. package/dist/hooks/useTooltipLayout.js +45 -0
  234. package/dist/hooks/useTooltipLayout.js.map +1 -0
  235. package/dist/i18n/en.d.ts +3 -0
  236. package/dist/i18n/en.d.ts.map +1 -0
  237. package/dist/i18n/en.js +277 -0
  238. package/dist/i18n/en.js.map +1 -0
  239. package/dist/i18n/index.d.ts +20 -0
  240. package/dist/i18n/index.d.ts.map +1 -0
  241. package/dist/i18n/index.js +77 -0
  242. package/dist/i18n/index.js.map +1 -0
  243. package/dist/i18n/ko.d.ts +3 -0
  244. package/dist/i18n/ko.d.ts.map +1 -0
  245. package/dist/i18n/ko.js +277 -0
  246. package/dist/i18n/ko.js.map +1 -0
  247. package/dist/i18n/types.d.ts +267 -0
  248. package/dist/i18n/types.d.ts.map +1 -0
  249. package/dist/i18n/types.js +2 -0
  250. package/dist/i18n/types.js.map +1 -0
  251. package/dist/index.d.ts +4 -0
  252. package/dist/index.d.ts.map +1 -0
  253. package/dist/index.js +3 -0
  254. package/dist/index.js.map +1 -0
  255. package/dist/providers/ReportProvider.d.ts +52 -0
  256. package/dist/providers/ReportProvider.d.ts.map +1 -0
  257. package/dist/providers/ReportProvider.js +49 -0
  258. package/dist/providers/ReportProvider.js.map +1 -0
  259. package/dist/providers/reportContext.d.ts +286 -0
  260. package/dist/providers/reportContext.d.ts.map +1 -0
  261. package/dist/providers/reportContext.js +11 -0
  262. package/dist/providers/reportContext.js.map +1 -0
  263. package/dist/storage/local/localStorageAdapter.d.ts +12 -0
  264. package/dist/storage/local/localStorageAdapter.d.ts.map +1 -0
  265. package/dist/storage/local/localStorageAdapter.js +187 -0
  266. package/dist/storage/local/localStorageAdapter.js.map +1 -0
  267. package/dist/styles/reportStylesheet.d.ts +2 -0
  268. package/dist/styles/reportStylesheet.d.ts.map +1 -0
  269. package/dist/styles/reportStylesheet.js +3 -0
  270. package/dist/styles/reportStylesheet.js.map +1 -0
  271. package/dist/types/report-ui.d.ts +47 -0
  272. package/dist/types/report-ui.d.ts.map +1 -0
  273. package/dist/types/report-ui.js +2 -0
  274. package/dist/types/report-ui.js.map +1 -0
  275. package/dist/types/report.d.ts +177 -0
  276. package/dist/types/report.d.ts.map +1 -0
  277. package/dist/types/report.js +8 -0
  278. package/dist/types/report.js.map +1 -0
  279. package/dist/utils/coordinates.d.ts +63 -0
  280. package/dist/utils/coordinates.d.ts.map +1 -0
  281. package/dist/utils/coordinates.js +236 -0
  282. package/dist/utils/coordinates.js.map +1 -0
  283. package/dist/utils/dom.d.ts +14 -0
  284. package/dist/utils/dom.d.ts.map +1 -0
  285. package/dist/utils/dom.js +104 -0
  286. package/dist/utils/dom.js.map +1 -0
  287. package/dist/utils/env.d.ts +6 -0
  288. package/dist/utils/env.d.ts.map +1 -0
  289. package/dist/utils/env.js +18 -0
  290. package/dist/utils/env.js.map +1 -0
  291. package/dist/utils/feedbackDataTransfer.d.ts +31 -0
  292. package/dist/utils/feedbackDataTransfer.d.ts.map +1 -0
  293. package/dist/utils/feedbackDataTransfer.js +195 -0
  294. package/dist/utils/feedbackDataTransfer.js.map +1 -0
  295. package/dist/utils/feedbackThread.d.ts +14 -0
  296. package/dist/utils/feedbackThread.d.ts.map +1 -0
  297. package/dist/utils/feedbackThread.js +57 -0
  298. package/dist/utils/feedbackThread.js.map +1 -0
  299. package/dist/utils/feedbackTransferSchema.d.ts +37 -0
  300. package/dist/utils/feedbackTransferSchema.d.ts.map +1 -0
  301. package/dist/utils/feedbackTransferSchema.js +162 -0
  302. package/dist/utils/feedbackTransferSchema.js.map +1 -0
  303. package/dist/utils/fields.d.ts +11 -0
  304. package/dist/utils/fields.d.ts.map +1 -0
  305. package/dist/utils/fields.js +43 -0
  306. package/dist/utils/fields.js.map +1 -0
  307. package/dist/utils/format.d.ts +6 -0
  308. package/dist/utils/format.d.ts.map +1 -0
  309. package/dist/utils/format.js +46 -0
  310. package/dist/utils/format.js.map +1 -0
  311. package/dist/utils/formatStatCount.d.ts +2 -0
  312. package/dist/utils/formatStatCount.d.ts.map +1 -0
  313. package/dist/utils/formatStatCount.js +4 -0
  314. package/dist/utils/formatStatCount.js.map +1 -0
  315. package/dist/utils/githubIntegration.d.ts +12 -0
  316. package/dist/utils/githubIntegration.d.ts.map +1 -0
  317. package/dist/utils/githubIntegration.js +56 -0
  318. package/dist/utils/githubIntegration.js.map +1 -0
  319. package/dist/utils/hoverTooltipLayout.d.ts +8 -0
  320. package/dist/utils/hoverTooltipLayout.d.ts.map +1 -0
  321. package/dist/utils/hoverTooltipLayout.js +30 -0
  322. package/dist/utils/hoverTooltipLayout.js.map +1 -0
  323. package/dist/utils/locateFeedback.d.ts +11 -0
  324. package/dist/utils/locateFeedback.d.ts.map +1 -0
  325. package/dist/utils/locateFeedback.js +16 -0
  326. package/dist/utils/locateFeedback.js.map +1 -0
  327. package/dist/utils/panelTypography.d.ts +4 -0
  328. package/dist/utils/panelTypography.d.ts.map +1 -0
  329. package/dist/utils/panelTypography.js +4 -0
  330. package/dist/utils/panelTypography.js.map +1 -0
  331. package/dist/utils/pathname.d.ts +2 -0
  332. package/dist/utils/pathname.d.ts.map +1 -0
  333. package/dist/utils/pathname.js +10 -0
  334. package/dist/utils/pathname.js.map +1 -0
  335. package/dist/utils/pathnameNavigation.d.ts +4 -0
  336. package/dist/utils/pathnameNavigation.d.ts.map +1 -0
  337. package/dist/utils/pathnameNavigation.js +52 -0
  338. package/dist/utils/pathnameNavigation.js.map +1 -0
  339. package/dist/utils/personalKey.d.ts +45 -0
  340. package/dist/utils/personalKey.d.ts.map +1 -0
  341. package/dist/utils/personalKey.js +180 -0
  342. package/dist/utils/personalKey.js.map +1 -0
  343. package/dist/utils/projectId.d.ts +2 -0
  344. package/dist/utils/projectId.d.ts.map +1 -0
  345. package/dist/utils/projectId.js +14 -0
  346. package/dist/utils/projectId.js.map +1 -0
  347. package/dist/utils/reportCallbacks.d.ts +20 -0
  348. package/dist/utils/reportCallbacks.d.ts.map +1 -0
  349. package/dist/utils/reportCallbacks.js +42 -0
  350. package/dist/utils/reportCallbacks.js.map +1 -0
  351. package/dist/utils/reportProject.d.ts +17 -0
  352. package/dist/utils/reportProject.d.ts.map +1 -0
  353. package/dist/utils/reportProject.js +9 -0
  354. package/dist/utils/reportProject.js.map +1 -0
  355. package/dist/utils/reportTeam.d.ts +15 -0
  356. package/dist/utils/reportTeam.d.ts.map +1 -0
  357. package/dist/utils/reportTeam.js +8 -0
  358. package/dist/utils/reportTeam.js.map +1 -0
  359. package/dist/utils/reportUi.d.ts +24 -0
  360. package/dist/utils/reportUi.d.ts.map +1 -0
  361. package/dist/utils/reportUi.js +19 -0
  362. package/dist/utils/reportUi.js.map +1 -0
  363. package/dist/utils/reportVisibility.d.ts +19 -0
  364. package/dist/utils/reportVisibility.d.ts.map +1 -0
  365. package/dist/utils/reportVisibility.js +12 -0
  366. package/dist/utils/reportVisibility.js.map +1 -0
  367. package/dist/utils/reportVisual.d.ts +12 -0
  368. package/dist/utils/reportVisual.d.ts.map +1 -0
  369. package/dist/utils/reportVisual.js +31 -0
  370. package/dist/utils/reportVisual.js.map +1 -0
  371. package/dist/utils/routeDetailStatus.d.ts +7 -0
  372. package/dist/utils/routeDetailStatus.d.ts.map +1 -0
  373. package/dist/utils/routeDetailStatus.js +29 -0
  374. package/dist/utils/routeDetailStatus.js.map +1 -0
  375. package/dist/utils/shortcuts.d.ts +12 -0
  376. package/dist/utils/shortcuts.d.ts.map +1 -0
  377. package/dist/utils/shortcuts.js +59 -0
  378. package/dist/utils/shortcuts.js.map +1 -0
  379. package/dist/utils/storage.d.ts +17 -0
  380. package/dist/utils/storage.d.ts.map +1 -0
  381. package/dist/utils/storage.js +36 -0
  382. package/dist/utils/storage.js.map +1 -0
  383. package/dist/utils/validateFeedbackImport.d.ts +4 -0
  384. package/dist/utils/validateFeedbackImport.d.ts.map +1 -0
  385. package/dist/utils/validateFeedbackImport.js +187 -0
  386. package/dist/utils/validateFeedbackImport.js.map +1 -0
  387. package/package.json +68 -0
@@ -0,0 +1,904 @@
1
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
2
+ import { ensureReportLocaleMessages, getReportMessages, setActiveReportMessages } from "../i18n/index.js";
3
+ import { useReportShortcuts } from "./useReportShortcuts.js";
4
+ import { useReportPersistence } from "./useReportPersistence.js";
5
+ import { useIsMobileViewport } from "./useIsMobileViewport.js";
6
+ import { useAppearancePreference } from "./useAppearancePreference.js";
7
+ import { useLocalePreference } from "./useLocalePreference.js";
8
+ import { usePersonalKey } from "./usePersonalKey.js";
9
+ import { useResolvedAppearance } from "./useResolvedAppearance.js";
10
+ import { createReplyStatusForSubmit, resolveOriginalFeedbackAuthorName } from "../utils/feedbackThread.js";
11
+ import { clampRatio, getMarkerFromReport, resolveTooltipAnchor } from "../utils/coordinates.js";
12
+ import { scrollToFeedbackTarget } from "../utils/locateFeedback.js";
13
+ const MARKER_HOVER_LEAVE_MS = 250;
14
+ const OVERLAY_HOVER_LEAVE_MS = 100;
15
+ import { findTargetByPoint, getSelectableTargets, isSameHoverTarget, toSnapshot } from "../utils/dom.js";
16
+ import { createInitialFieldValues, getFieldError, getFieldTags } from "../utils/fields.js";
17
+ import { createReplyId } from "../utils/format.js";
18
+ import { notifyFeedbackCreate, notifyFeedbackDelete, notifyFeedbackReply, notifyFeedbackUpdate, notifyGitHubIssueCreated, } from "../utils/reportCallbacks.js";
19
+ import { buildGitHubIssueUpdate, canCreateGitHubIssueFromList, canCreateGitHubIssueOnCreate, isGitIssued, } from "../utils/githubIntegration.js";
20
+ function resolveDefaultAuthorName(identify, authors) {
21
+ if (identify?.name) {
22
+ return identify.name;
23
+ }
24
+ return authors[0]?.name ?? "";
25
+ }
26
+ export function useReportState({ projectId, environment, appVersion, appearance, fields, authors = [], requireReviewerKey = false, shortcut: _shortcut, identify, onList, onListAll, onNavigate, onCreate, onUpdate, onDelete, onEvent, onReply, github, routeKey, showFeedbackList, visibleShortcutKeys = false, initialLocale, messageOverrides, }) {
27
+ const { appearance: activeAppearance, setAppearance } = useAppearancePreference(appearance);
28
+ const { locale, setLocale } = useLocalePreference(initialLocale);
29
+ const [localeMessagesReady, setLocaleMessagesReady] = useState(locale !== "ko");
30
+ const messages = useMemo(() => getReportMessages(locale, messageOverrides), [locale, localeMessagesReady, messageOverrides]);
31
+ useEffect(() => {
32
+ if (locale !== "ko") {
33
+ setLocaleMessagesReady(true);
34
+ return;
35
+ }
36
+ let cancelled = false;
37
+ setLocaleMessagesReady(false);
38
+ void ensureReportLocaleMessages("ko").then(() => {
39
+ if (!cancelled) {
40
+ setLocaleMessagesReady(true);
41
+ }
42
+ });
43
+ return () => {
44
+ cancelled = true;
45
+ };
46
+ }, [locale]);
47
+ useEffect(() => {
48
+ setActiveReportMessages(messages);
49
+ }, [messages]);
50
+ const overlayRef = useRef(null);
51
+ const searchInputRef = useRef(null);
52
+ const hoveredElementRef = useRef(null);
53
+ const selectedElementRef = useRef(null);
54
+ const hoverLeaveTimeoutRef = useRef(null);
55
+ const overlayHoverLeaveTimeoutRef = useRef(null);
56
+ const resolvedAppearance = useResolvedAppearance(activeAppearance);
57
+ const isMobileViewport = useIsMobileViewport();
58
+ const { canTransferFeedback, canListAllFeedback, currentPathname, listScope, setListScope, filters, setFilters, selectedReportId, setSelectedReportId, reports, filteredReports, currentPageFilteredReports, routeDetailsStats, selectedReport, isError, isFetching, hasNextPage, isFetchingNextPage, fetchNextPage, isCreating, isUpdating, isDeleting, queryErrorMessage, refetch, createFeedback, updateFeedback, deleteFeedback, } = useReportPersistence({
59
+ projectId,
60
+ environment,
61
+ appVersion,
62
+ fields,
63
+ onList,
64
+ onListAll,
65
+ onCreate,
66
+ onUpdate,
67
+ onDelete,
68
+ routeKey,
69
+ });
70
+ const eventCallbacks = useMemo(() => ({
71
+ onEvent,
72
+ onReply,
73
+ }), [onEvent, onReply]);
74
+ const { personalKey, publicKey, personalKeyRequired, personalKeyPendingRegistration, personalKeyCandidates, authorizedAuthors, issuePersonalKey, rotatePersonalKey, insertPersonalKey, signPayload, } = usePersonalKey({
75
+ enabled: requireReviewerKey || authors.some((author) => Boolean(author.publicKey)),
76
+ projectId,
77
+ environment,
78
+ identify,
79
+ authors,
80
+ });
81
+ const activeIdentify = authorizedAuthors[0] ?? (personalKeyRequired ? undefined : identify);
82
+ const signCreatePayload = async (payload) => {
83
+ const auth = await signPayload("feedback:create", payload);
84
+ return auth ? { ...payload, auth } : payload;
85
+ };
86
+ const signUpdatePayload = async (payload) => {
87
+ if (personalKeyRequired) {
88
+ throw new Error(messages.errors.personalKeyRequired);
89
+ }
90
+ const auth = await signPayload("feedback:update", payload);
91
+ return auth ? { ...payload, auth } : payload;
92
+ };
93
+ const [mode, setMode] = useState("idle");
94
+ const [showTargetPreview, setShowTargetPreview] = useState(false);
95
+ const [selectableTargets, setSelectableTargets] = useState([]);
96
+ const [errorMessage, setErrorMessage] = useState("");
97
+ const [draft, setDraft] = useState(null);
98
+ const [hoveredTarget, setHoveredTarget] = useState(null);
99
+ const [selectedTarget, setSelectedTarget] = useState(null);
100
+ const [markers, setMarkers] = useState([]);
101
+ const [hoveredMarkerId, setHoveredMarkerId] = useState(null);
102
+ const [activeReplyReportId, setActiveReplyReportId] = useState(null);
103
+ const [replyDraft, setReplyDraft] = useState("");
104
+ const [draftAuthorName, setDraftAuthorName] = useState(() => resolveDefaultAuthorName(activeIdentify, authorizedAuthors));
105
+ const [replyAuthorName, setReplyAuthorName] = useState(() => resolveDefaultAuthorName(activeIdentify, authorizedAuthors));
106
+ const [pendingComposer, setPendingComposer] = useState(null);
107
+ const [confirmAuthorName, setConfirmAuthorName] = useState("");
108
+ const [showConfirmAuthorSelect, setShowConfirmAuthorSelect] = useState(false);
109
+ const pendingLocateReportIdRef = useRef(null);
110
+ const [editingReportId, setEditingReportId] = useState(null);
111
+ const [editableDraft, setEditableDraft] = useState(null);
112
+ const [panelTab, setPanelTab] = useState(null);
113
+ const [creatingGitHubIssueId, setCreatingGitHubIssueId] = useState(null);
114
+ const canCreateGitHubIssueFromListValue = useMemo(() => canCreateGitHubIssueFromList(github), [github]);
115
+ const canCreateGitHubIssueOnCreateValue = useMemo(() => canCreateGitHubIssueOnCreate(github), [github]);
116
+ const activeReplyAnchor = useMemo(() => resolveTooltipAnchor(markers, activeReplyReportId), [activeReplyReportId, markers]);
117
+ const activeReplyReport = activeReplyAnchor?.report ?? null;
118
+ const tooltipAnchor = useMemo(() => {
119
+ const hoveredAnchor = resolveTooltipAnchor(markers, hoveredMarkerId);
120
+ if (!activeReplyReportId) {
121
+ return hoveredAnchor;
122
+ }
123
+ if (hoveredMarkerId && hoveredMarkerId !== activeReplyReportId) {
124
+ return hoveredAnchor;
125
+ }
126
+ return activeReplyAnchor ?? hoveredAnchor;
127
+ }, [activeReplyAnchor, activeReplyReportId, hoveredMarkerId, markers]);
128
+ const tooltipReport = tooltipAnchor?.report ?? null;
129
+ const tooltipFieldTags = useMemo(() => (tooltipReport ? getFieldTags(fields, tooltipReport.field_values) : []), [fields, tooltipReport]);
130
+ const targetStats = useMemo(() => {
131
+ const groupCount = selectableTargets.filter((target) => target.type === "group").length;
132
+ const itemCount = selectableTargets.filter((target) => target.type === "item").length;
133
+ const foundCount = mode === "view" && !isFetching ? currentPageFilteredReports.length : selectableTargets.length;
134
+ return {
135
+ found: foundCount,
136
+ group: groupCount,
137
+ item: itemCount,
138
+ };
139
+ }, [currentPageFilteredReports.length, isFetching, mode, selectableTargets]);
140
+ const statusText = useMemo(() => {
141
+ if (mode === "report") {
142
+ const focusTarget = selectedTarget ?? hoveredTarget;
143
+ if (!focusTarget) {
144
+ return "";
145
+ }
146
+ const typeLabel = focusTarget.type === "item" ? messages.statusText.selectedItem : messages.statusText.selectedGroup;
147
+ return `${typeLabel}\n${focusTarget.id}`;
148
+ }
149
+ if (mode === "view") {
150
+ return isFetching ? messages.statusText.loadingFeedback : messages.statusText.ready;
151
+ }
152
+ if (showTargetPreview) {
153
+ return messages.statusText.showingSelectableTargets(selectableTargets.length);
154
+ }
155
+ if (selectableTargets.length === 0) {
156
+ return messages.statusText.noSelectableTargets;
157
+ }
158
+ return messages.statusText.ready;
159
+ }, [filteredReports.length, isFetching, hoveredTarget, messages.statusText, mode, selectableTargets.length, selectedTarget, showTargetPreview]);
160
+ useEffect(() => {
161
+ setDraft(null);
162
+ setErrorMessage("");
163
+ setHoveredTarget(null);
164
+ setSelectedTarget(null);
165
+ setHoveredMarkerId(null);
166
+ setActiveReplyReportId(null);
167
+ setReplyDraft("");
168
+ setPendingComposer(null);
169
+ setShowConfirmAuthorSelect(false);
170
+ setConfirmAuthorName("");
171
+ setDraftAuthorName(resolveDefaultAuthorName(activeIdentify, authorizedAuthors));
172
+ setReplyAuthorName(resolveDefaultAuthorName(activeIdentify, authorizedAuthors));
173
+ setEditingReportId(null);
174
+ setEditableDraft(null);
175
+ if (mode !== "idle") {
176
+ setShowTargetPreview(false);
177
+ }
178
+ hoveredElementRef.current = null;
179
+ selectedElementRef.current = null;
180
+ if (hoverLeaveTimeoutRef.current) {
181
+ window.clearTimeout(hoverLeaveTimeoutRef.current);
182
+ hoverLeaveTimeoutRef.current = null;
183
+ }
184
+ if (overlayHoverLeaveTimeoutRef.current) {
185
+ window.clearTimeout(overlayHoverLeaveTimeoutRef.current);
186
+ overlayHoverLeaveTimeoutRef.current = null;
187
+ }
188
+ }, [currentPathname, mode]);
189
+ useEffect(() => {
190
+ setShowTargetPreview(false);
191
+ }, [currentPathname]);
192
+ useEffect(() => {
193
+ return () => {
194
+ if (hoverLeaveTimeoutRef.current) {
195
+ window.clearTimeout(hoverLeaveTimeoutRef.current);
196
+ }
197
+ if (overlayHoverLeaveTimeoutRef.current) {
198
+ window.clearTimeout(overlayHoverLeaveTimeoutRef.current);
199
+ }
200
+ };
201
+ }, []);
202
+ useEffect(() => {
203
+ const syncSelectableTargets = () => {
204
+ setSelectableTargets(getSelectableTargets());
205
+ };
206
+ syncSelectableTargets();
207
+ window.addEventListener("scroll", syncSelectableTargets, { passive: true });
208
+ window.addEventListener("resize", syncSelectableTargets);
209
+ return () => {
210
+ window.removeEventListener("scroll", syncSelectableTargets);
211
+ window.removeEventListener("resize", syncSelectableTargets);
212
+ };
213
+ }, [currentPathname]);
214
+ useEffect(() => {
215
+ if (!showTargetPreview) {
216
+ return;
217
+ }
218
+ const syncPreviewRects = () => {
219
+ setSelectableTargets(getSelectableTargets());
220
+ };
221
+ window.addEventListener("scroll", syncPreviewRects, { passive: true });
222
+ window.addEventListener("resize", syncPreviewRects);
223
+ return () => {
224
+ window.removeEventListener("scroll", syncPreviewRects);
225
+ window.removeEventListener("resize", syncPreviewRects);
226
+ };
227
+ }, [showTargetPreview]);
228
+ useEffect(() => {
229
+ if (mode !== "view") {
230
+ setMarkers([]);
231
+ return;
232
+ }
233
+ const syncMarkers = () => {
234
+ setMarkers(currentPageFilteredReports.map((report) => getMarkerFromReport(report, window.scrollY)));
235
+ };
236
+ syncMarkers();
237
+ window.addEventListener("scroll", syncMarkers, { passive: true });
238
+ window.addEventListener("resize", syncMarkers);
239
+ return () => {
240
+ window.removeEventListener("scroll", syncMarkers);
241
+ window.removeEventListener("resize", syncMarkers);
242
+ };
243
+ }, [currentPageFilteredReports, mode]);
244
+ useEffect(() => {
245
+ if (mode !== "report") {
246
+ return;
247
+ }
248
+ const syncTargetRects = () => {
249
+ setHoveredTarget(toSnapshot(hoveredElementRef.current));
250
+ setSelectedTarget(toSnapshot(selectedElementRef.current));
251
+ };
252
+ window.addEventListener("scroll", syncTargetRects, { passive: true });
253
+ window.addEventListener("resize", syncTargetRects);
254
+ return () => {
255
+ window.removeEventListener("scroll", syncTargetRects);
256
+ window.removeEventListener("resize", syncTargetRects);
257
+ };
258
+ }, [mode]);
259
+ useEffect(() => {
260
+ if (hoveredMarkerId && !markers.some((marker) => marker.report.id === hoveredMarkerId)) {
261
+ setHoveredMarkerId(null);
262
+ }
263
+ }, [hoveredMarkerId, markers]);
264
+ // markers (points, tooltip, reply)
265
+ const clearHoverLeaveTimeout = () => {
266
+ if (hoverLeaveTimeoutRef.current) {
267
+ window.clearTimeout(hoverLeaveTimeoutRef.current);
268
+ hoverLeaveTimeoutRef.current = null;
269
+ }
270
+ };
271
+ const scheduleHoverLeave = (markerId) => {
272
+ clearHoverLeaveTimeout();
273
+ hoverLeaveTimeoutRef.current = window.setTimeout(() => {
274
+ setHoveredMarkerId((current) => (current === markerId ? null : current));
275
+ hoverLeaveTimeoutRef.current = null;
276
+ }, MARKER_HOVER_LEAVE_MS);
277
+ };
278
+ const clearOverlayHoverLeaveTimeout = () => {
279
+ if (overlayHoverLeaveTimeoutRef.current) {
280
+ window.clearTimeout(overlayHoverLeaveTimeoutRef.current);
281
+ overlayHoverLeaveTimeoutRef.current = null;
282
+ }
283
+ };
284
+ const scheduleOverlayHoverLeave = () => {
285
+ if (overlayHoverLeaveTimeoutRef.current) {
286
+ return;
287
+ }
288
+ overlayHoverLeaveTimeoutRef.current = window.setTimeout(() => {
289
+ if (!hoveredElementRef.current) {
290
+ setHoveredTarget(null);
291
+ }
292
+ overlayHoverLeaveTimeoutRef.current = null;
293
+ }, OVERLAY_HOVER_LEAVE_MS);
294
+ };
295
+ const stopEditing = () => {
296
+ setEditingReportId(null);
297
+ setEditableDraft(null);
298
+ };
299
+ const selectReport = (reportId) => {
300
+ setSelectedReportId(reportId);
301
+ if (editingReportId && editingReportId !== reportId) {
302
+ stopEditing();
303
+ }
304
+ };
305
+ const closeReplyComposer = () => {
306
+ setActiveReplyReportId(null);
307
+ setReplyDraft("");
308
+ setPendingComposer(null);
309
+ setShowConfirmAuthorSelect(false);
310
+ };
311
+ const showFeedbackTooltip = useCallback((report) => {
312
+ scrollToFeedbackTarget(report);
313
+ clearHoverLeaveTimeout();
314
+ closeReplyComposer();
315
+ setHoveredMarkerId(report.id);
316
+ }, [clearHoverLeaveTimeout]);
317
+ const locateFeedback = async (reportId) => {
318
+ const report = filteredReports.find((item) => item.id === reportId);
319
+ if (!report) {
320
+ return;
321
+ }
322
+ selectReport(reportId);
323
+ if (report.pathname !== currentPathname) {
324
+ pendingLocateReportIdRef.current = reportId;
325
+ try {
326
+ if (onNavigate) {
327
+ await onNavigate(report.pathname);
328
+ }
329
+ else if (typeof window !== "undefined") {
330
+ window.location.assign(report.pathname);
331
+ }
332
+ }
333
+ catch (nextError) {
334
+ pendingLocateReportIdRef.current = null;
335
+ setErrorMessage(nextError instanceof Error ? nextError.message : messages.errors.loadFeedbackFailed);
336
+ }
337
+ return;
338
+ }
339
+ showFeedbackTooltip(report);
340
+ };
341
+ useEffect(() => {
342
+ const pendingReportId = pendingLocateReportIdRef.current;
343
+ if (!pendingReportId) {
344
+ return;
345
+ }
346
+ const report = reports.find((item) => item.id === pendingReportId && item.pathname === currentPathname);
347
+ if (!report) {
348
+ return;
349
+ }
350
+ pendingLocateReportIdRef.current = null;
351
+ window.setTimeout(() => showFeedbackTooltip(report), 0);
352
+ }, [currentPathname, reports, showFeedbackTooltip]);
353
+ const focusSearchInput = () => {
354
+ searchInputRef.current?.focus();
355
+ searchInputRef.current?.select();
356
+ };
357
+ const selectAdjacentReport = (direction) => {
358
+ if (filteredReports.length === 0) {
359
+ return;
360
+ }
361
+ const currentIndex = filteredReports.findIndex((report) => report.id === selectedReportId);
362
+ let nextIndex;
363
+ if (currentIndex === -1) {
364
+ nextIndex = direction === "down" ? 0 : filteredReports.length - 1;
365
+ }
366
+ else {
367
+ nextIndex = direction === "down" ? Math.min(currentIndex + 1, filteredReports.length - 1) : Math.max(currentIndex - 1, 0);
368
+ }
369
+ void locateFeedback(filteredReports[nextIndex].id);
370
+ };
371
+ const openReplyComposer = (report) => {
372
+ selectReport(report.id);
373
+ setActiveReplyReportId(report.id);
374
+ setReplyDraft("");
375
+ setPendingComposer(null);
376
+ setReplyAuthorName(resolveDefaultAuthorName(activeIdentify, authorizedAuthors));
377
+ setConfirmAuthorName(resolveOriginalFeedbackAuthorName(report));
378
+ setShowConfirmAuthorSelect(false);
379
+ clearHoverLeaveTimeout();
380
+ };
381
+ const toggleConfirmAuthorSelect = () => {
382
+ setShowConfirmAuthorSelect((current) => !current);
383
+ };
384
+ const startDenyReview = () => {
385
+ if (!activeReplyReport) {
386
+ return;
387
+ }
388
+ const latest = activeReplyReport.replies[activeReplyReport.replies.length - 1];
389
+ if (!latest) {
390
+ return;
391
+ }
392
+ setPendingComposer({
393
+ type: latest.status === "found_error" ? "recheck" : "deny",
394
+ targetReplyId: latest.id,
395
+ });
396
+ setReplyDraft("");
397
+ };
398
+ const startCheckoutReview = (replyId) => {
399
+ setPendingComposer({ type: "checkout", targetReplyId: replyId });
400
+ setReplyDraft("");
401
+ };
402
+ const cancelPendingComposer = () => {
403
+ setPendingComposer(null);
404
+ setReplyDraft("");
405
+ };
406
+ const toggleReportMode = () => {
407
+ if (personalKeyRequired) {
408
+ setErrorMessage(messages.errors.personalKeyRequired);
409
+ return;
410
+ }
411
+ setShowTargetPreview(false);
412
+ setMode((current) => (current === "report" ? "idle" : "report"));
413
+ };
414
+ const togglePanelTab = (nextTab) => {
415
+ setPanelTab((current) => {
416
+ if (current === nextTab) {
417
+ return null;
418
+ }
419
+ return nextTab;
420
+ });
421
+ };
422
+ const enableIssueMode = () => {
423
+ setShowTargetPreview(false);
424
+ closeReplyComposer();
425
+ stopEditing();
426
+ setMode("view");
427
+ };
428
+ const openPanelTab = (nextTab) => {
429
+ const isClosing = panelTab === nextTab;
430
+ setPanelTab(isClosing ? null : nextTab);
431
+ if (!isClosing && nextTab === "feedback-list") {
432
+ enableIssueMode();
433
+ }
434
+ };
435
+ const toggleIssueMode = () => {
436
+ setShowTargetPreview(false);
437
+ closeReplyComposer();
438
+ setMode((current) => (current === "view" ? "idle" : "view"));
439
+ stopEditing();
440
+ setSelectedReportId(filteredReports[0]?.id ?? null);
441
+ };
442
+ const toggleTargetPreview = () => {
443
+ setShowTargetPreview((current) => {
444
+ const next = !current;
445
+ if (next) {
446
+ setMode("idle");
447
+ }
448
+ return next;
449
+ });
450
+ };
451
+ // overlay (target pick, create draft, edit)
452
+ const handleOverlayMove = (event) => {
453
+ if (mode !== "report" || draft) {
454
+ return;
455
+ }
456
+ const targetElement = findTargetByPoint(overlayRef.current, event.clientX, event.clientY);
457
+ hoveredElementRef.current = targetElement;
458
+ if (!targetElement) {
459
+ scheduleOverlayHoverLeave();
460
+ return;
461
+ }
462
+ clearOverlayHoverLeaveTimeout();
463
+ const snapshot = toSnapshot(targetElement);
464
+ setHoveredTarget((previous) => (isSameHoverTarget(previous, snapshot) ? previous : snapshot));
465
+ };
466
+ const handleOverlayClick = (event) => {
467
+ if (mode !== "report") {
468
+ return;
469
+ }
470
+ const targetElement = findTargetByPoint(overlayRef.current, event.clientX, event.clientY);
471
+ const snapshot = toSnapshot(targetElement);
472
+ if (!targetElement || !snapshot) {
473
+ setErrorMessage(messages.errors.clickSelectableArea);
474
+ return;
475
+ }
476
+ hoveredElementRef.current = targetElement;
477
+ selectedElementRef.current = targetElement;
478
+ setHoveredTarget(snapshot);
479
+ setSelectedTarget(snapshot);
480
+ setErrorMessage("");
481
+ setDraft({
482
+ clientX: event.clientX,
483
+ clientY: event.clientY,
484
+ xRatio: clampRatio(event.clientX / window.innerWidth),
485
+ yRatio: clampRatio(event.clientY / window.innerHeight),
486
+ elementXRatio: clampRatio((event.clientX - snapshot.rect.left) / Math.max(snapshot.rect.width, 1)),
487
+ elementYRatio: clampRatio((event.clientY - snapshot.rect.top) / Math.max(snapshot.rect.height, 1)),
488
+ scrollY: window.scrollY,
489
+ documentY: Math.round(window.scrollY + event.clientY),
490
+ reportId: snapshot.id,
491
+ reportType: snapshot.type,
492
+ message: "",
493
+ fieldValues: createInitialFieldValues(fields),
494
+ });
495
+ };
496
+ const cancelDraft = () => {
497
+ setDraft(null);
498
+ setSelectedTarget(null);
499
+ };
500
+ const updateDraftMessage = (nextMessage) => {
501
+ setDraft((current) => (current ? { ...current, message: nextMessage } : current));
502
+ };
503
+ const updateDraftField = (key, nextValue) => {
504
+ setDraft((current) => current
505
+ ? {
506
+ ...current,
507
+ fieldValues: {
508
+ ...current.fieldValues,
509
+ [key]: nextValue,
510
+ },
511
+ }
512
+ : current);
513
+ };
514
+ const buildCreatePayloadFromDraft = () => {
515
+ if (!draft) {
516
+ return null;
517
+ }
518
+ if (personalKeyRequired) {
519
+ setErrorMessage(messages.errors.personalKeyRequired);
520
+ return null;
521
+ }
522
+ const nextError = getFieldError(draft.message, draft.fieldValues, fields, messages.errors);
523
+ if (nextError) {
524
+ setErrorMessage(nextError);
525
+ return null;
526
+ }
527
+ return {
528
+ pathname: currentPathname,
529
+ report_id: draft.reportId,
530
+ report_type: draft.reportType,
531
+ message: draft.message.trim(),
532
+ status: "open",
533
+ field_values: draft.fieldValues,
534
+ x_ratio: draft.xRatio,
535
+ y_ratio: draft.yRatio,
536
+ element_x_ratio: draft.elementXRatio,
537
+ element_y_ratio: draft.elementYRatio,
538
+ scroll_y: draft.scrollY,
539
+ document_y: draft.documentY,
540
+ viewport_width: window.innerWidth,
541
+ viewport_height: window.innerHeight,
542
+ design_width: window.innerWidth,
543
+ design_height: window.innerHeight,
544
+ ...(environment ? { environment } : {}),
545
+ ...(appVersion ? { app_version: appVersion } : {}),
546
+ ...(activeIdentify || draftAuthorName.trim()
547
+ ? {
548
+ ...(activeIdentify ? { author_id: activeIdentify.id } : {}),
549
+ author_name: draftAuthorName.trim() || activeIdentify?.name,
550
+ }
551
+ : {}),
552
+ };
553
+ };
554
+ const finalizeDraftCreate = () => {
555
+ setDraft(null);
556
+ setSelectedTarget(null);
557
+ setHoveredTarget(null);
558
+ setErrorMessage("");
559
+ setMode("view");
560
+ };
561
+ const handleCreateSubmit = async () => {
562
+ const payload = buildCreatePayloadFromDraft();
563
+ if (!payload) {
564
+ return;
565
+ }
566
+ try {
567
+ const savedFeedback = await createFeedback(await signCreatePayload(payload));
568
+ await notifyFeedbackCreate(eventCallbacks, savedFeedback);
569
+ finalizeDraftCreate();
570
+ }
571
+ catch (nextError) {
572
+ setErrorMessage(nextError instanceof Error ? nextError.message : messages.errors.saveFeedbackFailed);
573
+ }
574
+ };
575
+ const handleCreateSubmitWithGitHubIssue = async () => {
576
+ if (!github?.onCreate || !canCreateGitHubIssueOnCreateValue || creatingGitHubIssueId || isCreating) {
577
+ return;
578
+ }
579
+ const payload = buildCreatePayloadFromDraft();
580
+ if (!payload) {
581
+ return;
582
+ }
583
+ setCreatingGitHubIssueId("draft");
584
+ setErrorMessage("");
585
+ try {
586
+ const savedFeedback = await createFeedback(await signCreatePayload(payload));
587
+ await notifyFeedbackCreate(eventCallbacks, savedFeedback);
588
+ const result = await github.onCreate(savedFeedback);
589
+ const updatedFeedback = await updateFeedback(savedFeedback.id, await signUpdatePayload(buildGitHubIssueUpdate(savedFeedback, result, messages.resolution.gitIssuedMessage)));
590
+ await notifyGitHubIssueCreated(eventCallbacks, {
591
+ feedback: updatedFeedback,
592
+ issueUrl: result.issueUrl,
593
+ });
594
+ finalizeDraftCreate();
595
+ }
596
+ catch (nextError) {
597
+ setErrorMessage(nextError instanceof Error ? nextError.message : messages.errors.createGitHubIssueFailed);
598
+ }
599
+ finally {
600
+ setCreatingGitHubIssueId(null);
601
+ }
602
+ };
603
+ const startEditing = (report) => {
604
+ if (report.status === "archived") {
605
+ setErrorMessage(messages.errors.archivedReadOnly);
606
+ setSelectedReportId(report.id);
607
+ return;
608
+ }
609
+ setEditingReportId(report.id);
610
+ setEditableDraft({
611
+ message: report.message,
612
+ status: report.status,
613
+ fieldValues: createInitialFieldValues(fields, report.field_values),
614
+ });
615
+ setSelectedReportId(report.id);
616
+ };
617
+ const handleUpdateSubmit = async () => {
618
+ if (!selectedReport || !editableDraft) {
619
+ return;
620
+ }
621
+ if (selectedReport.status === "archived") {
622
+ setErrorMessage(messages.errors.archivedNotEditable);
623
+ return;
624
+ }
625
+ const nextError = getFieldError(editableDraft.message, editableDraft.fieldValues, fields, messages.errors);
626
+ if (nextError) {
627
+ setErrorMessage(nextError);
628
+ return;
629
+ }
630
+ try {
631
+ const updatedFeedback = await updateFeedback(selectedReport.id, await signUpdatePayload({
632
+ message: editableDraft.message.trim(),
633
+ status: editableDraft.status,
634
+ field_values: editableDraft.fieldValues,
635
+ }));
636
+ await notifyFeedbackUpdate(eventCallbacks, updatedFeedback);
637
+ stopEditing();
638
+ setErrorMessage("");
639
+ }
640
+ catch (nextError) {
641
+ setErrorMessage(nextError instanceof Error ? nextError.message : messages.errors.updateFeedbackFailed);
642
+ }
643
+ };
644
+ const appendReply = async (report, reply) => {
645
+ const payload = await signUpdatePayload({
646
+ replies: [...report.replies, reply],
647
+ });
648
+ await updateFeedback(report.id, payload);
649
+ await notifyFeedbackReply(eventCallbacks, {
650
+ feedbackId: report.id,
651
+ message: reply.message,
652
+ });
653
+ };
654
+ const handleReplySubmit = async () => {
655
+ if (!activeReplyReport) {
656
+ return;
657
+ }
658
+ if (personalKeyRequired) {
659
+ setErrorMessage(messages.errors.personalKeyRequired);
660
+ return;
661
+ }
662
+ if (!replyDraft.trim()) {
663
+ setErrorMessage(messages.errors.replyContentRequired);
664
+ return;
665
+ }
666
+ if (!replyAuthorName.trim()) {
667
+ setErrorMessage(messages.errors.authorRequired);
668
+ return;
669
+ }
670
+ const replyMessage = replyDraft.trim();
671
+ const pendingType = pendingComposer?.type ?? null;
672
+ const reply = {
673
+ id: createReplyId(),
674
+ message: replyMessage,
675
+ created_at: new Date().toISOString(),
676
+ status: createReplyStatusForSubmit(pendingType),
677
+ author_type: "manager",
678
+ author_name: replyAuthorName.trim(),
679
+ };
680
+ try {
681
+ await appendReply(activeReplyReport, reply);
682
+ setErrorMessage("");
683
+ setReplyDraft("");
684
+ setPendingComposer(null);
685
+ }
686
+ catch (nextError) {
687
+ setErrorMessage(nextError instanceof Error ? nextError.message : messages.errors.saveReplyFailed);
688
+ }
689
+ };
690
+ const handleConfirmResolution = async () => {
691
+ if (!activeReplyReport) {
692
+ return;
693
+ }
694
+ const resolverName = confirmAuthorName.trim() || resolveOriginalFeedbackAuthorName(activeReplyReport);
695
+ if (!resolverName) {
696
+ setErrorMessage(messages.errors.reviewerRequired);
697
+ return;
698
+ }
699
+ const reply = {
700
+ id: createReplyId(),
701
+ message: messages.resolution.issueResolvedMessage,
702
+ created_at: new Date().toISOString(),
703
+ status: "resolved",
704
+ author_type: "user",
705
+ author_name: resolverName,
706
+ };
707
+ try {
708
+ const updatedFeedback = await updateFeedback(activeReplyReport.id, await signUpdatePayload({
709
+ status: "resolved",
710
+ replies: [...activeReplyReport.replies, reply],
711
+ }));
712
+ await notifyFeedbackUpdate(eventCallbacks, updatedFeedback);
713
+ setErrorMessage("");
714
+ setPendingComposer(null);
715
+ setReplyDraft("");
716
+ setShowConfirmAuthorSelect(false);
717
+ }
718
+ catch (nextError) {
719
+ setErrorMessage(nextError instanceof Error ? nextError.message : messages.errors.confirmResolutionFailed);
720
+ }
721
+ };
722
+ const handleCreateGitHubIssue = async (report) => {
723
+ if (!github?.onCreate || !canCreateGitHubIssueFromListValue || creatingGitHubIssueId) {
724
+ return;
725
+ }
726
+ if (isGitIssued(report)) {
727
+ return;
728
+ }
729
+ setCreatingGitHubIssueId(report.id);
730
+ setErrorMessage("");
731
+ try {
732
+ const result = await github.onCreate(report);
733
+ const updatedFeedback = await updateFeedback(report.id, await signUpdatePayload(buildGitHubIssueUpdate(report, result, messages.resolution.gitIssuedMessage)));
734
+ await notifyGitHubIssueCreated(eventCallbacks, {
735
+ feedback: updatedFeedback,
736
+ issueUrl: result.issueUrl,
737
+ });
738
+ setErrorMessage("");
739
+ }
740
+ catch (nextError) {
741
+ setErrorMessage(nextError instanceof Error ? nextError.message : messages.errors.createGitHubIssueFailed);
742
+ }
743
+ finally {
744
+ setCreatingGitHubIssueId(null);
745
+ }
746
+ };
747
+ const handleDelete = async (id) => {
748
+ if (personalKeyRequired) {
749
+ setErrorMessage(messages.errors.personalKeyRequired);
750
+ return;
751
+ }
752
+ try {
753
+ await deleteFeedback(id);
754
+ await notifyFeedbackDelete(eventCallbacks, id);
755
+ if (selectedReportId === id) {
756
+ setSelectedReportId(null);
757
+ }
758
+ if (editingReportId === id) {
759
+ stopEditing();
760
+ }
761
+ if (activeReplyReportId === id) {
762
+ closeReplyComposer();
763
+ }
764
+ setErrorMessage("");
765
+ }
766
+ catch (nextError) {
767
+ setErrorMessage(nextError instanceof Error ? nextError.message : messages.errors.deleteFeedbackFailed);
768
+ }
769
+ };
770
+ useReportShortcuts({
771
+ mode,
772
+ draft,
773
+ editingReportId,
774
+ panelTab,
775
+ showTargetPreview,
776
+ activeReplyReportId,
777
+ pendingComposer,
778
+ toggleReportMode,
779
+ toggleTargetPreview,
780
+ toggleIssueMode,
781
+ cancelDraft,
782
+ cancelPendingComposer,
783
+ closeReplyComposer,
784
+ handleCreateSubmit,
785
+ stopEditing,
786
+ handleUpdateSubmit,
787
+ focusSearchInput,
788
+ selectAdjacentReport,
789
+ });
790
+ return {
791
+ appearance: activeAppearance,
792
+ setAppearance,
793
+ locale,
794
+ setLocale,
795
+ messages,
796
+ fields,
797
+ authors: authorizedAuthors,
798
+ projectId,
799
+ environment,
800
+ appVersion,
801
+ currentPathname,
802
+ showFeedbackList,
803
+ panelTab,
804
+ routeDetailsStats,
805
+ canTransferFeedback,
806
+ personalKey,
807
+ publicKey,
808
+ personalKeyRequired,
809
+ personalKeyPendingRegistration,
810
+ personalKeyCandidates,
811
+ issuePersonalKey,
812
+ rotatePersonalKey,
813
+ insertPersonalKey,
814
+ canListAllFeedback,
815
+ visibleShortcutKeys,
816
+ searchInputRef,
817
+ resolvedAppearance,
818
+ isMobileViewport,
819
+ mode,
820
+ showTargetPreview,
821
+ selectableTargets,
822
+ filters,
823
+ setFilters,
824
+ listScope,
825
+ setListScope,
826
+ reports,
827
+ filteredReports,
828
+ isError,
829
+ isFetching,
830
+ hasNextPage,
831
+ isFetchingNextPage,
832
+ fetchNextPage,
833
+ isCreating,
834
+ isUpdating,
835
+ isDeleting,
836
+ queryErrorMessage,
837
+ refetch,
838
+ errorMessage,
839
+ setErrorMessage,
840
+ draft,
841
+ hoveredTarget,
842
+ selectedTarget,
843
+ markers,
844
+ selectedReport,
845
+ editingReportId,
846
+ editableDraft,
847
+ setEditableDraft,
848
+ overlayRef,
849
+ activeReplyReportId,
850
+ activeReplyReport,
851
+ tooltipReport,
852
+ tooltipAnchor,
853
+ tooltipFieldTags,
854
+ replyDraft,
855
+ setReplyDraft,
856
+ draftAuthorName,
857
+ setDraftAuthorName,
858
+ replyAuthorName,
859
+ setReplyAuthorName,
860
+ pendingComposer,
861
+ startDenyReview,
862
+ startCheckoutReview,
863
+ cancelPendingComposer,
864
+ confirmAuthorName,
865
+ setConfirmAuthorName,
866
+ showConfirmAuthorSelect,
867
+ toggleConfirmAuthorSelect,
868
+ handleConfirmResolution,
869
+ targetStats,
870
+ statusText,
871
+ toggleReportMode,
872
+ toggleTargetPreview,
873
+ toggleIssueMode,
874
+ openPanelTab,
875
+ togglePanelTab,
876
+ selectReport,
877
+ locateFeedback,
878
+ focusSearchInput,
879
+ selectAdjacentReport,
880
+ openReplyComposer,
881
+ closeReplyComposer,
882
+ clearHoverLeaveTimeout,
883
+ scheduleHoverLeave,
884
+ setHoveredMarkerId,
885
+ handleOverlayMove,
886
+ handleOverlayClick,
887
+ cancelDraft,
888
+ updateDraftMessage,
889
+ updateDraftField,
890
+ handleCreateSubmit,
891
+ startEditing,
892
+ stopEditing,
893
+ handleUpdateSubmit,
894
+ handleReplySubmit,
895
+ handleDelete,
896
+ canCreateGitHubIssueFromList: canCreateGitHubIssueFromListValue,
897
+ canCreateGitHubIssueOnCreate: canCreateGitHubIssueOnCreateValue,
898
+ creatingGitHubIssueId,
899
+ handleCreateGitHubIssue,
900
+ handleCreateSubmitWithGitHubIssue,
901
+ isDraftGitHubIssueSubmitting: creatingGitHubIssueId === "draft",
902
+ };
903
+ }
904
+ //# sourceMappingURL=useReportState.js.map