@fivepixels-js/react 0.2.0 → 0.2.2

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 (839) hide show
  1. package/README.md +46 -11
  2. package/dist/components/ShortcutHint.d.ts +2 -2
  3. package/dist/components/ShortcutHint.d.ts.map +1 -1
  4. package/dist/components/ShortcutHint.js +1 -1
  5. package/dist/components/ShortcutHint.js.map +1 -1
  6. package/dist/components/icons/Icons.d.ts +43 -39
  7. package/dist/components/icons/Icons.d.ts.map +1 -1
  8. package/dist/components/icons/Icons.js +3 -0
  9. package/dist/components/icons/Icons.js.map +1 -1
  10. package/dist/components/icons/MaterialIcon.d.ts +1 -1
  11. package/dist/components/icons/MaterialIcon.d.ts.map +1 -1
  12. package/dist/components/icons/ProbeLayoutIcons.d.ts +14 -14
  13. package/dist/components/icons/ProbeLayoutIcons.d.ts.map +1 -1
  14. package/dist/components/overlay/DotWaveOverlay.d.ts +21 -0
  15. package/dist/components/overlay/DotWaveOverlay.d.ts.map +1 -0
  16. package/dist/components/overlay/DotWaveOverlay.js +226 -0
  17. package/dist/components/overlay/DotWaveOverlay.js.map +1 -0
  18. package/dist/components/overlay/FloatingPinRail.d.ts +2 -0
  19. package/dist/components/overlay/FloatingPinRail.d.ts.map +1 -0
  20. package/dist/components/overlay/FloatingPinRail.js +112 -0
  21. package/dist/components/overlay/FloatingPinRail.js.map +1 -0
  22. package/dist/components/overlay/PickTargetCompareChip.d.ts +1 -1
  23. package/dist/components/overlay/PickTargetCompareChip.d.ts.map +1 -1
  24. package/dist/components/overlay/PickTargetCompareChip.js +4 -3
  25. package/dist/components/overlay/PickTargetCompareChip.js.map +1 -1
  26. package/dist/components/overlay/PickTargetCompareSegment.d.ts +1 -1
  27. package/dist/components/overlay/PickTargetCompareSegment.d.ts.map +1 -1
  28. package/dist/components/overlay/PickTargetContextMenu.d.ts +1 -1
  29. package/dist/components/overlay/PickTargetContextMenu.d.ts.map +1 -1
  30. package/dist/components/overlay/PickTargetContextMenu.js +3 -2
  31. package/dist/components/overlay/PickTargetContextMenu.js.map +1 -1
  32. package/dist/components/overlay/PickTargetHoverTooltip.d.ts +1 -1
  33. package/dist/components/overlay/PickTargetHoverTooltip.d.ts.map +1 -1
  34. package/dist/components/overlay/PickTargetHoverTooltip.js +7 -5
  35. package/dist/components/overlay/PickTargetHoverTooltip.js.map +1 -1
  36. package/dist/components/overlay/PickTargetProbePanel.d.ts +1 -1
  37. package/dist/components/overlay/PickTargetProbePanel.d.ts.map +1 -1
  38. package/dist/components/overlay/PickTargetProbePanel.js +8 -7
  39. package/dist/components/overlay/PickTargetProbePanel.js.map +1 -1
  40. package/dist/components/overlay/PickTargetSavedBadges.d.ts +1 -1
  41. package/dist/components/overlay/PickTargetSavedBadges.d.ts.map +1 -1
  42. package/dist/components/overlay/PickTargetSavedBadges.js +5 -4
  43. package/dist/components/overlay/PickTargetSavedBadges.js.map +1 -1
  44. package/dist/components/overlay/ProbeLayoutControls.d.ts +1 -1
  45. package/dist/components/overlay/ProbeLayoutControls.d.ts.map +1 -1
  46. package/dist/components/overlay/ProbeLayoutControls.js +1 -1
  47. package/dist/components/overlay/ProbeLayoutControls.js.map +1 -1
  48. package/dist/components/overlay/ReportOverlayLayer.d.ts +1 -1
  49. package/dist/components/overlay/ReportOverlayLayer.d.ts.map +1 -1
  50. package/dist/components/overlay/ReportOverlayLayer.js +4 -3
  51. package/dist/components/overlay/ReportOverlayLayer.js.map +1 -1
  52. package/dist/components/overlay/TargetHighlights.d.ts +2 -1
  53. package/dist/components/overlay/TargetHighlights.d.ts.map +1 -1
  54. package/dist/components/overlay/TargetHighlights.js +2 -2
  55. package/dist/components/overlay/TargetHighlights.js.map +1 -1
  56. package/dist/components/panel/AppearanceThemePicker.d.ts +1 -1
  57. package/dist/components/panel/AppearanceThemePicker.d.ts.map +1 -1
  58. package/dist/components/panel/DiscreteScaleDial.d.ts +1 -1
  59. package/dist/components/panel/DiscreteScaleDial.d.ts.map +1 -1
  60. package/dist/components/panel/DraftProbeSummaryBanner.d.ts +1 -1
  61. package/dist/components/panel/DraftProbeSummaryBanner.d.ts.map +1 -1
  62. package/dist/components/panel/DraftProbeSummaryBanner.js +3 -2
  63. package/dist/components/panel/DraftProbeSummaryBanner.js.map +1 -1
  64. package/dist/components/panel/FeedbackActivityHeatmap.d.ts +1 -1
  65. package/dist/components/panel/FeedbackActivityHeatmap.d.ts.map +1 -1
  66. package/dist/components/panel/FeedbackActivityHeatmap.js +2 -2
  67. package/dist/components/panel/FeedbackActivityHeatmap.js.map +1 -1
  68. package/dist/components/panel/HexColorField.d.ts +1 -1
  69. package/dist/components/panel/HexColorField.d.ts.map +1 -1
  70. package/dist/components/panel/HexColorField.js +1 -1
  71. package/dist/components/panel/HexColorField.js.map +1 -1
  72. package/dist/components/panel/MarkerShapePicker.d.ts +1 -1
  73. package/dist/components/panel/MarkerShapePicker.d.ts.map +1 -1
  74. package/dist/components/panel/MarkerSizePreview.d.ts +13 -0
  75. package/dist/components/panel/MarkerSizePreview.d.ts.map +1 -0
  76. package/dist/components/panel/MarkerSizePreview.js +24 -0
  77. package/dist/components/panel/MarkerSizePreview.js.map +1 -0
  78. package/dist/components/panel/PanelDockGuides.d.ts +1 -1
  79. package/dist/components/panel/PanelDockGuides.d.ts.map +1 -1
  80. package/dist/components/panel/PanelDropdownMenu.d.ts +2 -2
  81. package/dist/components/panel/PanelDropdownMenu.d.ts.map +1 -1
  82. package/dist/components/panel/PanelDropdownMenu.js +2 -1
  83. package/dist/components/panel/PanelDropdownMenu.js.map +1 -1
  84. package/dist/components/panel/PanelGateShell.d.ts +20 -0
  85. package/dist/components/panel/PanelGateShell.d.ts.map +1 -0
  86. package/dist/components/panel/PanelGateShell.js +15 -0
  87. package/dist/components/panel/PanelGateShell.js.map +1 -0
  88. package/dist/components/panel/PanelKeyGate.d.ts +2 -2
  89. package/dist/components/panel/PanelKeyGate.d.ts.map +1 -1
  90. package/dist/components/panel/PanelKeyGate.js +5 -3
  91. package/dist/components/panel/PanelKeyGate.js.map +1 -1
  92. package/dist/components/panel/PanelMarkerDisplayControls.d.ts +17 -0
  93. package/dist/components/panel/PanelMarkerDisplayControls.d.ts.map +1 -0
  94. package/dist/components/panel/PanelMarkerDisplayControls.js +8 -0
  95. package/dist/components/panel/PanelMarkerDisplayControls.js.map +1 -0
  96. package/dist/components/panel/PanelOnboarding.d.ts +1 -1
  97. package/dist/components/panel/PanelOnboarding.d.ts.map +1 -1
  98. package/dist/components/panel/PanelOnboarding.js +33 -7
  99. package/dist/components/panel/PanelOnboarding.js.map +1 -1
  100. package/dist/components/panel/PanelOptionSwitch.d.ts +1 -1
  101. package/dist/components/panel/PanelOptionSwitch.d.ts.map +1 -1
  102. package/dist/components/panel/PanelPresentationSwitch.d.ts +1 -1
  103. package/dist/components/panel/PanelPresentationSwitch.d.ts.map +1 -1
  104. package/dist/components/panel/PanelPresentationSwitch.js +4 -3
  105. package/dist/components/panel/PanelPresentationSwitch.js.map +1 -1
  106. package/dist/components/panel/PanelProjectFooter.d.ts +1 -1
  107. package/dist/components/panel/PanelProjectFooter.d.ts.map +1 -1
  108. package/dist/components/panel/PanelProjectFooter.js +7 -3
  109. package/dist/components/panel/PanelProjectFooter.js.map +1 -1
  110. package/dist/components/panel/PanelRoleSwitch.d.ts +1 -1
  111. package/dist/components/panel/PanelRoleSwitch.d.ts.map +1 -1
  112. package/dist/components/panel/PanelRoleSwitch.js +2 -2
  113. package/dist/components/panel/PanelRoleSwitch.js.map +1 -1
  114. package/dist/components/panel/PanelSettings.d.ts +1 -1
  115. package/dist/components/panel/PanelSettings.d.ts.map +1 -1
  116. package/dist/components/panel/PanelSettings.js +7 -6
  117. package/dist/components/panel/PanelSettings.js.map +1 -1
  118. package/dist/components/panel/PanelTabSelector.d.ts +1 -1
  119. package/dist/components/panel/PanelTabSelector.d.ts.map +1 -1
  120. package/dist/components/panel/PanelTabSelector.js +1 -1
  121. package/dist/components/panel/PanelTabSelector.js.map +1 -1
  122. package/dist/components/panel/ProbeEditModeBanner.d.ts +1 -1
  123. package/dist/components/panel/ProbeEditModeBanner.d.ts.map +1 -1
  124. package/dist/components/panel/ProbeEditModeBanner.js +3 -2
  125. package/dist/components/panel/ProbeEditModeBanner.js.map +1 -1
  126. package/dist/components/panel/ReportAuthDiagnostics.d.ts +1 -1
  127. package/dist/components/panel/ReportAuthDiagnostics.d.ts.map +1 -1
  128. package/dist/components/panel/ReportAuthDiagnostics.js +3 -2
  129. package/dist/components/panel/ReportAuthDiagnostics.js.map +1 -1
  130. package/dist/components/panel/ReportCommandPanel.d.ts +1 -1
  131. package/dist/components/panel/ReportCommandPanel.d.ts.map +1 -1
  132. package/dist/components/panel/ReportCommandPanel.js +2 -2
  133. package/dist/components/panel/ReportCommandPanel.js.map +1 -1
  134. package/dist/components/panel/ReportCommandReplaceConfirmDialog.d.ts +2 -2
  135. package/dist/components/panel/ReportCommandReplaceConfirmDialog.d.ts.map +1 -1
  136. package/dist/components/panel/ReportCommandReplaceConfirmDialog.js +5 -4
  137. package/dist/components/panel/ReportCommandReplaceConfirmDialog.js.map +1 -1
  138. package/dist/components/panel/ReportControlPanel.d.ts +1 -1
  139. package/dist/components/panel/ReportControlPanel.d.ts.map +1 -1
  140. package/dist/components/panel/ReportControlPanel.js +66 -15
  141. package/dist/components/panel/ReportControlPanel.js.map +1 -1
  142. package/dist/components/panel/ReportDraftForm.d.ts +1 -1
  143. package/dist/components/panel/ReportDraftForm.d.ts.map +1 -1
  144. package/dist/components/panel/ReportDraftForm.js +32 -11
  145. package/dist/components/panel/ReportDraftForm.js.map +1 -1
  146. package/dist/components/panel/ReportFeedbackList.d.ts +1 -1
  147. package/dist/components/panel/ReportFeedbackList.d.ts.map +1 -1
  148. package/dist/components/panel/ReportFeedbackList.js +1 -1
  149. package/dist/components/panel/ReportFeedbackList.js.map +1 -1
  150. package/dist/components/panel/ReportImportConfirmDialog.d.ts +1 -1
  151. package/dist/components/panel/ReportImportConfirmDialog.d.ts.map +1 -1
  152. package/dist/components/panel/ReportImportConfirmDialog.js +4 -3
  153. package/dist/components/panel/ReportImportConfirmDialog.js.map +1 -1
  154. package/dist/components/panel/ReportImportProjectMismatchDialog.d.ts +2 -2
  155. package/dist/components/panel/ReportImportProjectMismatchDialog.d.ts.map +1 -1
  156. package/dist/components/panel/ReportImportProjectMismatchDialog.js +5 -4
  157. package/dist/components/panel/ReportImportProjectMismatchDialog.js.map +1 -1
  158. package/dist/components/panel/ReportOverview.d.ts +1 -1
  159. package/dist/components/panel/ReportOverview.d.ts.map +1 -1
  160. package/dist/components/panel/ReportPersonalKeyDialog.d.ts +1 -1
  161. package/dist/components/panel/ReportPersonalKeyDialog.d.ts.map +1 -1
  162. package/dist/components/panel/ReportPersonalKeyDialog.js +4 -3
  163. package/dist/components/panel/ReportPersonalKeyDialog.js.map +1 -1
  164. package/dist/components/panel/ReportRouteDetails.d.ts +1 -1
  165. package/dist/components/panel/ReportRouteDetails.d.ts.map +1 -1
  166. package/dist/components/panel/ReportRouteDetails.js +9 -7
  167. package/dist/components/panel/ReportRouteDetails.js.map +1 -1
  168. package/dist/components/panel/RouteDetailsTimeline.d.ts +2 -2
  169. package/dist/components/panel/RouteDetailsTimeline.d.ts.map +1 -1
  170. package/dist/components/panel/RouteDetailsTimeline.js +2 -2
  171. package/dist/components/panel/RouteDetailsTimeline.js.map +1 -1
  172. package/dist/components/panel/ThemePreviewSkeleton.d.ts +1 -1
  173. package/dist/components/panel/ThemePreviewSkeleton.d.ts.map +1 -1
  174. package/dist/components/panel/experimental/ExperimentalFeedbackRow.d.ts +1 -1
  175. package/dist/components/panel/experimental/ExperimentalFeedbackRow.d.ts.map +1 -1
  176. package/dist/components/panel/experimental/ExperimentalFeedbackRow.js +4 -4
  177. package/dist/components/panel/experimental/ExperimentalFeedbackRow.js.map +1 -1
  178. package/dist/components/panel/experimental/ExperimentalFilteredListPanel.d.ts +8 -0
  179. package/dist/components/panel/experimental/ExperimentalFilteredListPanel.d.ts.map +1 -0
  180. package/dist/components/panel/experimental/ExperimentalFilteredListPanel.js +19 -0
  181. package/dist/components/panel/experimental/ExperimentalFilteredListPanel.js.map +1 -0
  182. package/dist/components/panel/experimental/ReportMyTasksPanel.d.ts +1 -1
  183. package/dist/components/panel/experimental/ReportMyTasksPanel.d.ts.map +1 -1
  184. package/dist/components/panel/experimental/ReportMyTasksPanel.js +39 -10
  185. package/dist/components/panel/experimental/ReportMyTasksPanel.js.map +1 -1
  186. package/dist/components/panel/experimental/ReportNeedsAttentionPanel.d.ts +1 -1
  187. package/dist/components/panel/experimental/ReportNeedsAttentionPanel.d.ts.map +1 -1
  188. package/dist/components/panel/experimental/ReportNeedsAttentionPanel.js +8 -13
  189. package/dist/components/panel/experimental/ReportNeedsAttentionPanel.js.map +1 -1
  190. package/dist/components/panel/experimental/ReportPageBriefPanel.d.ts +1 -1
  191. package/dist/components/panel/experimental/ReportPageBriefPanel.d.ts.map +1 -1
  192. package/dist/components/panel/experimental/ReportPageBriefPanel.js +7 -5
  193. package/dist/components/panel/experimental/ReportPageBriefPanel.js.map +1 -1
  194. package/dist/components/panel/experimental/ReportProjectHealthPanel.d.ts +1 -1
  195. package/dist/components/panel/experimental/ReportProjectHealthPanel.d.ts.map +1 -1
  196. package/dist/components/panel/experimental/ReportProjectHealthPanel.js +7 -6
  197. package/dist/components/panel/experimental/ReportProjectHealthPanel.js.map +1 -1
  198. package/dist/components/panel/experimental/ReportTodayDigestPanel.d.ts +1 -1
  199. package/dist/components/panel/experimental/ReportTodayDigestPanel.d.ts.map +1 -1
  200. package/dist/components/panel/experimental/ReportTodayDigestPanel.js +8 -13
  201. package/dist/components/panel/experimental/ReportTodayDigestPanel.js.map +1 -1
  202. package/dist/components/panel/feedback/AssigneeThreadEntry.d.ts +1 -1
  203. package/dist/components/panel/feedback/AssigneeThreadEntry.d.ts.map +1 -1
  204. package/dist/components/panel/feedback/AssigneeThreadEntry.js +5 -5
  205. package/dist/components/panel/feedback/AssigneeThreadEntry.js.map +1 -1
  206. package/dist/components/panel/feedback/AuthorSelector.d.ts +1 -1
  207. package/dist/components/panel/feedback/AuthorSelector.d.ts.map +1 -1
  208. package/dist/components/panel/feedback/AuthorSelector.js +2 -2
  209. package/dist/components/panel/feedback/AuthorSelector.js.map +1 -1
  210. package/dist/components/panel/feedback/CaseAssigneeInfo.d.ts +1 -1
  211. package/dist/components/panel/feedback/CaseAssigneeInfo.d.ts.map +1 -1
  212. package/dist/components/panel/feedback/CaseAssigneeInfo.js +3 -3
  213. package/dist/components/panel/feedback/CaseAssigneeInfo.js.map +1 -1
  214. package/dist/components/panel/feedback/ComposerFooterWarning.d.ts +1 -1
  215. package/dist/components/panel/feedback/ComposerFooterWarning.d.ts.map +1 -1
  216. package/dist/components/panel/feedback/FeedbackCaseEditor.d.ts +1 -1
  217. package/dist/components/panel/feedback/FeedbackCaseEditor.d.ts.map +1 -1
  218. package/dist/components/panel/feedback/FeedbackCaseEditor.js +2 -2
  219. package/dist/components/panel/feedback/FeedbackCaseEditor.js.map +1 -1
  220. package/dist/components/panel/feedback/FeedbackCaseList.d.ts +1 -1
  221. package/dist/components/panel/feedback/FeedbackCaseList.d.ts.map +1 -1
  222. package/dist/components/panel/feedback/FeedbackCaseList.js +4 -4
  223. package/dist/components/panel/feedback/FeedbackCaseList.js.map +1 -1
  224. package/dist/components/panel/feedback/FeedbackCaseTabBar.d.ts +2 -2
  225. package/dist/components/panel/feedback/FeedbackCaseTabBar.d.ts.map +1 -1
  226. package/dist/components/panel/feedback/FeedbackCaseTabBar.js +2 -2
  227. package/dist/components/panel/feedback/FeedbackCaseTabBar.js.map +1 -1
  228. package/dist/components/panel/feedback/FeedbackCategorySelector.d.ts +1 -1
  229. package/dist/components/panel/feedback/FeedbackCategorySelector.d.ts.map +1 -1
  230. package/dist/components/panel/feedback/FeedbackComposer.d.ts +5 -1
  231. package/dist/components/panel/feedback/FeedbackComposer.d.ts.map +1 -1
  232. package/dist/components/panel/feedback/FeedbackComposer.js +11 -15
  233. package/dist/components/panel/feedback/FeedbackComposer.js.map +1 -1
  234. package/dist/components/panel/feedback/FeedbackCreatorBadge.d.ts +1 -1
  235. package/dist/components/panel/feedback/FeedbackCreatorBadge.d.ts.map +1 -1
  236. package/dist/components/panel/feedback/FeedbackCreatorBadge.js +2 -2
  237. package/dist/components/panel/feedback/FeedbackCreatorBadge.js.map +1 -1
  238. package/dist/components/panel/feedback/FeedbackFieldTags.d.ts +1 -1
  239. package/dist/components/panel/feedback/FeedbackFieldTags.d.ts.map +1 -1
  240. package/dist/components/panel/feedback/FeedbackHoverCard.d.ts +1 -1
  241. package/dist/components/panel/feedback/FeedbackHoverCard.d.ts.map +1 -1
  242. package/dist/components/panel/feedback/FeedbackHoverCard.js +6 -6
  243. package/dist/components/panel/feedback/FeedbackHoverCard.js.map +1 -1
  244. package/dist/components/panel/feedback/FeedbackListItem.d.ts +1 -1
  245. package/dist/components/panel/feedback/FeedbackListItem.d.ts.map +1 -1
  246. package/dist/components/panel/feedback/FeedbackListItem.js +8 -8
  247. package/dist/components/panel/feedback/FeedbackListItem.js.map +1 -1
  248. package/dist/components/panel/feedback/FeedbackPinToggleButton.d.ts +10 -0
  249. package/dist/components/panel/feedback/FeedbackPinToggleButton.d.ts.map +1 -0
  250. package/dist/components/panel/feedback/FeedbackPinToggleButton.js +25 -0
  251. package/dist/components/panel/feedback/FeedbackPinToggleButton.js.map +1 -0
  252. package/dist/components/panel/feedback/FeedbackStatusBadge.d.ts +1 -1
  253. package/dist/components/panel/feedback/FeedbackStatusBadge.d.ts.map +1 -1
  254. package/dist/components/panel/feedback/FeedbackStatusBadge.js +2 -2
  255. package/dist/components/panel/feedback/FeedbackStatusBadge.js.map +1 -1
  256. package/dist/components/panel/feedback/FeedbackThread.d.ts +1 -1
  257. package/dist/components/panel/feedback/FeedbackThread.d.ts.map +1 -1
  258. package/dist/components/panel/feedback/FeedbackThread.js +9 -59
  259. package/dist/components/panel/feedback/FeedbackThread.js.map +1 -1
  260. package/dist/components/panel/feedback/GitIssueButton.d.ts +1 -1
  261. package/dist/components/panel/feedback/GitIssueButton.d.ts.map +1 -1
  262. package/dist/components/panel/feedback/GitIssueButton.js +1 -1
  263. package/dist/components/panel/feedback/GitIssueButton.js.map +1 -1
  264. package/dist/components/panel/feedback/GitIssuedThreadEntry.d.ts +1 -1
  265. package/dist/components/panel/feedback/GitIssuedThreadEntry.d.ts.map +1 -1
  266. package/dist/components/panel/feedback/GitIssuedThreadEntry.js +4 -4
  267. package/dist/components/panel/feedback/GitIssuedThreadEntry.js.map +1 -1
  268. package/dist/components/panel/feedback/PickTargetSnippet.d.ts +1 -1
  269. package/dist/components/panel/feedback/PickTargetSnippet.d.ts.map +1 -1
  270. package/dist/components/panel/feedback/PickTargetSnippet.js +4 -3
  271. package/dist/components/panel/feedback/PickTargetSnippet.js.map +1 -1
  272. package/dist/components/panel/feedback/QuestionThreadGroup.d.ts +1 -1
  273. package/dist/components/panel/feedback/QuestionThreadGroup.d.ts.map +1 -1
  274. package/dist/components/panel/feedback/QuestionThreadGroup.js +2 -2
  275. package/dist/components/panel/feedback/QuestionThreadGroup.js.map +1 -1
  276. package/dist/components/panel/feedback/ReplyHistoryControls.d.ts +1 -1
  277. package/dist/components/panel/feedback/ReplyHistoryControls.d.ts.map +1 -1
  278. package/dist/components/panel/feedback/ReplyHistoryControls.js +3 -2
  279. package/dist/components/panel/feedback/ReplyHistoryControls.js.map +1 -1
  280. package/dist/components/panel/feedback/ThreadAuthorMeta.d.ts +1 -1
  281. package/dist/components/panel/feedback/ThreadAuthorMeta.d.ts.map +1 -1
  282. package/dist/components/panel/feedback/ThreadChildReply.d.ts +1 -1
  283. package/dist/components/panel/feedback/ThreadChildReply.d.ts.map +1 -1
  284. package/dist/components/panel/feedback/ThreadEntryActions.d.ts +37 -0
  285. package/dist/components/panel/feedback/ThreadEntryActions.d.ts.map +1 -0
  286. package/dist/components/panel/feedback/ThreadEntryActions.js +57 -0
  287. package/dist/components/panel/feedback/ThreadEntryActions.js.map +1 -0
  288. package/dist/components/panel/feedback/ThreadTimelineRow.d.ts +1 -1
  289. package/dist/components/panel/feedback/ThreadTimelineRow.d.ts.map +1 -1
  290. package/dist/components/point/MarkerCaseSidebar.d.ts +1 -1
  291. package/dist/components/point/MarkerCaseSidebar.d.ts.map +1 -1
  292. package/dist/components/point/MarkerCaseSidebar.js +5 -5
  293. package/dist/components/point/MarkerCaseSidebar.js.map +1 -1
  294. package/dist/components/point/MarkerFeedbackWindow.d.ts +1 -1
  295. package/dist/components/point/MarkerFeedbackWindow.d.ts.map +1 -1
  296. package/dist/components/point/MarkerFeedbackWindow.js +11 -8
  297. package/dist/components/point/MarkerFeedbackWindow.js.map +1 -1
  298. package/dist/components/point/ReportDraftMarker.d.ts +1 -1
  299. package/dist/components/point/ReportDraftMarker.d.ts.map +1 -1
  300. package/dist/components/point/ReportDraftMarker.js +3 -3
  301. package/dist/components/point/ReportDraftMarker.js.map +1 -1
  302. package/dist/components/point/ReportMarkersLayer.d.ts +1 -1
  303. package/dist/components/point/ReportMarkersLayer.d.ts.map +1 -1
  304. package/dist/components/point/ReportMarkersLayer.js +52 -20
  305. package/dist/components/point/ReportMarkersLayer.js.map +1 -1
  306. package/dist/components/report/FivePixels.d.ts +3 -29
  307. package/dist/components/report/FivePixels.d.ts.map +1 -1
  308. package/dist/components/report/FivePixels.js +2 -2
  309. package/dist/components/report/FivePixels.js.map +1 -1
  310. package/dist/components/report/ReportView.d.ts +1 -1
  311. package/dist/components/report/ReportView.d.ts.map +1 -1
  312. package/dist/components/report/ReportView.js +14 -4
  313. package/dist/components/report/ReportView.js.map +1 -1
  314. package/dist/components/report/ShadowReportRoot.js +1 -1
  315. package/dist/components/report/ShadowReportRoot.js.map +1 -1
  316. package/dist/components/report/ThemeScope.d.ts +1 -1
  317. package/dist/components/report/ThemeScope.d.ts.map +1 -1
  318. package/dist/components/report/index.d.ts +9 -8
  319. package/dist/components/report/index.d.ts.map +1 -1
  320. package/dist/components/report/index.js +7 -6
  321. package/dist/components/report/index.js.map +1 -1
  322. package/dist/components/ui/CornerResizeGhost.d.ts +1 -1
  323. package/dist/components/ui/CornerResizeGhost.d.ts.map +1 -1
  324. package/dist/components/ui/CornerResizeGhost.js +2 -1
  325. package/dist/components/ui/CornerResizeGhost.js.map +1 -1
  326. package/dist/components/ui/CornerResizeHandle.d.ts +1 -1
  327. package/dist/components/ui/CornerResizeHandle.d.ts.map +1 -1
  328. package/dist/components/ui/HoverTooltip.d.ts +1 -1
  329. package/dist/components/ui/HoverTooltip.d.ts.map +1 -1
  330. package/dist/components/ui/HoverTooltip.js +5 -4
  331. package/dist/components/ui/HoverTooltip.js.map +1 -1
  332. package/dist/components/ui/IconTooltipButton.d.ts +1 -1
  333. package/dist/components/ui/IconTooltipButton.d.ts.map +1 -1
  334. package/dist/components/ui/PointerFollowTooltip.d.ts.map +1 -1
  335. package/dist/components/ui/PointerFollowTooltip.js +5 -4
  336. package/dist/components/ui/PointerFollowTooltip.js.map +1 -1
  337. package/dist/components/ui/ProcessingDots.d.ts +1 -1
  338. package/dist/components/ui/ProcessingDots.d.ts.map +1 -1
  339. package/dist/components/ui/Text/ui/Shimmer.d.ts +1 -1
  340. package/dist/components/ui/Text/ui/Shimmer.d.ts.map +1 -1
  341. package/dist/components/ui/Text/ui/Shimmer.js +1 -1
  342. package/dist/components/ui/Text/ui/Shimmer.js.map +1 -1
  343. package/dist/constants/markerAppearance.d.ts +6 -0
  344. package/dist/constants/markerAppearance.d.ts.map +1 -1
  345. package/dist/constants/markerAppearance.js +5 -0
  346. package/dist/constants/markerAppearance.js.map +1 -1
  347. package/dist/constants/motionClasses.d.ts +52 -0
  348. package/dist/constants/motionClasses.d.ts.map +1 -0
  349. package/dist/constants/motionClasses.js +69 -0
  350. package/dist/constants/motionClasses.js.map +1 -0
  351. package/dist/constants/panelTabPresets.js +8 -8
  352. package/dist/constants/panelTabPresets.js.map +1 -1
  353. package/dist/constants/panelTabRegistry.d.ts +12 -0
  354. package/dist/constants/panelTabRegistry.d.ts.map +1 -1
  355. package/dist/constants/panelTabRegistry.js +12 -0
  356. package/dist/constants/panelTabRegistry.js.map +1 -1
  357. package/dist/constants/replyHistory.d.ts +1 -1
  358. package/dist/constants/replyHistory.d.ts.map +1 -1
  359. package/dist/constants/replyHistory.js +1 -1
  360. package/dist/constants/replyHistory.js.map +1 -1
  361. package/dist/hooks/replyHistoryActions.d.ts +1 -1
  362. package/dist/hooks/replyHistoryActions.d.ts.map +1 -1
  363. package/dist/hooks/replyHistoryActions.js +1 -1
  364. package/dist/hooks/replyHistoryActions.js.map +1 -1
  365. package/dist/hooks/report/assembleReportContextValue.d.ts +316 -0
  366. package/dist/hooks/report/assembleReportContextValue.d.ts.map +1 -0
  367. package/dist/hooks/report/assembleReportContextValue.js +241 -0
  368. package/dist/hooks/report/assembleReportContextValue.js.map +1 -0
  369. package/dist/hooks/report/usePickProbeSessionHistory.d.ts +18 -0
  370. package/dist/hooks/report/usePickProbeSessionHistory.d.ts.map +1 -0
  371. package/dist/hooks/report/usePickProbeSessionHistory.js +93 -0
  372. package/dist/hooks/report/usePickProbeSessionHistory.js.map +1 -0
  373. package/dist/hooks/report/useReplyCaseEdit.d.ts +27 -0
  374. package/dist/hooks/report/useReplyCaseEdit.d.ts.map +1 -0
  375. package/dist/hooks/report/useReplyCaseEdit.js +91 -0
  376. package/dist/hooks/report/useReplyCaseEdit.js.map +1 -0
  377. package/dist/hooks/report/useReportAuthSession.d.ts +107 -0
  378. package/dist/hooks/report/useReportAuthSession.d.ts.map +1 -0
  379. package/dist/hooks/report/useReportAuthSession.js +240 -0
  380. package/dist/hooks/report/useReportAuthSession.js.map +1 -0
  381. package/dist/hooks/report/useReportDraftSession.d.ts +88 -0
  382. package/dist/hooks/report/useReportDraftSession.d.ts.map +1 -0
  383. package/dist/hooks/report/useReportDraftSession.js +416 -0
  384. package/dist/hooks/report/useReportDraftSession.js.map +1 -0
  385. package/dist/hooks/report/useReportMarkers.d.ts +61 -0
  386. package/dist/hooks/report/useReportMarkers.d.ts.map +1 -0
  387. package/dist/hooks/report/useReportMarkers.js +371 -0
  388. package/dist/hooks/report/useReportMarkers.js.map +1 -0
  389. package/dist/hooks/report/useReportMutations.d.ts +46 -0
  390. package/dist/hooks/report/useReportMutations.d.ts.map +1 -0
  391. package/dist/hooks/report/useReportMutations.js +177 -0
  392. package/dist/hooks/report/useReportMutations.js.map +1 -0
  393. package/dist/hooks/report/useReportPanelShell.d.ts +146 -0
  394. package/dist/hooks/report/useReportPanelShell.d.ts.map +1 -0
  395. package/dist/hooks/report/useReportPanelShell.js +340 -0
  396. package/dist/hooks/report/useReportPanelShell.js.map +1 -0
  397. package/dist/hooks/report/useReportPickProbe.d.ts +51 -0
  398. package/dist/hooks/report/useReportPickProbe.d.ts.map +1 -0
  399. package/dist/hooks/report/useReportPickProbe.js +400 -0
  400. package/dist/hooks/report/useReportPickProbe.js.map +1 -0
  401. package/dist/hooks/report/useReportReplyReview.d.ts +71 -0
  402. package/dist/hooks/report/useReportReplyReview.d.ts.map +1 -0
  403. package/dist/hooks/report/useReportReplyReview.js +437 -0
  404. package/dist/hooks/report/useReportReplyReview.js.map +1 -0
  405. package/dist/hooks/{useReportState.d.ts → report/useReportState.d.ts} +91 -95
  406. package/dist/hooks/report/useReportState.d.ts.map +1 -0
  407. package/dist/hooks/report/useReportState.js +255 -0
  408. package/dist/hooks/report/useReportState.js.map +1 -0
  409. package/dist/hooks/report.api.js +2 -2
  410. package/dist/hooks/report.api.js.map +1 -1
  411. package/dist/hooks/useActivitySummary.js +1 -1
  412. package/dist/hooks/useActivitySummary.js.map +1 -1
  413. package/dist/hooks/useCurrentPathname.js +2 -2
  414. package/dist/hooks/useCurrentPathname.js.map +1 -1
  415. package/dist/hooks/useMarkerAppearancePreference.d.ts +3 -1
  416. package/dist/hooks/useMarkerAppearancePreference.d.ts.map +1 -1
  417. package/dist/hooks/useMarkerAppearancePreference.js +31 -3
  418. package/dist/hooks/useMarkerAppearancePreference.js.map +1 -1
  419. package/dist/hooks/usePanelBootstrap.js +1 -1
  420. package/dist/hooks/usePanelBootstrap.js.map +1 -1
  421. package/dist/hooks/usePanelDock.d.ts +0 -2
  422. package/dist/hooks/usePanelDock.d.ts.map +1 -1
  423. package/dist/hooks/usePanelDock.js.map +1 -1
  424. package/dist/hooks/usePanelFeedbackTransfer.d.ts +1 -1
  425. package/dist/hooks/usePanelFeedbackTransfer.d.ts.map +1 -1
  426. package/dist/hooks/usePanelFeedbackTransfer.js +1 -1
  427. package/dist/hooks/usePanelFeedbackTransfer.js.map +1 -1
  428. package/dist/hooks/usePanelResize.d.ts +0 -8
  429. package/dist/hooks/usePanelResize.d.ts.map +1 -1
  430. package/dist/hooks/usePanelResize.js +1 -16
  431. package/dist/hooks/usePanelResize.js.map +1 -1
  432. package/dist/hooks/usePanelTabPreference.d.ts +1 -1
  433. package/dist/hooks/usePanelTabPreference.d.ts.map +1 -1
  434. package/dist/hooks/usePanelTabPreference.js +1 -1
  435. package/dist/hooks/usePanelTabPreference.js.map +1 -1
  436. package/dist/hooks/usePersonalKey.js +1 -1
  437. package/dist/hooks/usePersonalKey.js.map +1 -1
  438. package/dist/hooks/usePinnedFeedbackPreference.d.ts +11 -0
  439. package/dist/hooks/usePinnedFeedbackPreference.d.ts.map +1 -0
  440. package/dist/hooks/usePinnedFeedbackPreference.js +109 -0
  441. package/dist/hooks/usePinnedFeedbackPreference.js.map +1 -0
  442. package/dist/hooks/useReportPersistence.d.ts +3 -2
  443. package/dist/hooks/useReportPersistence.d.ts.map +1 -1
  444. package/dist/hooks/useReportPersistence.js +28 -42
  445. package/dist/hooks/useReportPersistence.js.map +1 -1
  446. package/dist/hooks/useReportShortcuts.d.ts +1 -1
  447. package/dist/hooks/useReportShortcuts.d.ts.map +1 -1
  448. package/dist/hooks/useReportShortcuts.js +1 -1
  449. package/dist/hooks/useReportShortcuts.js.map +1 -1
  450. package/dist/hooks/useTooltipLayout.d.ts +1 -1
  451. package/dist/hooks/useTooltipLayout.js +1 -1
  452. package/dist/hooks/useTooltipLayout.js.map +1 -1
  453. package/dist/hooks/useTooltipResize.js +1 -1
  454. package/dist/hooks/useTooltipResize.js.map +1 -1
  455. package/dist/i18n/en.d.ts.map +1 -1
  456. package/dist/i18n/en.js +38 -0
  457. package/dist/i18n/en.js.map +1 -1
  458. package/dist/i18n/ko.d.ts.map +1 -1
  459. package/dist/i18n/ko.js +38 -0
  460. package/dist/i18n/ko.js.map +1 -1
  461. package/dist/i18n/types.d.ts +38 -0
  462. package/dist/i18n/types.d.ts.map +1 -1
  463. package/dist/providers/ReportProvider.d.ts +3 -31
  464. package/dist/providers/ReportProvider.d.ts.map +1 -1
  465. package/dist/providers/ReportProvider.js +9 -8
  466. package/dist/providers/ReportProvider.js.map +1 -1
  467. package/dist/providers/reportContext.d.ts +1083 -207
  468. package/dist/providers/reportContext.d.ts.map +1 -1
  469. package/dist/providers/reportContext.js +43 -7
  470. package/dist/providers/reportContext.js.map +1 -1
  471. package/dist/providers/reportContextPartitions.d.ts +5 -0
  472. package/dist/providers/reportContextPartitions.d.ts.map +1 -0
  473. package/dist/providers/reportContextPartitions.js +246 -0
  474. package/dist/providers/reportContextPartitions.js.map +1 -0
  475. package/dist/storage/local/localStorageAdapter.d.ts +0 -2
  476. package/dist/storage/local/localStorageAdapter.d.ts.map +1 -1
  477. package/dist/storage/local/localStorageAdapter.js +6 -7
  478. package/dist/storage/local/localStorageAdapter.js.map +1 -1
  479. package/dist/styles/reportStylesheet.d.ts +1 -1
  480. package/dist/styles/reportStylesheet.d.ts.map +1 -1
  481. package/dist/styles/reportStylesheet.js +1 -1
  482. package/dist/styles/reportStylesheet.js.map +1 -1
  483. package/dist/types/pinnedFeedback.d.ts +20 -0
  484. package/dist/types/pinnedFeedback.d.ts.map +1 -0
  485. package/dist/types/pinnedFeedback.js +2 -0
  486. package/dist/types/pinnedFeedback.js.map +1 -0
  487. package/dist/types/publicApi.d.ts +27 -0
  488. package/dist/types/publicApi.d.ts.map +1 -0
  489. package/dist/types/publicApi.js +2 -0
  490. package/dist/types/publicApi.js.map +1 -0
  491. package/dist/types/report-ui.d.ts +1 -1
  492. package/dist/types/report-ui.d.ts.map +1 -1
  493. package/dist/types/report.d.ts +7 -3
  494. package/dist/types/report.d.ts.map +1 -1
  495. package/dist/utils/{personalKey.d.ts → auth/personalKey.d.ts} +1 -1
  496. package/dist/utils/auth/personalKey.d.ts.map +1 -0
  497. package/dist/utils/{personalKey.js → auth/personalKey.js} +23 -7
  498. package/dist/utils/auth/personalKey.js.map +1 -0
  499. package/dist/utils/{feedbackCaseId.d.ts → feedback/feedbackCaseId.d.ts} +1 -1
  500. package/dist/utils/feedback/feedbackCaseId.d.ts.map +1 -0
  501. package/dist/utils/feedback/feedbackCaseId.js.map +1 -0
  502. package/dist/utils/{feedbackDataTransfer.d.ts → feedback/feedbackDataTransfer.d.ts} +1 -1
  503. package/dist/utils/feedback/feedbackDataTransfer.d.ts.map +1 -0
  504. package/dist/utils/{feedbackDataTransfer.js → feedback/feedbackDataTransfer.js} +3 -3
  505. package/dist/utils/feedback/feedbackDataTransfer.js.map +1 -0
  506. package/dist/utils/{feedbackDeepLink.d.ts → feedback/feedbackDeepLink.d.ts} +1 -1
  507. package/dist/utils/feedback/feedbackDeepLink.d.ts.map +1 -0
  508. package/dist/utils/feedback/feedbackDeepLink.js.map +1 -0
  509. package/dist/utils/feedback/feedbackListStatus.d.ts +4 -0
  510. package/dist/utils/feedback/feedbackListStatus.d.ts.map +1 -0
  511. package/dist/utils/{feedbackListStatus.js → feedback/feedbackListStatus.js} +2 -2
  512. package/dist/utils/feedback/feedbackListStatus.js.map +1 -0
  513. package/dist/utils/{feedbackThread.d.ts → feedback/feedbackThread.d.ts} +2 -4
  514. package/dist/utils/feedback/feedbackThread.d.ts.map +1 -0
  515. package/dist/utils/{feedbackThread.js → feedback/feedbackThread.js} +2 -6
  516. package/dist/utils/feedback/feedbackThread.js.map +1 -0
  517. package/dist/utils/{feedbackTransferSchema.d.ts → feedback/feedbackTransferSchema.d.ts} +2 -2
  518. package/dist/utils/feedback/feedbackTransferSchema.d.ts.map +1 -0
  519. package/dist/utils/{feedbackTransferSchema.js → feedback/feedbackTransferSchema.js} +1 -1
  520. package/dist/utils/feedback/feedbackTransferSchema.js.map +1 -0
  521. package/dist/utils/{replyHistory.d.ts → feedback/replyHistory.d.ts} +1 -1
  522. package/dist/utils/feedback/replyHistory.d.ts.map +1 -0
  523. package/dist/utils/{replyHistory.js → feedback/replyHistory.js} +1 -1
  524. package/dist/utils/feedback/replyHistory.js.map +1 -0
  525. package/dist/utils/{validateFeedbackImport.d.ts → feedback/validateFeedbackImport.d.ts} +1 -1
  526. package/dist/utils/feedback/validateFeedbackImport.d.ts.map +1 -0
  527. package/dist/utils/{validateFeedbackImport.js → feedback/validateFeedbackImport.js} +3 -3
  528. package/dist/utils/feedback/validateFeedbackImport.js.map +1 -0
  529. package/dist/utils/{githubIntegration.d.ts → github/githubIntegration.d.ts} +1 -1
  530. package/dist/utils/github/githubIntegration.d.ts.map +1 -0
  531. package/dist/utils/{githubIntegration.js → github/githubIntegration.js} +1 -1
  532. package/dist/utils/github/githubIntegration.js.map +1 -0
  533. package/dist/utils/{coordinates.d.ts → marker/coordinates.d.ts} +2 -2
  534. package/dist/utils/marker/coordinates.d.ts.map +1 -0
  535. package/dist/utils/{coordinates.js → marker/coordinates.js} +30 -24
  536. package/dist/utils/marker/coordinates.js.map +1 -0
  537. package/dist/utils/marker/hoverTooltipLayout.d.ts.map +1 -0
  538. package/dist/utils/marker/hoverTooltipLayout.js.map +1 -0
  539. package/dist/utils/{locateFeedback.d.ts → marker/locateFeedback.d.ts} +2 -2
  540. package/dist/utils/marker/locateFeedback.d.ts.map +1 -0
  541. package/dist/utils/{locateFeedback.js → marker/locateFeedback.js} +5 -4
  542. package/dist/utils/marker/locateFeedback.js.map +1 -0
  543. package/dist/utils/{markerContext.d.ts → marker/markerContext.d.ts} +2 -2
  544. package/dist/utils/marker/markerContext.d.ts.map +1 -0
  545. package/dist/utils/{markerContext.js → marker/markerContext.js} +5 -3
  546. package/dist/utils/marker/markerContext.js.map +1 -0
  547. package/dist/utils/{markerRuntime.d.ts → marker/markerRuntime.d.ts} +1 -1
  548. package/dist/utils/marker/markerRuntime.d.ts.map +1 -0
  549. package/dist/utils/{markerRuntime.js → marker/markerRuntime.js} +2 -2
  550. package/dist/utils/marker/markerRuntime.js.map +1 -0
  551. package/dist/utils/{markerShape.d.ts → marker/markerShape.d.ts} +1 -1
  552. package/dist/utils/marker/markerShape.d.ts.map +1 -0
  553. package/dist/utils/marker/markerShape.js.map +1 -0
  554. package/dist/utils/marker/markerTarget.d.ts +3 -0
  555. package/dist/utils/marker/markerTarget.d.ts.map +1 -0
  556. package/dist/utils/{markerTarget.js → marker/markerTarget.js} +6 -0
  557. package/dist/utils/marker/markerTarget.js.map +1 -0
  558. package/dist/utils/{targetSelector.d.ts → marker/targetSelector.d.ts} +1 -1
  559. package/dist/utils/marker/targetSelector.d.ts.map +1 -0
  560. package/dist/utils/{targetSelector.js → marker/targetSelector.js} +1 -1
  561. package/dist/utils/marker/targetSelector.js.map +1 -0
  562. package/dist/utils/{experimentalPanelTabs.d.ts → panel/experimentalPanelTabs.d.ts} +4 -2
  563. package/dist/utils/panel/experimentalPanelTabs.d.ts.map +1 -0
  564. package/dist/utils/{experimentalPanelTabs.js → panel/experimentalPanelTabs.js} +10 -3
  565. package/dist/utils/panel/experimentalPanelTabs.js.map +1 -0
  566. package/dist/utils/panel/formatStatCount.d.ts.map +1 -0
  567. package/dist/utils/panel/formatStatCount.js.map +1 -0
  568. package/dist/utils/{heatmapActivity.d.ts → panel/heatmapActivity.d.ts} +3 -3
  569. package/dist/utils/panel/heatmapActivity.d.ts.map +1 -0
  570. package/dist/utils/panel/heatmapActivity.js.map +1 -0
  571. package/dist/utils/{hourlyCompareSparkline.d.ts → panel/hourlyCompareSparkline.d.ts} +1 -1
  572. package/dist/utils/panel/hourlyCompareSparkline.d.ts.map +1 -0
  573. package/dist/utils/{hourlyCompareSparkline.js → panel/hourlyCompareSparkline.js} +1 -1
  574. package/dist/utils/panel/hourlyCompareSparkline.js.map +1 -0
  575. package/dist/utils/{panelBootstrap.d.ts → panel/panelBootstrap.d.ts} +2 -2
  576. package/dist/utils/panel/panelBootstrap.d.ts.map +1 -0
  577. package/dist/utils/{panelBootstrap.js → panel/panelBootstrap.js} +3 -3
  578. package/dist/utils/panel/panelBootstrap.js.map +1 -0
  579. package/dist/utils/{panelRoleStats.d.ts → panel/panelRoleStats.d.ts} +3 -3
  580. package/dist/utils/panel/panelRoleStats.d.ts.map +1 -0
  581. package/dist/utils/{panelRoleStats.js → panel/panelRoleStats.js} +4 -4
  582. package/dist/utils/panel/panelRoleStats.js.map +1 -0
  583. package/dist/utils/{panelTabPreference.d.ts → panel/panelTabPreference.d.ts} +2 -2
  584. package/dist/utils/panel/panelTabPreference.d.ts.map +1 -0
  585. package/dist/utils/{panelTabPreference.js → panel/panelTabPreference.js} +2 -2
  586. package/dist/utils/panel/panelTabPreference.js.map +1 -0
  587. package/dist/utils/panel/panelTypography.d.ts.map +1 -0
  588. package/dist/utils/panel/panelTypography.js.map +1 -0
  589. package/dist/utils/{routeDetailStatus.d.ts → panel/routeDetailStatus.d.ts} +1 -1
  590. package/dist/utils/panel/routeDetailStatus.d.ts.map +1 -0
  591. package/dist/utils/{routeDetailStatus.js → panel/routeDetailStatus.js} +1 -1
  592. package/dist/utils/panel/routeDetailStatus.js.map +1 -0
  593. package/dist/utils/pinned/pinnedFeedback.d.ts +18 -0
  594. package/dist/utils/pinned/pinnedFeedback.d.ts.map +1 -0
  595. package/dist/utils/pinned/pinnedFeedback.js +86 -0
  596. package/dist/utils/pinned/pinnedFeedback.js.map +1 -0
  597. package/dist/utils/probe/cssStepper.d.ts.map +1 -0
  598. package/dist/utils/probe/cssStepper.js.map +1 -0
  599. package/dist/utils/{pickProbe.d.ts → probe/pickProbe.d.ts} +2 -2
  600. package/dist/utils/probe/pickProbe.d.ts.map +1 -0
  601. package/dist/utils/probe/pickProbe.js.map +1 -0
  602. package/dist/utils/probe/pickProbeLayout.d.ts.map +1 -0
  603. package/dist/utils/probe/pickProbeLayout.js.map +1 -0
  604. package/dist/utils/{pickProbeSession.d.ts → probe/pickProbeSession.d.ts} +1 -1
  605. package/dist/utils/probe/pickProbeSession.d.ts.map +1 -0
  606. package/dist/utils/{pickProbeSession.js → probe/pickProbeSession.js} +2 -2
  607. package/dist/utils/probe/pickProbeSession.js.map +1 -0
  608. package/dist/utils/probe/pickTargetDeleteAnimation.d.ts.map +1 -0
  609. package/dist/utils/{pickTargetDeleteAnimation.js → probe/pickTargetDeleteAnimation.js} +1 -1
  610. package/dist/utils/probe/pickTargetDeleteAnimation.js.map +1 -0
  611. package/dist/utils/{pickTargetInspect.d.ts → probe/pickTargetInspect.d.ts} +1 -1
  612. package/dist/utils/probe/pickTargetInspect.d.ts.map +1 -0
  613. package/dist/utils/probe/pickTargetInspect.js.map +1 -0
  614. package/dist/utils/probe/probeColor.d.ts.map +1 -0
  615. package/dist/utils/probe/probeColor.js.map +1 -0
  616. package/dist/utils/{probeLayout.d.ts → probe/probeLayout.d.ts} +1 -1
  617. package/dist/utils/probe/probeLayout.d.ts.map +1 -0
  618. package/dist/utils/probe/probeLayout.js.map +1 -0
  619. package/dist/utils/{probeSessionHistory.d.ts → probe/probeSessionHistory.d.ts} +1 -1
  620. package/dist/utils/probe/probeSessionHistory.d.ts.map +1 -0
  621. package/dist/utils/probe/probeSessionHistory.js.map +1 -0
  622. package/dist/utils/{fields.d.ts → report/fields.d.ts} +3 -3
  623. package/dist/utils/report/fields.d.ts.map +1 -0
  624. package/dist/utils/{fields.js → report/fields.js} +1 -1
  625. package/dist/utils/report/fields.js.map +1 -0
  626. package/dist/utils/report/projectId.d.ts.map +1 -0
  627. package/dist/utils/{projectId.js → report/projectId.js} +2 -2
  628. package/dist/utils/report/projectId.js.map +1 -0
  629. package/dist/utils/{reportCallbacks.d.ts → report/reportCallbacks.d.ts} +1 -1
  630. package/dist/utils/report/reportCallbacks.d.ts.map +1 -0
  631. package/dist/utils/report/reportCallbacks.js.map +1 -0
  632. package/dist/utils/{reportCases.d.ts → report/reportCases.d.ts} +1 -1
  633. package/dist/utils/report/reportCases.d.ts.map +1 -0
  634. package/dist/utils/report/reportCases.js.map +1 -0
  635. package/dist/utils/{reportPosition.d.ts → report/reportPosition.d.ts} +3 -1
  636. package/dist/utils/report/reportPosition.d.ts.map +1 -0
  637. package/dist/utils/report/reportPosition.js +112 -0
  638. package/dist/utils/report/reportPosition.js.map +1 -0
  639. package/dist/utils/{reportProject.d.ts → report/reportProject.d.ts} +1 -1
  640. package/dist/utils/report/reportProject.d.ts.map +1 -0
  641. package/dist/utils/report/reportProject.js.map +1 -0
  642. package/dist/utils/{reportSummary.d.ts → report/reportSummary.d.ts} +1 -1
  643. package/dist/utils/report/reportSummary.d.ts.map +1 -0
  644. package/dist/utils/{reportSummary.js → report/reportSummary.js} +2 -0
  645. package/dist/utils/report/reportSummary.js.map +1 -0
  646. package/dist/utils/{reportTeam.d.ts → report/reportTeam.d.ts} +1 -1
  647. package/dist/utils/report/reportTeam.d.ts.map +1 -0
  648. package/dist/utils/{reportTeam.js → report/reportTeam.js} +1 -1
  649. package/dist/utils/report/reportTeam.js.map +1 -0
  650. package/dist/utils/{reportUi.d.ts → report/reportUi.d.ts} +2 -2
  651. package/dist/utils/report/reportUi.d.ts.map +1 -0
  652. package/dist/utils/{reportUi.js → report/reportUi.js} +6 -10
  653. package/dist/utils/report/reportUi.js.map +1 -0
  654. package/dist/utils/{reportVisibility.d.ts → report/reportVisibility.d.ts} +1 -1
  655. package/dist/utils/report/reportVisibility.d.ts.map +1 -0
  656. package/dist/utils/report/reportVisibility.js.map +1 -0
  657. package/dist/utils/{reportVisual.d.ts → report/reportVisual.d.ts} +2 -2
  658. package/dist/utils/report/reportVisual.d.ts.map +1 -0
  659. package/dist/utils/{reportVisual.js → report/reportVisual.js} +3 -3
  660. package/dist/utils/report/reportVisual.js.map +1 -0
  661. package/dist/utils/report/resolveDefaultAuthorName.d.ts +3 -0
  662. package/dist/utils/report/resolveDefaultAuthorName.d.ts.map +1 -0
  663. package/dist/utils/report/resolveDefaultAuthorName.js +7 -0
  664. package/dist/utils/report/resolveDefaultAuthorName.js.map +1 -0
  665. package/dist/utils/{dom.d.ts → shared/dom.d.ts} +2 -2
  666. package/dist/utils/shared/dom.d.ts.map +1 -0
  667. package/dist/utils/{dom.js → shared/dom.js} +3 -3
  668. package/dist/utils/shared/dom.js.map +1 -0
  669. package/dist/utils/shared/env.d.ts.map +1 -0
  670. package/dist/utils/shared/env.js.map +1 -0
  671. package/dist/utils/{format.d.ts → shared/format.d.ts} +1 -1
  672. package/dist/utils/shared/format.d.ts.map +1 -0
  673. package/dist/utils/shared/format.js.map +1 -0
  674. package/dist/utils/shared/hexColor.d.ts.map +1 -0
  675. package/dist/utils/shared/hexColor.js.map +1 -0
  676. package/dist/utils/shared/pathname.d.ts.map +1 -0
  677. package/dist/utils/shared/pathname.js.map +1 -0
  678. package/dist/utils/shared/pathnameNavigation.d.ts.map +1 -0
  679. package/dist/utils/shared/pathnameNavigation.js.map +1 -0
  680. package/dist/utils/shared/shortcuts.d.ts.map +1 -0
  681. package/dist/utils/shared/shortcuts.js.map +1 -0
  682. package/dist/utils/{storage.d.ts → shared/storage.d.ts} +21 -1
  683. package/dist/utils/shared/storage.d.ts.map +1 -0
  684. package/dist/utils/{storage.js → shared/storage.js} +38 -3
  685. package/dist/utils/shared/storage.js.map +1 -0
  686. package/package.json +7 -3
  687. package/dist/hooks/useReportState.d.ts.map +0 -1
  688. package/dist/hooks/useReportState.js +0 -2377
  689. package/dist/hooks/useReportState.js.map +0 -1
  690. package/dist/utils/coordinates.d.ts.map +0 -1
  691. package/dist/utils/coordinates.js.map +0 -1
  692. package/dist/utils/cssStepper.d.ts.map +0 -1
  693. package/dist/utils/cssStepper.js.map +0 -1
  694. package/dist/utils/dom.d.ts.map +0 -1
  695. package/dist/utils/dom.js.map +0 -1
  696. package/dist/utils/env.d.ts.map +0 -1
  697. package/dist/utils/env.js.map +0 -1
  698. package/dist/utils/experimentalPanelTabs.d.ts.map +0 -1
  699. package/dist/utils/experimentalPanelTabs.js.map +0 -1
  700. package/dist/utils/feedbackCaseId.d.ts.map +0 -1
  701. package/dist/utils/feedbackCaseId.js.map +0 -1
  702. package/dist/utils/feedbackDataTransfer.d.ts.map +0 -1
  703. package/dist/utils/feedbackDataTransfer.js.map +0 -1
  704. package/dist/utils/feedbackDeepLink.d.ts.map +0 -1
  705. package/dist/utils/feedbackDeepLink.js.map +0 -1
  706. package/dist/utils/feedbackListStatus.d.ts +0 -4
  707. package/dist/utils/feedbackListStatus.d.ts.map +0 -1
  708. package/dist/utils/feedbackListStatus.js.map +0 -1
  709. package/dist/utils/feedbackThread.d.ts.map +0 -1
  710. package/dist/utils/feedbackThread.js.map +0 -1
  711. package/dist/utils/feedbackTransferSchema.d.ts.map +0 -1
  712. package/dist/utils/feedbackTransferSchema.js.map +0 -1
  713. package/dist/utils/fields.d.ts.map +0 -1
  714. package/dist/utils/fields.js.map +0 -1
  715. package/dist/utils/format.d.ts.map +0 -1
  716. package/dist/utils/format.js.map +0 -1
  717. package/dist/utils/formatStatCount.d.ts.map +0 -1
  718. package/dist/utils/formatStatCount.js.map +0 -1
  719. package/dist/utils/githubIntegration.d.ts.map +0 -1
  720. package/dist/utils/githubIntegration.js.map +0 -1
  721. package/dist/utils/heatmapActivity.d.ts.map +0 -1
  722. package/dist/utils/heatmapActivity.js.map +0 -1
  723. package/dist/utils/hexColor.d.ts.map +0 -1
  724. package/dist/utils/hexColor.js.map +0 -1
  725. package/dist/utils/hourlyCompareSparkline.d.ts.map +0 -1
  726. package/dist/utils/hourlyCompareSparkline.js.map +0 -1
  727. package/dist/utils/hoverTooltipLayout.d.ts.map +0 -1
  728. package/dist/utils/hoverTooltipLayout.js.map +0 -1
  729. package/dist/utils/locateFeedback.d.ts.map +0 -1
  730. package/dist/utils/locateFeedback.js.map +0 -1
  731. package/dist/utils/markerContext.d.ts.map +0 -1
  732. package/dist/utils/markerContext.js.map +0 -1
  733. package/dist/utils/markerRuntime.d.ts.map +0 -1
  734. package/dist/utils/markerRuntime.js.map +0 -1
  735. package/dist/utils/markerShape.d.ts.map +0 -1
  736. package/dist/utils/markerShape.js.map +0 -1
  737. package/dist/utils/markerTarget.d.ts +0 -3
  738. package/dist/utils/markerTarget.d.ts.map +0 -1
  739. package/dist/utils/markerTarget.js.map +0 -1
  740. package/dist/utils/panelBootstrap.d.ts.map +0 -1
  741. package/dist/utils/panelBootstrap.js.map +0 -1
  742. package/dist/utils/panelRoleStats.d.ts.map +0 -1
  743. package/dist/utils/panelRoleStats.js.map +0 -1
  744. package/dist/utils/panelTabPreference.d.ts.map +0 -1
  745. package/dist/utils/panelTabPreference.js.map +0 -1
  746. package/dist/utils/panelTypography.d.ts.map +0 -1
  747. package/dist/utils/panelTypography.js.map +0 -1
  748. package/dist/utils/pathname.d.ts.map +0 -1
  749. package/dist/utils/pathname.js.map +0 -1
  750. package/dist/utils/pathnameNavigation.d.ts.map +0 -1
  751. package/dist/utils/pathnameNavigation.js.map +0 -1
  752. package/dist/utils/personalKey.d.ts.map +0 -1
  753. package/dist/utils/personalKey.js.map +0 -1
  754. package/dist/utils/pickProbe.d.ts.map +0 -1
  755. package/dist/utils/pickProbe.js.map +0 -1
  756. package/dist/utils/pickProbeLayout.d.ts.map +0 -1
  757. package/dist/utils/pickProbeLayout.js.map +0 -1
  758. package/dist/utils/pickProbeSession.d.ts.map +0 -1
  759. package/dist/utils/pickProbeSession.js.map +0 -1
  760. package/dist/utils/pickTargetDeleteAnimation.d.ts.map +0 -1
  761. package/dist/utils/pickTargetDeleteAnimation.js.map +0 -1
  762. package/dist/utils/pickTargetInspect.d.ts.map +0 -1
  763. package/dist/utils/pickTargetInspect.js.map +0 -1
  764. package/dist/utils/probeColor.d.ts.map +0 -1
  765. package/dist/utils/probeColor.js.map +0 -1
  766. package/dist/utils/probeLayout.d.ts.map +0 -1
  767. package/dist/utils/probeLayout.js.map +0 -1
  768. package/dist/utils/probeSessionHistory.d.ts.map +0 -1
  769. package/dist/utils/probeSessionHistory.js.map +0 -1
  770. package/dist/utils/projectId.d.ts.map +0 -1
  771. package/dist/utils/projectId.js.map +0 -1
  772. package/dist/utils/replyHistory.d.ts.map +0 -1
  773. package/dist/utils/replyHistory.js.map +0 -1
  774. package/dist/utils/reportCallbacks.d.ts.map +0 -1
  775. package/dist/utils/reportCallbacks.js.map +0 -1
  776. package/dist/utils/reportCases.d.ts.map +0 -1
  777. package/dist/utils/reportCases.js.map +0 -1
  778. package/dist/utils/reportPosition.d.ts.map +0 -1
  779. package/dist/utils/reportPosition.js +0 -18
  780. package/dist/utils/reportPosition.js.map +0 -1
  781. package/dist/utils/reportProject.d.ts.map +0 -1
  782. package/dist/utils/reportProject.js.map +0 -1
  783. package/dist/utils/reportSummary.d.ts.map +0 -1
  784. package/dist/utils/reportSummary.js.map +0 -1
  785. package/dist/utils/reportTeam.d.ts.map +0 -1
  786. package/dist/utils/reportTeam.js.map +0 -1
  787. package/dist/utils/reportUi.d.ts.map +0 -1
  788. package/dist/utils/reportUi.js.map +0 -1
  789. package/dist/utils/reportVisibility.d.ts.map +0 -1
  790. package/dist/utils/reportVisibility.js.map +0 -1
  791. package/dist/utils/reportVisual.d.ts.map +0 -1
  792. package/dist/utils/reportVisual.js.map +0 -1
  793. package/dist/utils/routeDetailStatus.d.ts.map +0 -1
  794. package/dist/utils/routeDetailStatus.js.map +0 -1
  795. package/dist/utils/shortcuts.d.ts.map +0 -1
  796. package/dist/utils/shortcuts.js.map +0 -1
  797. package/dist/utils/storage.d.ts.map +0 -1
  798. package/dist/utils/storage.js.map +0 -1
  799. package/dist/utils/targetSelector.d.ts.map +0 -1
  800. package/dist/utils/targetSelector.js.map +0 -1
  801. package/dist/utils/validateFeedbackImport.d.ts.map +0 -1
  802. package/dist/utils/validateFeedbackImport.js.map +0 -1
  803. /package/dist/utils/{feedbackCaseId.js → feedback/feedbackCaseId.js} +0 -0
  804. /package/dist/utils/{feedbackDeepLink.js → feedback/feedbackDeepLink.js} +0 -0
  805. /package/dist/utils/{hoverTooltipLayout.d.ts → marker/hoverTooltipLayout.d.ts} +0 -0
  806. /package/dist/utils/{hoverTooltipLayout.js → marker/hoverTooltipLayout.js} +0 -0
  807. /package/dist/utils/{markerShape.js → marker/markerShape.js} +0 -0
  808. /package/dist/utils/{formatStatCount.d.ts → panel/formatStatCount.d.ts} +0 -0
  809. /package/dist/utils/{formatStatCount.js → panel/formatStatCount.js} +0 -0
  810. /package/dist/utils/{heatmapActivity.js → panel/heatmapActivity.js} +0 -0
  811. /package/dist/utils/{panelTypography.d.ts → panel/panelTypography.d.ts} +0 -0
  812. /package/dist/utils/{panelTypography.js → panel/panelTypography.js} +0 -0
  813. /package/dist/utils/{cssStepper.d.ts → probe/cssStepper.d.ts} +0 -0
  814. /package/dist/utils/{cssStepper.js → probe/cssStepper.js} +0 -0
  815. /package/dist/utils/{pickProbe.js → probe/pickProbe.js} +0 -0
  816. /package/dist/utils/{pickProbeLayout.d.ts → probe/pickProbeLayout.d.ts} +0 -0
  817. /package/dist/utils/{pickProbeLayout.js → probe/pickProbeLayout.js} +0 -0
  818. /package/dist/utils/{pickTargetDeleteAnimation.d.ts → probe/pickTargetDeleteAnimation.d.ts} +0 -0
  819. /package/dist/utils/{pickTargetInspect.js → probe/pickTargetInspect.js} +0 -0
  820. /package/dist/utils/{probeColor.d.ts → probe/probeColor.d.ts} +0 -0
  821. /package/dist/utils/{probeColor.js → probe/probeColor.js} +0 -0
  822. /package/dist/utils/{probeLayout.js → probe/probeLayout.js} +0 -0
  823. /package/dist/utils/{probeSessionHistory.js → probe/probeSessionHistory.js} +0 -0
  824. /package/dist/utils/{projectId.d.ts → report/projectId.d.ts} +0 -0
  825. /package/dist/utils/{reportCallbacks.js → report/reportCallbacks.js} +0 -0
  826. /package/dist/utils/{reportCases.js → report/reportCases.js} +0 -0
  827. /package/dist/utils/{reportProject.js → report/reportProject.js} +0 -0
  828. /package/dist/utils/{reportVisibility.js → report/reportVisibility.js} +0 -0
  829. /package/dist/utils/{env.d.ts → shared/env.d.ts} +0 -0
  830. /package/dist/utils/{env.js → shared/env.js} +0 -0
  831. /package/dist/utils/{format.js → shared/format.js} +0 -0
  832. /package/dist/utils/{hexColor.d.ts → shared/hexColor.d.ts} +0 -0
  833. /package/dist/utils/{hexColor.js → shared/hexColor.js} +0 -0
  834. /package/dist/utils/{pathname.d.ts → shared/pathname.d.ts} +0 -0
  835. /package/dist/utils/{pathname.js → shared/pathname.js} +0 -0
  836. /package/dist/utils/{pathnameNavigation.d.ts → shared/pathnameNavigation.d.ts} +0 -0
  837. /package/dist/utils/{pathnameNavigation.js → shared/pathnameNavigation.js} +0 -0
  838. /package/dist/utils/{shortcuts.d.ts → shared/shortcuts.d.ts} +0 -0
  839. /package/dist/utils/{shortcuts.js → shared/shortcuts.js} +0 -0
@@ -1,2377 +0,0 @@
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 { useMarkerTargetPreviewPreference } from "./useMarkerTargetPreviewPreference.js";
5
- import { useMarkerAppearancePreference } from "./useMarkerAppearancePreference.js";
6
- import { useTypographyPreference } from "./useTypographyPreference.js";
7
- import { useReportPersistence } from "./useReportPersistence.js";
8
- import { useIsMobileViewport } from "./useIsMobileViewport.js";
9
- import { useAppearancePreference } from "./useAppearancePreference.js";
10
- import { PANEL_APPEARANCE_STORAGE_KEY, TOOLTIP_APPEARANCE_STORAGE_KEY } from "../constants/appearance.js";
11
- import { useLocalePreference } from "./useLocalePreference.js";
12
- import { useQuestionThreadPreference } from "./useQuestionThreadPreference.js";
13
- import { usePanelRolePreference } from "./usePanelRolePreference.js";
14
- import { usePanelTabPreference } from "./usePanelTabPreference.js";
15
- import { usePersonalKey } from "./usePersonalKey.js";
16
- import { useSelfProfile } from "./useSelfProfile.js";
17
- import { hasStoredPersonalKey, getAuthorIdFromPrivateKey, getAuthorNameFromPrivateKey, parsePrivateKeyBundle, publicKeysMatch, serializePublicKey } from "../utils/personalKey.js";
18
- import { usePanelBootstrap } from "./usePanelBootstrap.js";
19
- import { useResolvedAppearance } from "./useResolvedAppearance.js";
20
- import { buildPanelStats } from "../utils/panelBootstrap.js";
21
- import { buildPanelRoleStats } from "../utils/panelRoleStats.js";
22
- import { getPanelRoleTabPreset } from "../constants/panelTabPresets.js";
23
- import { getPanelTabDefinition, isUserSelectablePanelTab } from "../constants/panelTabRegistry.js";
24
- import { formatVisibleTabSummary, resolveDefaultPanelTab, resolveVisibleTabs, } from "../utils/panelTabPreference.js";
25
- import { canShowCaseClaimAction, createReplyStatusForSubmit, getLatestBranchRootForCase, getReportReplies, ISSUE_ROOT_PARENT_ID, requiresCaseActorPermissionForComposer, resolveOriginalFeedbackAuthorName, resolveParentReplyIdForCaseQuestion, } from "../utils/feedbackThread.js";
26
- import { clampRatio, getMarkerFromReport, resolveTooltipAnchor } from "../utils/coordinates.js";
27
- import { getFeedbackTargetElement, isFeedbackTargetVisible, scrollToFeedbackTarget, waitForTargetRevealResync } from "../utils/locateFeedback.js";
28
- import { clearFeedbackDeepLinkFromUrl, parseFeedbackDeepLink } from "../utils/feedbackDeepLink.js";
29
- const MARKER_HOVER_LEAVE_MS = 250;
30
- const OVERLAY_HOVER_LEAVE_MS = 100;
31
- function getInitialDeepLinkFeedbackId() {
32
- if (typeof window === "undefined") {
33
- return null;
34
- }
35
- return parseFeedbackDeepLink()?.feedbackId ?? null;
36
- }
37
- import { findPickTargetByPoint, getSelectableTargets, isSameHoverTarget, resolveFeedbackDocumentAnchor, toFeedbackHoverSnapshot } from "../utils/dom.js";
38
- import { shouldInspectFontStyle } from "../utils/pickTargetInspect.js";
39
- import { applyPickProbeCompareMode, applyPickProbeValueDiff, capturePickProbeValues, formatSavedProbeEditsSummary, getProposedChanges } from "../utils/pickProbe.js";
40
- import { applySavedProbeEditsCompareMode, captureProbeOriginalSnapshot, captureSavedProbeDeletion, createSavedProbeEntry, restoreProbeElementFromSnapshot, findElementByProbeKey, getPickProbeElementKey, restoreProbeElementOriginal, restoreSavedProbeDeletion, } from "../utils/pickProbeSession.js";
41
- import { playPickTargetDeleteAnimation } from "../utils/pickTargetDeleteAnimation.js";
42
- import { applyProbeSessionActionBackward, applyProbeSessionActionForward } from "../utils/probeSessionHistory.js";
43
- import { getPickProbeLayoutMode } from "../utils/probeLayout.js";
44
- import { markerToTargetSnapshot } from "../utils/markerTarget.js";
45
- import { createInitialFieldValues, getFieldError, getFieldTags } from "../utils/fields.js";
46
- import { canEditReportCases, claimCaseAssignee, createReportCase, buildResolvedCasesUpdate, canActOnCase, getCaseAssigneeName, isValidFocusedCase, resolveDefaultFocusedCaseId, transferCaseAssignee, } from "../utils/reportCases.js";
47
- import { createReplyId } from "../utils/format.js";
48
- import { notifyFeedbackCreate, notifyFeedbackDelete, notifyFeedbackReply, notifyFeedbackUpdate, notifyGitHubIssueCreated } from "../utils/reportCallbacks.js";
49
- import { buildGitHubIssueStatusUpdate, buildGitHubIssueUpdate, canCreateGitHubIssueFromList, canCreateGitHubIssueOnCreate, isGitIssued } from "../utils/githubIntegration.js";
50
- import { buildPresentationViewers, resolveSessionActor } from "../utils/reportTeam.js";
51
- function resolveDefaultAuthorName(identify, authors, selfName) {
52
- if (identify?.name) {
53
- return identify.name;
54
- }
55
- return authors[0]?.name ?? selfName ?? "";
56
- }
57
- export function useReportState({ projectId, environment, appVersion, panelAppearance, tooltipAppearance, questionThreadDefault = "expanded", fields, authors = [], requireReviewerKey = false, shortcut: _shortcut, identify, onList, onListAll, onPanelBootstrap, onActivitySummary, onListReplies, onNavigate, onRevealTarget, onCreate, onCreateReply, onUpdate, onDelete, onEvent, onReply, github, routeKey, showFeedbackList, visibleShortcutKeys = false, initialLocale, messageOverrides, pixelsMode = "default", replyHistory, }) {
58
- const { appearance: activePanelAppearance, setAppearance: setPanelAppearance } = useAppearancePreference(PANEL_APPEARANCE_STORAGE_KEY, panelAppearance);
59
- const { appearance: activeTooltipAppearance, setAppearance: setTooltipAppearance } = useAppearancePreference(TOOLTIP_APPEARANCE_STORAGE_KEY, tooltipAppearance);
60
- const { showMarkerTargetPreview, setShowMarkerTargetPreview, toggleMarkerTargetPreview } = useMarkerTargetPreviewPreference();
61
- const { markerAppearance, setMarkerAppearance, setMarkerSize, setMarkerShape, setMarkerColors, setMarkerColor } = useMarkerAppearancePreference();
62
- const { typography, setTypography, setFontSize, setFontFamily } = useTypographyPreference();
63
- const { questionThreadDisplay, setQuestionThreadDisplay } = useQuestionThreadPreference(questionThreadDefault);
64
- const { panelRole, setPanelRole } = usePanelRolePreference();
65
- const { storedPreference, setPanelTabPreference, setVisibleTabs, resetTabsToRoleDefault, applyRoleDefaultTabs } = usePanelTabPreference();
66
- const { locale, setLocale } = useLocalePreference(initialLocale);
67
- const [localeMessagesReady, setLocaleMessagesReady] = useState(locale !== "ko");
68
- const messages = useMemo(() => getReportMessages(locale, messageOverrides), [locale, localeMessagesReady, messageOverrides]);
69
- useEffect(() => {
70
- if (locale !== "ko") {
71
- setLocaleMessagesReady(true);
72
- return;
73
- }
74
- let cancelled = false;
75
- setLocaleMessagesReady(false);
76
- void ensureReportLocaleMessages("ko").then(() => {
77
- if (!cancelled) {
78
- setLocaleMessagesReady(true);
79
- }
80
- });
81
- return () => {
82
- cancelled = true;
83
- };
84
- }, [locale]);
85
- useEffect(() => {
86
- setActiveReportMessages(messages);
87
- }, [messages]);
88
- const overlayRef = useRef(null);
89
- const searchInputRef = useRef(null);
90
- const hoveredElementRef = useRef(null);
91
- const selectedElementRef = useRef(null);
92
- const hoverLeaveTimeoutRef = useRef(null);
93
- const overlayHoverLeaveTimeoutRef = useRef(null);
94
- const [mode, setMode] = useState(() => (getInitialDeepLinkFeedbackId() ? "view" : "idle"));
95
- const [panelCollapsed, setPanelCollapsed] = useState(false);
96
- const [panelTab, setPanelTab] = useState(null);
97
- const panelExpanded = !panelCollapsed && mode !== "report";
98
- const fetchEnabled = panelExpanded || mode === "view";
99
- const tabAvailabilityContext = useMemo(() => ({
100
- showFeedbackList,
101
- canListAllFeedback: true,
102
- }), [showFeedbackList]);
103
- const visiblePanelTabs = useMemo(() => resolveVisibleTabs({ role: panelRole, preference: storedPreference, context: tabAvailabilityContext }), [panelRole, storedPreference, tabAvailabilityContext]);
104
- const roleTabPreset = useMemo(() => getPanelRoleTabPreset(panelRole), [panelRole]);
105
- const needsFullReportList = useMemo(() => {
106
- if (mode === "view") {
107
- return true;
108
- }
109
- if (!fetchEnabled) {
110
- return false;
111
- }
112
- if (!onPanelBootstrap) {
113
- return true;
114
- }
115
- if (panelTab === "feedback-list" || panelTab === "overview") {
116
- return true;
117
- }
118
- if (roleTabPreset.headerStatsScope === "all") {
119
- return true;
120
- }
121
- return visiblePanelTabs.some((tabId) => getPanelTabDefinition(tabId).needsFullReportList);
122
- }, [fetchEnabled, mode, onPanelBootstrap, panelTab, roleTabPreset.headerStatsScope, visiblePanelTabs]);
123
- const allReportsFetchEnabled = useMemo(() => {
124
- if (!fetchEnabled || !needsFullReportList) {
125
- return false;
126
- }
127
- const needsAllScopeTabs = ["overview", "my-tasks", "needs-attention", "project-health", "today-digest"];
128
- return roleTabPreset.headerStatsScope === "all" || visiblePanelTabs.some((tabId) => needsAllScopeTabs.includes(tabId));
129
- }, [fetchEnabled, needsFullReportList, roleTabPreset.headerStatsScope, visiblePanelTabs]);
130
- const listFetchEnabled = fetchEnabled && needsFullReportList;
131
- const bootstrapEnabled = fetchEnabled && panelExpanded && Boolean(onPanelBootstrap);
132
- const resolvedPanelAppearance = useResolvedAppearance(activePanelAppearance);
133
- const resolvedTooltipAppearance = useResolvedAppearance(activeTooltipAppearance);
134
- const isMobileViewport = useIsMobileViewport();
135
- const { canTransferFeedback, canListAllFeedback, currentPathname, listScope, setListScope, filters, setFilters, selectedReportId, setSelectedReportId, reports, currentPageReports, filteredReports, currentPageFilteredReports, allPageReports, allPageFilteredReports, routeDetailsStats, selectedReport, isError, isReportsLoading, isFetching, hasNextPage, isFetchingNextPage, fetchNextPage, isCreating, isUpdating, isDeleting, queryErrorMessage, refetch, createFeedback, updateFeedback, deleteFeedback, loadRepliesIfNeeded, createReply, usesCreateReply, replyHistoryByReportId, loadOlderReplies, goToOlderPaginationPage, goToNewerPaginationPage, } = useReportPersistence({
136
- projectId,
137
- environment,
138
- appVersion,
139
- fields,
140
- onList,
141
- onListAll,
142
- onListReplies,
143
- onCreate,
144
- onCreateReply,
145
- onUpdate,
146
- onDelete,
147
- routeKey,
148
- fetchEnabled,
149
- listFetchEnabled,
150
- allReportsFetchEnabled,
151
- replyHistory,
152
- });
153
- const bootstrapParams = useMemo(() => ({ pathname: currentPathname }), [currentPathname]);
154
- const { bootstrap: panelBootstrap } = usePanelBootstrap({
155
- enabled: bootstrapEnabled,
156
- params: bootstrapParams,
157
- fields,
158
- reports: currentPageReports,
159
- pathname: currentPathname,
160
- onPanelBootstrap,
161
- });
162
- const resolvedRouteDetailsStats = useMemo(() => panelBootstrap?.routeDetails ?? routeDetailsStats, [panelBootstrap, routeDetailsStats]);
163
- const eventCallbacks = useMemo(() => ({
164
- onEvent,
165
- onReply,
166
- }), [onEvent, onReply]);
167
- const { selfProfile, saveSelfProfile, markOnboardingComplete } = useSelfProfile(projectId, environment);
168
- const requiresReviewerKey = requireReviewerKey || authors.some((author) => Boolean(author.publicKey));
169
- const isPresentationMode = pixelsMode === "presentation";
170
- const { personalKey, publicKey, personalKeyRequired, personalKeyPendingRegistration, personalKeyCandidates, authorizedAuthors, issuePersonalKey, issueSelfKey, rotatePersonalKey, insertPersonalKey, clearPersonalKey, signPayload, } = usePersonalKey({
171
- enabled: isPresentationMode || !requiresReviewerKey || hasStoredPersonalKey(projectId, environment),
172
- requireKey: requiresReviewerKey,
173
- projectId,
174
- environment,
175
- identify,
176
- authors,
177
- });
178
- const activeIdentify = authorizedAuthors[0] ?? (selfProfile?.authorId && selfProfile.name ? { id: selfProfile.authorId, name: selfProfile.name } : undefined) ?? (personalKeyRequired ? undefined : identify);
179
- const presentationViewers = useMemo(() => buildPresentationViewers(identify, authors), [authors, identify]);
180
- const [presentationViewerId, setPresentationViewerId] = useState(null);
181
- const resolvedPresentationViewerId = useMemo(() => {
182
- if (!isPresentationMode || presentationViewers.length === 0) {
183
- return null;
184
- }
185
- if (presentationViewerId && presentationViewers.some((viewer) => viewer.id === presentationViewerId)) {
186
- return presentationViewerId;
187
- }
188
- return presentationViewers[0]?.id ?? null;
189
- }, [isPresentationMode, presentationViewerId, presentationViewers]);
190
- const authorSelectionLocked = Boolean(personalKey);
191
- const hasPersistedPersonalKey = hasStoredPersonalKey(projectId, environment);
192
- const isSelfAuthenticated = hasPersistedPersonalKey;
193
- const authDiagnostics = useMemo(() => {
194
- const parsedBundle = personalKey ? parsePrivateKeyBundle(personalKey) : null;
195
- const teamReviewer = parsedBundle ? authors.find((author) => author.id === parsedBundle.authorId) : null;
196
- const localAuthorName = (parsedBundle?.authorName ?? selfProfile?.name ?? "").trim();
197
- const expected = {
198
- projectId,
199
- environment: environment ?? "",
200
- authorId: teamReviewer?.id ?? null,
201
- authorName: teamReviewer?.name?.trim() || null,
202
- publicKey: teamReviewer?.publicKey?.trim() || null,
203
- };
204
- const actual = {
205
- projectId: parsedBundle?.projectId ?? null,
206
- environment: parsedBundle?.environment ?? "",
207
- authorId: parsedBundle?.authorId ?? null,
208
- authorName: localAuthorName || null,
209
- publicKey: parsedBundle ? serializePublicKey(parsedBundle.publicKey) : null,
210
- };
211
- const items = [
212
- { field: "projectId", expected: expected.projectId, actual: actual.projectId, matched: expected.projectId === actual.projectId },
213
- { field: "environment", expected: expected.environment, actual: actual.environment, matched: (expected.environment ?? "") === (actual.environment ?? "") },
214
- { field: "authorId", expected: expected.authorId, actual: actual.authorId, matched: expected.authorId === actual.authorId },
215
- {
216
- field: "authorName",
217
- expected: expected.authorName,
218
- actual: actual.authorName,
219
- matched: Boolean(expected.authorName && actual.authorName && expected.authorName === actual.authorName),
220
- },
221
- {
222
- field: "publicKey",
223
- expected: expected.publicKey,
224
- actual: actual.publicKey,
225
- matched: Boolean(expected.publicKey && actual.publicKey && publicKeysMatch(expected.publicKey, actual.publicKey)),
226
- },
227
- ];
228
- if (!requiresReviewerKey) {
229
- return { status: "disabled", reason: "reviewer-key-not-enforced", items, expected, actual };
230
- }
231
- if (!personalKey) {
232
- return { status: "failed", reason: "missing-personal-key", items, expected, actual };
233
- }
234
- if (!parsedBundle) {
235
- return { status: "failed", reason: "invalid-personal-key-format", items, expected, actual };
236
- }
237
- if (parsedBundle.projectId !== projectId) {
238
- return { status: "failed", reason: "project-mismatch", items, expected, actual };
239
- }
240
- if ((parsedBundle.environment ?? "") !== (environment ?? "")) {
241
- return { status: "failed", reason: "environment-mismatch", items, expected, actual };
242
- }
243
- if (!teamReviewer) {
244
- return { status: "failed", reason: "missing-team-author", items, expected, actual };
245
- }
246
- if (expected.authorName && actual.authorName && expected.authorName !== actual.authorName) {
247
- return { status: "failed", reason: "author-name-mismatch", items, expected, actual };
248
- }
249
- if (!teamReviewer.publicKey?.trim()) {
250
- return { status: "failed", reason: "missing-team-public-key", items, expected, actual };
251
- }
252
- if (!actual.publicKey || !publicKeysMatch(teamReviewer.publicKey, actual.publicKey)) {
253
- return { status: "failed", reason: "public-key-mismatch", items, expected, actual };
254
- }
255
- return { status: "matched", reason: "matched", items, expected, actual };
256
- }, [authors, environment, personalKey, projectId, requiresReviewerKey, selfProfile?.name]);
257
- const panelView = useMemo(() => {
258
- if (isPresentationMode || !requiresReviewerKey) {
259
- return "ready";
260
- }
261
- if (!hasPersistedPersonalKey) {
262
- return "onboarding";
263
- }
264
- if (selfProfile && !selfProfile.completed) {
265
- return "setup-complete";
266
- }
267
- const parsedBundle = personalKey ? parsePrivateKeyBundle(personalKey) : null;
268
- const teamReviewer = parsedBundle ? authors.find((author) => author.id === parsedBundle.authorId) : null;
269
- if (!teamReviewer) {
270
- return "setup-complete";
271
- }
272
- if (authDiagnostics.status === "matched") {
273
- return "ready";
274
- }
275
- return "key-issue";
276
- }, [authDiagnostics.status, authors, hasPersistedPersonalKey, isPresentationMode, personalKey, requiresReviewerKey, selfProfile]);
277
- useEffect(() => {
278
- if (selfProfile && !selfProfile.completed && hasPersistedPersonalKey && authorizedAuthors.length > 0) {
279
- markOnboardingComplete();
280
- }
281
- }, [authorizedAuthors.length, hasPersistedPersonalKey, markOnboardingComplete, selfProfile]);
282
- const completeOnboarding = useCallback(async ({ name }) => {
283
- const trimmedName = name.trim();
284
- const authorId = typeof crypto !== "undefined" && typeof crypto.randomUUID === "function" ? crypto.randomUUID() : `self-${Date.now()}-${Math.random().toString(16).slice(2)}`;
285
- const issued = await issueSelfKey(authorId, trimmedName);
286
- saveSelfProfile({ name: trimmedName, authorId, completed: false });
287
- return { ...issued, authorId };
288
- }, [issueSelfKey, saveSelfProfile]);
289
- const restoreFromBackup = useCallback(async (backupKey) => {
290
- const result = await insertPersonalKey(backupKey);
291
- if (!result.saved) {
292
- return { restored: false, reason: result.reason };
293
- }
294
- if (!requiresReviewerKey && !result.authorized) {
295
- return { restored: false, reason: "unauthorized" };
296
- }
297
- const authorId = getAuthorIdFromPrivateKey(backupKey);
298
- const restoredName = getAuthorNameFromPrivateKey(backupKey);
299
- saveSelfProfile({
300
- name: restoredName ?? "",
301
- authorId: authorId ?? "",
302
- completed: result.authorized || !requiresReviewerKey,
303
- });
304
- return { restored: true, name: restoredName, authorized: result.authorized };
305
- }, [insertPersonalKey, requiresReviewerKey, saveSelfProfile]);
306
- const skipOnboarding = useCallback(() => {
307
- markOnboardingComplete();
308
- }, [markOnboardingComplete]);
309
- const sessionActor = useMemo(() => resolveSessionActor({
310
- isPresentationMode,
311
- presentationViewers,
312
- presentationViewerId: resolvedPresentationViewerId,
313
- activeIdentify,
314
- }), [activeIdentify, isPresentationMode, presentationViewers, resolvedPresentationViewerId]);
315
- const signCreatePayload = async (payload) => {
316
- const auth = await signPayload("feedback:create", payload);
317
- return auth ? { ...payload, auth } : payload;
318
- };
319
- const signUpdatePayload = async (payload) => {
320
- const auth = await signPayload("feedback:update", payload);
321
- return auth ? { ...payload, auth } : payload;
322
- };
323
- const signReplyPayload = async (payload) => {
324
- const auth = await signPayload("reply:create", payload);
325
- return auth ? { ...payload, auth } : payload;
326
- };
327
- const applyGitHubIssueUpdate = async (report, result) => {
328
- if (usesCreateReply) {
329
- const updatedFeedback = await updateFeedback(report.id, await signUpdatePayload(buildGitHubIssueStatusUpdate(report, result)));
330
- await createReply(report.id, await signReplyPayload({
331
- message: messages.resolution.gitIssuedMessage,
332
- status: "suggested",
333
- author_type: "system",
334
- }));
335
- return updatedFeedback;
336
- }
337
- return updateFeedback(report.id, await signUpdatePayload(buildGitHubIssueUpdate(report, result, messages.resolution.gitIssuedMessage)));
338
- };
339
- const [showTargetPreview, setShowTargetPreview] = useState(false);
340
- const [selectableTargets, setSelectableTargets] = useState([]);
341
- const [errorMessage, setErrorMessage] = useState("");
342
- const [draft, setDraft] = useState(null);
343
- const [hoveredTarget, setHoveredTarget] = useState(null);
344
- const [hoverPointer, setHoverPointer] = useState(null);
345
- const [selectedTarget, setSelectedTarget] = useState(null);
346
- const [pickProbeOpen, setPickProbeOpen] = useState(false);
347
- const [pickProbeBaseline, setPickProbeBaseline] = useState(null);
348
- const [pickProbeValues, setPickProbeValues] = useState(null);
349
- const [pickProbeSupportsTextFields, setPickProbeSupportsTextFields] = useState(false);
350
- const [pickProbeLayoutMode, setPickProbeLayoutMode] = useState(null);
351
- const [pickProbeCompareMode, setPickProbeCompareModeState] = useState("after");
352
- const [pickTargetContextMenu, setPickTargetContextMenu] = useState(null);
353
- const [contextMenuElementKey, setContextMenuElementKey] = useState(null);
354
- const [savedProbeEdits, setSavedProbeEdits] = useState({});
355
- const [savedProbeDeletions, setSavedProbeDeletions] = useState([]);
356
- const savedProbeDeletionsRef = useRef(savedProbeDeletions);
357
- savedProbeDeletionsRef.current = savedProbeDeletions;
358
- const [probeSessionHistoryState, setProbeSessionHistoryState] = useState({ actions: [], index: -1 });
359
- const [savedProbeCompareMode, setSavedProbeCompareModeState] = useState("after");
360
- const pickProbeRestoreRef = useRef(null);
361
- const pickProbeOriginalSnapshotRef = useRef(null);
362
- const pickProbeElementKeyRef = useRef(null);
363
- const draftElementRef = useRef(null);
364
- const contextMenuElementRef = useRef(null);
365
- const [markers, setMarkers] = useState([]);
366
- const [hoveredMarkerId, setHoveredMarkerId] = useState(null);
367
- const [activeReplyReportId, setActiveReplyReportId] = useState(null);
368
- const [replyDraft, setReplyDraft] = useState("");
369
- const [replySubmitAsQuestion, setReplySubmitAsQuestion] = useState(false);
370
- const [draftAuthorName, setDraftAuthorName] = useState(() => resolveDefaultAuthorName(activeIdentify, authorizedAuthors, selfProfile?.name));
371
- const [replyAuthorName, setReplyAuthorName] = useState(() => resolveDefaultAuthorName(activeIdentify, authorizedAuthors, selfProfile?.name));
372
- const applyPresentationViewer = useCallback(async (viewerId) => {
373
- if (!isPresentationMode) {
374
- return;
375
- }
376
- const viewer = presentationViewers.find((item) => item.id === viewerId) ?? presentationViewers[0];
377
- if (!viewer) {
378
- return;
379
- }
380
- setPresentationViewerId(viewer.id);
381
- saveSelfProfile({
382
- name: viewer.name,
383
- authorId: viewer.id,
384
- completed: true,
385
- });
386
- if (viewer.privateKey) {
387
- await insertPersonalKey(viewer.privateKey);
388
- return;
389
- }
390
- clearPersonalKey();
391
- }, [clearPersonalKey, insertPersonalKey, isPresentationMode, presentationViewers, saveSelfProfile]);
392
- useEffect(() => {
393
- if (!sessionActor?.name) {
394
- return;
395
- }
396
- setReplyAuthorName(sessionActor.name);
397
- setDraftAuthorName(sessionActor.name);
398
- }, [sessionActor?.id, sessionActor?.name]);
399
- const setDraftAuthorNameSafe = useCallback((name) => {
400
- if (authorSelectionLocked && sessionActor?.name) {
401
- setDraftAuthorName(sessionActor.name);
402
- return;
403
- }
404
- setDraftAuthorName(name);
405
- }, [authorSelectionLocked, sessionActor?.name]);
406
- const setReplyAuthorNameSafe = useCallback((name) => {
407
- if (authorSelectionLocked && sessionActor?.name) {
408
- setReplyAuthorName(sessionActor.name);
409
- return;
410
- }
411
- setReplyAuthorName(name);
412
- }, [authorSelectionLocked, sessionActor?.name]);
413
- const [isSubmittingReply, setIsSubmittingReply] = useState(false);
414
- const [isClaimingAssignee, setIsClaimingAssignee] = useState(false);
415
- const [pendingComposer, setPendingComposer] = useState(null);
416
- const [confirmAuthorName, setConfirmAuthorName] = useState("");
417
- const [showConfirmAuthorSelect, setShowConfirmAuthorSelect] = useState(false);
418
- const pendingLocateReportIdRef = useRef(null);
419
- const pendingDeepLinkFeedbackIdRef = useRef(getInitialDeepLinkFeedbackId());
420
- const deepLinkHandledRef = useRef(false);
421
- const [editingReportId, setEditingReportId] = useState(null);
422
- const [editableDraft, setEditableDraft] = useState(null);
423
- const [creatingGitHubIssueId, setCreatingGitHubIssueId] = useState(null);
424
- const [caseEditReportId, setCaseEditReportId] = useState(null);
425
- const [caseEditDraft, setCaseEditDraft] = useState(null);
426
- const [focusedCaseId, setFocusedCaseId] = useState(null);
427
- const canCreateGitHubIssueFromListValue = useMemo(() => canCreateGitHubIssueFromList(github), [github]);
428
- const canCreateGitHubIssueOnCreateValue = useMemo(() => canCreateGitHubIssueOnCreate(github), [github]);
429
- const activeReplyAnchor = useMemo(() => resolveTooltipAnchor(markers, activeReplyReportId), [activeReplyReportId, markers]);
430
- const activeReplyReport = activeReplyAnchor?.report ?? null;
431
- const tooltipAnchor = useMemo(() => {
432
- const hoveredAnchor = resolveTooltipAnchor(markers, hoveredMarkerId);
433
- if (!activeReplyReportId) {
434
- return hoveredAnchor;
435
- }
436
- if (hoveredMarkerId && hoveredMarkerId !== activeReplyReportId) {
437
- return hoveredAnchor;
438
- }
439
- return activeReplyAnchor ?? hoveredAnchor;
440
- }, [activeReplyAnchor, activeReplyReportId, hoveredMarkerId, markers]);
441
- const tooltipReport = tooltipAnchor?.report ?? null;
442
- const tooltipFieldTags = useMemo(() => (tooltipReport ? getFieldTags(fields, tooltipReport.field_values) : []), [fields, tooltipReport]);
443
- const roleStatsReports = useMemo(() => {
444
- if (roleTabPreset.headerStatsScope !== "all") {
445
- return currentPageFilteredReports;
446
- }
447
- if (listScope === "all") {
448
- return filteredReports;
449
- }
450
- if (allPageFilteredReports.length > 0) {
451
- return allPageFilteredReports;
452
- }
453
- return currentPageFilteredReports;
454
- }, [allPageFilteredReports, currentPageFilteredReports, filteredReports, listScope, roleTabPreset.headerStatsScope]);
455
- const targetStats = useMemo(() => {
456
- if (panelBootstrap?.stats) {
457
- return panelBootstrap.stats;
458
- }
459
- return buildPanelStats(currentPageFilteredReports);
460
- }, [currentPageFilteredReports, panelBootstrap]);
461
- const roleStatItems = useMemo(() => buildPanelRoleStats({
462
- role: panelRole,
463
- reports: roleStatsReports,
464
- actorName: sessionActor?.name ?? null,
465
- fallbackStats: targetStats,
466
- messages,
467
- }), [panelRole, roleStatsReports, sessionActor?.name, targetStats, messages]);
468
- const listScopeInitializedRef = useRef(false);
469
- useEffect(() => {
470
- if (listScopeInitializedRef.current) {
471
- return;
472
- }
473
- if (storedPreference?.customized) {
474
- listScopeInitializedRef.current = true;
475
- return;
476
- }
477
- setListScope(roleTabPreset.defaultListScope);
478
- listScopeInitializedRef.current = true;
479
- }, [roleTabPreset.defaultListScope, setListScope, storedPreference?.customized]);
480
- useEffect(() => {
481
- if (!panelTab) {
482
- return;
483
- }
484
- if (panelTab === "settings" || panelTab === "command") {
485
- return;
486
- }
487
- if (!isUserSelectablePanelTab(panelTab)) {
488
- return;
489
- }
490
- if (visiblePanelTabs.includes(panelTab)) {
491
- return;
492
- }
493
- setPanelTab(resolveDefaultPanelTab(panelRole, visiblePanelTabs));
494
- }, [panelRole, panelTab, visiblePanelTabs]);
495
- const resolvedTabAvailabilityContext = useMemo(() => ({
496
- showFeedbackList,
497
- canListAllFeedback,
498
- }), [canListAllFeedback, showFeedbackList]);
499
- const visiblePanelTabLabels = useMemo(() => {
500
- const labels = {};
501
- for (const tabId of visiblePanelTabs) {
502
- labels[tabId] = messages.panel[getPanelTabDefinition(tabId).labelKey];
503
- }
504
- return labels;
505
- }, [messages.panel, visiblePanelTabs]);
506
- const visiblePanelTabsSummary = useMemo(() => formatVisibleTabSummary(visiblePanelTabs, visiblePanelTabLabels), [visiblePanelTabLabels, visiblePanelTabs]);
507
- const setVisiblePanelTabs = useCallback((nextTabs) => {
508
- setVisibleTabs(nextTabs, resolvedTabAvailabilityContext, true);
509
- }, [resolvedTabAvailabilityContext, setVisibleTabs]);
510
- const resetVisibleTabsToRoleDefault = useCallback(() => {
511
- resetTabsToRoleDefault(panelRole, resolvedTabAvailabilityContext);
512
- setListScope(getPanelRoleTabPreset(panelRole).defaultListScope);
513
- }, [panelRole, resetTabsToRoleDefault, resolvedTabAvailabilityContext, setListScope]);
514
- const applyRoleDefaultTabsForOnboarding = useCallback((role) => {
515
- applyRoleDefaultTabs(role, resolvedTabAvailabilityContext);
516
- }, [applyRoleDefaultTabs, resolvedTabAvailabilityContext]);
517
- const savePanelTabPreference = useCallback((preference) => {
518
- setPanelTabPreference(preference);
519
- setListScope(getPanelRoleTabPreset(panelRole).defaultListScope);
520
- }, [panelRole, setListScope, setPanelTabPreference]);
521
- const authorizedAuthorId = authorizedAuthors[0]?.id ?? null;
522
- const activeIdentifyId = activeIdentify?.id ?? null;
523
- const activeIdentifyName = activeIdentify?.name ?? null;
524
- useEffect(() => {
525
- setDraft(null);
526
- setErrorMessage("");
527
- setHoveredTarget(null);
528
- setSelectedTarget(null);
529
- setHoveredMarkerId(null);
530
- setActiveReplyReportId(null);
531
- setReplyDraft("");
532
- setPendingComposer(null);
533
- setShowConfirmAuthorSelect(false);
534
- setConfirmAuthorName("");
535
- setDraftAuthorName(sessionActor?.name ?? resolveDefaultAuthorName(activeIdentify, authorizedAuthors, selfProfile?.name));
536
- if (!isPresentationMode) {
537
- setReplyAuthorName(sessionActor?.name ?? resolveDefaultAuthorName(activeIdentify, authorizedAuthors, selfProfile?.name));
538
- }
539
- setEditingReportId(null);
540
- setEditableDraft(null);
541
- if (mode !== "idle") {
542
- setShowTargetPreview(false);
543
- }
544
- hoveredElementRef.current = null;
545
- selectedElementRef.current = null;
546
- if (hoverLeaveTimeoutRef.current) {
547
- window.clearTimeout(hoverLeaveTimeoutRef.current);
548
- hoverLeaveTimeoutRef.current = null;
549
- }
550
- if (overlayHoverLeaveTimeoutRef.current) {
551
- window.clearTimeout(overlayHoverLeaveTimeoutRef.current);
552
- overlayHoverLeaveTimeoutRef.current = null;
553
- }
554
- }, [currentPathname, mode, activeIdentifyId, activeIdentifyName, authorizedAuthorId, isPresentationMode, sessionActor?.name, selfProfile?.authorId, selfProfile?.name]);
555
- useEffect(() => {
556
- if (!isPresentationMode || presentationViewers.length === 0 || !resolvedPresentationViewerId) {
557
- return;
558
- }
559
- void applyPresentationViewer(resolvedPresentationViewerId);
560
- }, [applyPresentationViewer, isPresentationMode, presentationViewers.length, resolvedPresentationViewerId]);
561
- useEffect(() => {
562
- setShowTargetPreview(false);
563
- }, [currentPathname]);
564
- useEffect(() => {
565
- return () => {
566
- if (hoverLeaveTimeoutRef.current) {
567
- window.clearTimeout(hoverLeaveTimeoutRef.current);
568
- }
569
- if (overlayHoverLeaveTimeoutRef.current) {
570
- window.clearTimeout(overlayHoverLeaveTimeoutRef.current);
571
- }
572
- };
573
- }, []);
574
- useEffect(() => {
575
- const syncSelectableTargets = () => {
576
- setSelectableTargets(getSelectableTargets());
577
- };
578
- syncSelectableTargets();
579
- window.addEventListener("scroll", syncSelectableTargets, { passive: true, capture: true });
580
- window.addEventListener("resize", syncSelectableTargets);
581
- return () => {
582
- window.removeEventListener("scroll", syncSelectableTargets, { capture: true });
583
- window.removeEventListener("resize", syncSelectableTargets);
584
- };
585
- }, [currentPathname]);
586
- useEffect(() => {
587
- if (!showTargetPreview) {
588
- return;
589
- }
590
- const syncPreviewRects = () => {
591
- setSelectableTargets(getSelectableTargets());
592
- };
593
- window.addEventListener("scroll", syncPreviewRects, { passive: true, capture: true });
594
- window.addEventListener("resize", syncPreviewRects);
595
- return () => {
596
- window.removeEventListener("scroll", syncPreviewRects, { capture: true });
597
- window.removeEventListener("resize", syncPreviewRects);
598
- };
599
- }, [showTargetPreview]);
600
- const syncMarkers = useCallback(() => {
601
- setMarkers(currentPageFilteredReports.map((report) => getMarkerFromReport(report, window.scrollY)));
602
- }, [currentPageFilteredReports, markerAppearance.size]);
603
- const activeMarkerReportId = useMemo(() => {
604
- if (activeReplyReportId) {
605
- return activeReplyReportId;
606
- }
607
- if (hoveredMarkerId) {
608
- return hoveredMarkerId;
609
- }
610
- return null;
611
- }, [activeReplyReportId, hoveredMarkerId]);
612
- const activeMarkerTarget = useMemo(() => {
613
- if (mode === "report") {
614
- return null;
615
- }
616
- if (!activeMarkerReportId) {
617
- return null;
618
- }
619
- const marker = markers.find((item) => item.report.id === activeMarkerReportId);
620
- if (!marker) {
621
- return null;
622
- }
623
- return markerToTargetSnapshot(marker);
624
- }, [activeMarkerReportId, markers, mode]);
625
- const markerPreviewTargets = useMemo(() => {
626
- if (!showMarkerTargetPreview) {
627
- return [];
628
- }
629
- return markers.flatMap((marker) => {
630
- const snapshot = markerToTargetSnapshot(marker);
631
- if (!snapshot) {
632
- return [];
633
- }
634
- if (activeMarkerTarget && snapshot.id === activeMarkerTarget.id) {
635
- return [];
636
- }
637
- return [snapshot];
638
- });
639
- }, [activeMarkerTarget, markers, showMarkerTargetPreview]);
640
- const statusText = useMemo(() => {
641
- if (mode === "report") {
642
- const focusTarget = selectedTarget ?? hoveredTarget;
643
- if (!focusTarget) {
644
- return messages.statusText.reportReady;
645
- }
646
- if (focusTarget.isTagged) {
647
- const typeLabel = focusTarget.type === "item" ? messages.statusText.selectedItem : messages.statusText.selectedGroup;
648
- return `${typeLabel}\n${focusTarget.id}`;
649
- }
650
- return `${messages.statusText.selectedUntaggedTarget}\n${focusTarget.suggestedReportId ?? focusTarget.id}`;
651
- }
652
- if (mode === "view") {
653
- return isFetching ? messages.statusText.loadingFeedback : messages.statusText.ready;
654
- }
655
- if (showTargetPreview) {
656
- return messages.statusText.showingSelectableTargets(selectableTargets.length);
657
- }
658
- if (showMarkerTargetPreview) {
659
- return messages.statusText.showingMarkerTargets(markerPreviewTargets.length + (activeMarkerTarget ? 1 : 0));
660
- }
661
- if (selectableTargets.length === 0) {
662
- return messages.statusText.noSelectableTargets;
663
- }
664
- return messages.statusText.ready;
665
- }, [
666
- activeMarkerTarget,
667
- filteredReports.length,
668
- hoveredTarget,
669
- isFetching,
670
- markerPreviewTargets.length,
671
- messages.statusText,
672
- mode,
673
- selectableTargets.length,
674
- selectedTarget,
675
- showMarkerTargetPreview,
676
- showTargetPreview,
677
- ]);
678
- useEffect(() => {
679
- const shouldSyncMarkers = mode === "view" || showMarkerTargetPreview;
680
- if (!shouldSyncMarkers) {
681
- setMarkers([]);
682
- return;
683
- }
684
- let cancelled = false;
685
- const runSync = () => {
686
- if (!cancelled) {
687
- syncMarkers();
688
- }
689
- };
690
- runSync();
691
- void waitForTargetRevealResync().then(runSync);
692
- let mutationSyncTimeout = null;
693
- const scheduleMutationSync = () => {
694
- if (mutationSyncTimeout !== null) {
695
- window.clearTimeout(mutationSyncTimeout);
696
- }
697
- mutationSyncTimeout = window.setTimeout(() => {
698
- mutationSyncTimeout = null;
699
- runSync();
700
- }, 50);
701
- };
702
- const mutationObserver = new MutationObserver((mutations) => {
703
- if (mutations.some((mutation) => mutation.type === "attributes" || mutation.type === "childList")) {
704
- scheduleMutationSync();
705
- }
706
- });
707
- mutationObserver.observe(document.body, {
708
- attributes: true,
709
- attributeFilter: ["class", "style", "aria-hidden"],
710
- childList: true,
711
- subtree: true,
712
- });
713
- window.addEventListener("scroll", syncMarkers, { passive: true, capture: true });
714
- window.addEventListener("resize", syncMarkers);
715
- return () => {
716
- cancelled = true;
717
- if (mutationSyncTimeout !== null) {
718
- window.clearTimeout(mutationSyncTimeout);
719
- }
720
- mutationObserver.disconnect();
721
- window.removeEventListener("scroll", syncMarkers, { capture: true });
722
- window.removeEventListener("resize", syncMarkers);
723
- };
724
- }, [currentPathname, mode, showMarkerTargetPreview, syncMarkers]);
725
- useEffect(() => {
726
- if (!showMarkerTargetPreview) {
727
- return;
728
- }
729
- const syncPreviewRects = () => {
730
- syncMarkers();
731
- };
732
- window.addEventListener("scroll", syncPreviewRects, { passive: true, capture: true });
733
- window.addEventListener("resize", syncPreviewRects);
734
- return () => {
735
- window.removeEventListener("scroll", syncPreviewRects, { capture: true });
736
- window.removeEventListener("resize", syncPreviewRects);
737
- };
738
- }, [showMarkerTargetPreview, syncMarkers]);
739
- const prepareFeedbackLocation = useCallback(async (report) => {
740
- const targetElement = getFeedbackTargetElement(report);
741
- if (targetElement && isFeedbackTargetVisible(targetElement)) {
742
- scrollToFeedbackTarget(report);
743
- return;
744
- }
745
- let revealed = false;
746
- if (onRevealTarget) {
747
- try {
748
- revealed = Boolean(await onRevealTarget(report));
749
- }
750
- catch {
751
- revealed = false;
752
- }
753
- }
754
- if (revealed) {
755
- await waitForTargetRevealResync();
756
- syncMarkers();
757
- }
758
- scrollToFeedbackTarget(report);
759
- }, [onRevealTarget, syncMarkers]);
760
- useEffect(() => {
761
- if (mode !== "report") {
762
- return;
763
- }
764
- const syncTargetRects = () => {
765
- setHoveredTarget(toFeedbackHoverSnapshot(hoveredElementRef.current));
766
- setSelectedTarget(toFeedbackHoverSnapshot(selectedElementRef.current));
767
- };
768
- window.addEventListener("scroll", syncTargetRects, { passive: true, capture: true });
769
- window.addEventListener("resize", syncTargetRects);
770
- return () => {
771
- window.removeEventListener("scroll", syncTargetRects, { capture: true });
772
- window.removeEventListener("resize", syncTargetRects);
773
- };
774
- }, [mode]);
775
- useEffect(() => {
776
- if (hoveredMarkerId && !markers.some((marker) => marker.report.id === hoveredMarkerId)) {
777
- setHoveredMarkerId(null);
778
- }
779
- }, [hoveredMarkerId, markers]);
780
- // markers (points, tooltip, reply)
781
- const clearHoverLeaveTimeout = () => {
782
- if (hoverLeaveTimeoutRef.current) {
783
- window.clearTimeout(hoverLeaveTimeoutRef.current);
784
- hoverLeaveTimeoutRef.current = null;
785
- }
786
- };
787
- const scheduleHoverLeave = (markerId) => {
788
- clearHoverLeaveTimeout();
789
- hoverLeaveTimeoutRef.current = window.setTimeout(() => {
790
- setHoveredMarkerId((current) => (current === markerId ? null : current));
791
- hoverLeaveTimeoutRef.current = null;
792
- }, MARKER_HOVER_LEAVE_MS);
793
- };
794
- const clearOverlayHoverLeaveTimeout = () => {
795
- if (overlayHoverLeaveTimeoutRef.current) {
796
- window.clearTimeout(overlayHoverLeaveTimeoutRef.current);
797
- overlayHoverLeaveTimeoutRef.current = null;
798
- }
799
- };
800
- const scheduleOverlayHoverLeave = () => {
801
- if (overlayHoverLeaveTimeoutRef.current) {
802
- return;
803
- }
804
- overlayHoverLeaveTimeoutRef.current = window.setTimeout(() => {
805
- if (!hoveredElementRef.current) {
806
- setHoveredTarget(null);
807
- setHoverPointer(null);
808
- }
809
- overlayHoverLeaveTimeoutRef.current = null;
810
- }, OVERLAY_HOVER_LEAVE_MS);
811
- };
812
- const refreshSelectedTargetSnapshot = useCallback(() => {
813
- const element = selectedElementRef.current;
814
- if (!element) {
815
- return;
816
- }
817
- const snapshot = toFeedbackHoverSnapshot(element);
818
- if (!snapshot) {
819
- return;
820
- }
821
- setSelectedTarget(snapshot);
822
- setHoveredTarget(snapshot);
823
- }, []);
824
- const closePickProbePanelOnly = useCallback(() => {
825
- setPickProbeOpen(false);
826
- setPickProbeBaseline(null);
827
- setPickProbeValues(null);
828
- setPickProbeSupportsTextFields(false);
829
- setPickProbeLayoutMode(null);
830
- setPickProbeCompareModeState("after");
831
- pickProbeElementKeyRef.current = null;
832
- }, []);
833
- const resetPickProbeState = useCallback(() => {
834
- closePickProbePanelOnly();
835
- }, [closePickProbePanelOnly]);
836
- const revertSavedProbeEdit = useCallback((elementKey) => {
837
- setSavedProbeEdits((current) => {
838
- const entry = current[elementKey];
839
- if (!entry) {
840
- return current;
841
- }
842
- const element = findElementByProbeKey(elementKey);
843
- if (element) {
844
- restoreProbeElementOriginal(element, entry);
845
- }
846
- const next = { ...current };
847
- delete next[elementKey];
848
- return next;
849
- });
850
- if (pickProbeElementKeyRef.current === elementKey) {
851
- pickProbeRestoreRef.current = null;
852
- pickProbeOriginalSnapshotRef.current = null;
853
- closePickProbePanelOnly();
854
- }
855
- }, [closePickProbePanelOnly]);
856
- const pushProbeSessionAction = useCallback((action) => {
857
- setProbeSessionHistoryState((current) => {
858
- const actions = current.actions.slice(0, current.index + 1);
859
- actions.push(action);
860
- return {
861
- actions,
862
- index: actions.length - 1,
863
- };
864
- });
865
- }, []);
866
- const undoProbeSessionAction = useCallback(() => {
867
- setProbeSessionHistoryState((current) => {
868
- if (current.index < 0) {
869
- return current;
870
- }
871
- const action = current.actions[current.index];
872
- setSavedProbeEdits((edits) => {
873
- const next = applyProbeSessionActionBackward(action, {
874
- edits,
875
- deletions: savedProbeDeletionsRef.current,
876
- });
877
- setSavedProbeDeletions(next.deletions);
878
- return next.edits;
879
- });
880
- return {
881
- actions: current.actions,
882
- index: current.index - 1,
883
- };
884
- });
885
- }, []);
886
- const redoProbeSessionAction = useCallback(() => {
887
- setProbeSessionHistoryState((current) => {
888
- if (current.index >= current.actions.length - 1) {
889
- return current;
890
- }
891
- const action = current.actions[current.index + 1];
892
- setSavedProbeEdits((edits) => {
893
- const next = applyProbeSessionActionForward(action, {
894
- edits,
895
- deletions: savedProbeDeletionsRef.current,
896
- });
897
- setSavedProbeDeletions(next.deletions);
898
- return next.edits;
899
- });
900
- return {
901
- actions: current.actions,
902
- index: current.index + 1,
903
- };
904
- });
905
- }, []);
906
- const revertAllSavedProbeEdits = useCallback(() => {
907
- setProbeSessionHistoryState({ actions: [], index: -1 });
908
- setSavedProbeDeletions((deletions) => {
909
- for (const entry of [...deletions].reverse()) {
910
- restoreSavedProbeDeletion(entry);
911
- }
912
- return [];
913
- });
914
- setSavedProbeEdits((current) => {
915
- for (const entry of Object.values(current)) {
916
- const element = findElementByProbeKey(entry.elementKey);
917
- if (element) {
918
- restoreProbeElementOriginal(element, entry);
919
- }
920
- }
921
- return {};
922
- });
923
- setSavedProbeCompareModeState("after");
924
- }, []);
925
- const canUndoProbeSession = probeSessionHistoryState.index >= 0;
926
- const canRedoProbeSession = probeSessionHistoryState.index < probeSessionHistoryState.actions.length - 1;
927
- const hasProbeSessionChanges = useMemo(() => probeSessionHistoryState.index >= 0, [probeSessionHistoryState.index]);
928
- const setSavedProbeCompareMode = useCallback((compareMode) => {
929
- setSavedProbeCompareModeState(compareMode);
930
- setSavedProbeEdits((current) => {
931
- applySavedProbeEditsCompareMode(current, compareMode);
932
- return current;
933
- });
934
- }, []);
935
- const pickProbeChanges = useMemo(() => {
936
- if (!pickProbeBaseline || !pickProbeValues) {
937
- return [];
938
- }
939
- return getProposedChanges(pickProbeBaseline, pickProbeValues, pickProbeSupportsTextFields, pickProbeLayoutMode);
940
- }, [pickProbeBaseline, pickProbeLayoutMode, pickProbeSupportsTextFields, pickProbeValues]);
941
- const pickProbeHasEdits = pickProbeChanges.length > 0;
942
- const persistPickProbeEdits = useCallback((options) => {
943
- const element = selectedElementRef.current;
944
- const values = options?.values ?? pickProbeValues;
945
- if (!element || !pickProbeBaseline || !values) {
946
- if (options?.closePanel) {
947
- closePickProbePanelOnly();
948
- }
949
- return;
950
- }
951
- const elementKey = getPickProbeElementKey(element);
952
- const changes = getProposedChanges(pickProbeBaseline, values, pickProbeSupportsTextFields, pickProbeLayoutMode);
953
- const existing = savedProbeEdits[elementKey];
954
- if (changes.length === 0) {
955
- if (existing) {
956
- pushProbeSessionAction({
957
- kind: "style-revert",
958
- elementKey,
959
- revertedEntry: existing,
960
- });
961
- setSavedProbeEdits((current) => {
962
- const next = { ...current };
963
- delete next[elementKey];
964
- return next;
965
- });
966
- }
967
- if (options?.closePanel) {
968
- pickProbeRestoreRef.current = null;
969
- pickProbeOriginalSnapshotRef.current = null;
970
- closePickProbePanelOnly();
971
- }
972
- refreshSelectedTargetSnapshot();
973
- return;
974
- }
975
- const previousEntry = existing ?? null;
976
- const originalSnapshot = pickProbeOriginalSnapshotRef.current;
977
- applyPickProbeCompareMode(element, savedProbeCompareMode, pickProbeBaseline, values);
978
- const nextEntry = createSavedProbeEntry(elementKey, pickProbeBaseline, values, originalSnapshot?.style ?? pickProbeRestoreRef.current?.style ?? null, originalSnapshot?.textContent ?? pickProbeRestoreRef.current?.textContent ?? pickProbeBaseline.textContent, existing, originalSnapshot?.innerHTML ?? null, originalSnapshot?.inputValue ?? null);
979
- const appliedChanged = !existing || getProposedChanges(existing.applied, values, pickProbeSupportsTextFields, pickProbeLayoutMode).length > 0;
980
- setSavedProbeEdits((current) => ({
981
- ...current,
982
- [elementKey]: nextEntry,
983
- }));
984
- if (appliedChanged) {
985
- pushProbeSessionAction({
986
- kind: "style-apply",
987
- elementKey,
988
- previousEntry,
989
- nextEntry,
990
- });
991
- }
992
- if (options?.closePanel) {
993
- pickProbeRestoreRef.current = null;
994
- pickProbeOriginalSnapshotRef.current = null;
995
- closePickProbePanelOnly();
996
- }
997
- refreshSelectedTargetSnapshot();
998
- }, [
999
- closePickProbePanelOnly,
1000
- pickProbeBaseline,
1001
- pickProbeLayoutMode,
1002
- pickProbeSupportsTextFields,
1003
- pickProbeValues,
1004
- pushProbeSessionAction,
1005
- refreshSelectedTargetSnapshot,
1006
- savedProbeCompareMode,
1007
- savedProbeEdits,
1008
- ]);
1009
- const commitPickProbeEdits = useCallback(() => {
1010
- persistPickProbeEdits({ closePanel: true });
1011
- }, [persistPickProbeEdits]);
1012
- const openPickProbe = useCallback(() => {
1013
- const element = selectedElementRef.current;
1014
- if (!element) {
1015
- return;
1016
- }
1017
- if (pickProbeOpen) {
1018
- closePickProbePanelOnly();
1019
- }
1020
- const elementKey = getPickProbeElementKey(element);
1021
- const saved = savedProbeEdits[elementKey];
1022
- pickProbeElementKeyRef.current = elementKey;
1023
- const supportsTextFields = shouldInspectFontStyle(element);
1024
- const layoutMode = getPickProbeLayoutMode(element);
1025
- setPickProbeSupportsTextFields(supportsTextFields);
1026
- setPickProbeLayoutMode(layoutMode);
1027
- const freshBaseline = capturePickProbeValues(element);
1028
- const sessionSnapshot = captureProbeOriginalSnapshot(element);
1029
- pickProbeOriginalSnapshotRef.current = sessionSnapshot;
1030
- pickProbeRestoreRef.current = {
1031
- style: sessionSnapshot.style,
1032
- textContent: sessionSnapshot.textContent,
1033
- inputValue: sessionSnapshot.inputValue,
1034
- };
1035
- if (saved) {
1036
- applyPickProbeCompareMode(element, savedProbeCompareMode, saved.baseline, saved.applied);
1037
- setPickProbeBaseline({ ...freshBaseline, ...saved.baseline });
1038
- setPickProbeValues({ ...freshBaseline, ...saved.applied });
1039
- }
1040
- else {
1041
- const baseline = capturePickProbeValues(element);
1042
- setPickProbeBaseline(baseline);
1043
- setPickProbeValues(baseline);
1044
- }
1045
- setPickProbeCompareModeState("after");
1046
- setPickProbeOpen(true);
1047
- refreshSelectedTargetSnapshot();
1048
- }, [closePickProbePanelOnly, pickProbeOpen, refreshSelectedTargetSnapshot, savedProbeCompareMode, savedProbeEdits]);
1049
- const closePickProbe = useCallback(() => {
1050
- resetPickProbeState();
1051
- }, [resetPickProbeState]);
1052
- const closePickTargetContextMenu = useCallback(() => {
1053
- setPickTargetContextMenu(null);
1054
- setContextMenuElementKey(null);
1055
- }, []);
1056
- const handlePickTargetRevert = useCallback(() => {
1057
- const elementKey = contextMenuElementKey;
1058
- closePickTargetContextMenu();
1059
- if (!elementKey) {
1060
- return;
1061
- }
1062
- const entry = savedProbeEdits[elementKey];
1063
- if (!entry) {
1064
- return;
1065
- }
1066
- revertSavedProbeEdit(elementKey);
1067
- pushProbeSessionAction({
1068
- kind: "style-revert",
1069
- elementKey,
1070
- revertedEntry: entry,
1071
- });
1072
- }, [closePickTargetContextMenu, contextMenuElementKey, pushProbeSessionAction, revertSavedProbeEdit, savedProbeEdits]);
1073
- const handlePickTargetEdit = useCallback(() => {
1074
- const element = contextMenuElementRef.current;
1075
- closePickTargetContextMenu();
1076
- if (!element) {
1077
- return;
1078
- }
1079
- if (pickProbeOpen) {
1080
- resetPickProbeState();
1081
- }
1082
- selectedElementRef.current = element;
1083
- hoveredElementRef.current = element;
1084
- const snapshot = toFeedbackHoverSnapshot(element);
1085
- if (snapshot) {
1086
- setSelectedTarget(snapshot);
1087
- }
1088
- openPickProbe();
1089
- }, [closePickTargetContextMenu, openPickProbe, pickProbeOpen, resetPickProbeState]);
1090
- const handlePickTargetDelete = useCallback(() => {
1091
- const element = contextMenuElementRef.current;
1092
- const elementKey = element ? getPickProbeElementKey(element) : null;
1093
- closePickTargetContextMenu();
1094
- resetPickProbeState();
1095
- if (!element) {
1096
- return;
1097
- }
1098
- const shouldClearDraft = draftElementRef.current === element;
1099
- const rect = element.getBoundingClientRect();
1100
- const deletion = elementKey ? captureSavedProbeDeletion(element, elementKey) : null;
1101
- const previousStyleEntry = elementKey ? (savedProbeEdits[elementKey] ?? null) : null;
1102
- contextMenuElementRef.current = null;
1103
- if (selectedElementRef.current === element) {
1104
- selectedElementRef.current = null;
1105
- hoveredElementRef.current = null;
1106
- setSelectedTarget(null);
1107
- setHoveredTarget(null);
1108
- setHoverPointer(null);
1109
- }
1110
- void playPickTargetDeleteAnimation(rect).then(() => {
1111
- if (!element.isConnected) {
1112
- return;
1113
- }
1114
- element.remove();
1115
- if (deletion) {
1116
- setSavedProbeDeletions((current) => [...current, deletion]);
1117
- if (previousStyleEntry) {
1118
- setSavedProbeEdits((current) => {
1119
- const next = { ...current };
1120
- delete next[deletion.elementKey];
1121
- return next;
1122
- });
1123
- }
1124
- pushProbeSessionAction({
1125
- kind: "delete",
1126
- deletion,
1127
- previousStyleEntry,
1128
- });
1129
- }
1130
- if (shouldClearDraft) {
1131
- draftElementRef.current = null;
1132
- setDraft(null);
1133
- }
1134
- });
1135
- }, [closePickTargetContextMenu, pushProbeSessionAction, resetPickProbeState, savedProbeEdits]);
1136
- useEffect(() => {
1137
- if (mode !== "report") {
1138
- resetPickProbeState();
1139
- closePickTargetContextMenu();
1140
- }
1141
- }, [closePickTargetContextMenu, mode, resetPickProbeState]);
1142
- const setPickProbeCompareMode = useCallback((compareMode) => {
1143
- const element = selectedElementRef.current;
1144
- if (!element || !pickProbeBaseline || !pickProbeValues) {
1145
- return;
1146
- }
1147
- applyPickProbeCompareMode(element, compareMode, pickProbeBaseline, pickProbeValues);
1148
- setPickProbeCompareModeState(compareMode);
1149
- refreshSelectedTargetSnapshot();
1150
- if (compareMode === "after") {
1151
- persistPickProbeEdits();
1152
- }
1153
- }, [persistPickProbeEdits, pickProbeBaseline, pickProbeValues, refreshSelectedTargetSnapshot]);
1154
- const updatePickProbeValue = useCallback((key, value) => {
1155
- const element = selectedElementRef.current;
1156
- if (!element || !pickProbeBaseline || !pickProbeValues) {
1157
- return;
1158
- }
1159
- const nextValues = {
1160
- ...pickProbeValues,
1161
- [key]: value,
1162
- };
1163
- setPickProbeValues(nextValues);
1164
- if (pickProbeCompareMode === "after") {
1165
- applyPickProbeValueDiff(element, pickProbeBaseline, nextValues, "after");
1166
- refreshSelectedTargetSnapshot();
1167
- persistPickProbeEdits({ values: nextValues });
1168
- }
1169
- }, [pickProbeBaseline, pickProbeCompareMode, pickProbeValues, persistPickProbeEdits, refreshSelectedTargetSnapshot]);
1170
- const resetPickProbeValues = useCallback(() => {
1171
- const element = selectedElementRef.current;
1172
- if (!element || !pickProbeBaseline || !pickProbeValues) {
1173
- return;
1174
- }
1175
- setPickProbeValues(pickProbeBaseline);
1176
- const snapshot = pickProbeOriginalSnapshotRef.current;
1177
- if (snapshot) {
1178
- restoreProbeElementFromSnapshot(element, snapshot);
1179
- }
1180
- else if (pickProbeHasEdits) {
1181
- applyPickProbeCompareMode(element, pickProbeCompareMode, pickProbeBaseline, pickProbeBaseline);
1182
- }
1183
- persistPickProbeEdits({ values: pickProbeBaseline });
1184
- refreshSelectedTargetSnapshot();
1185
- }, [pickProbeBaseline, pickProbeCompareMode, pickProbeHasEdits, pickProbeValues, persistPickProbeEdits, refreshSelectedTargetSnapshot]);
1186
- const stopEditing = () => {
1187
- setEditingReportId(null);
1188
- setEditableDraft(null);
1189
- };
1190
- const cancelCaseEdit = useCallback(() => {
1191
- setCaseEditReportId(null);
1192
- setCaseEditDraft(null);
1193
- }, []);
1194
- useEffect(() => {
1195
- if (!activeReplyReport) {
1196
- return;
1197
- }
1198
- setFocusedCaseId((current) => {
1199
- if (current && isValidFocusedCase(activeReplyReport, current)) {
1200
- return current;
1201
- }
1202
- return resolveDefaultFocusedCaseId(activeReplyReport);
1203
- });
1204
- }, [activeReplyReport]);
1205
- const clearFocusedCase = useCallback(() => {
1206
- setFocusedCaseId(null);
1207
- }, []);
1208
- const selectCase = useCallback((caseId) => {
1209
- setFocusedCaseId(caseId);
1210
- setPendingComposer(null);
1211
- setReplyDraft("");
1212
- setReplySubmitAsQuestion(false);
1213
- setErrorMessage("");
1214
- }, []);
1215
- const ensureFocusedCase = useCallback((report) => {
1216
- if (isValidFocusedCase(report, focusedCaseId)) {
1217
- return true;
1218
- }
1219
- setErrorMessage(messages.errors.selectCaseFirst);
1220
- return false;
1221
- }, [focusedCaseId, messages.errors.selectCaseFirst]);
1222
- const ensureCanActOnFocusedCase = useCallback((report) => {
1223
- if (!ensureFocusedCase(report) || !focusedCaseId) {
1224
- return false;
1225
- }
1226
- const actorName = sessionActor?.name?.trim() ?? "";
1227
- if (actorName && canActOnCase(report, focusedCaseId, actorName)) {
1228
- return true;
1229
- }
1230
- setErrorMessage(messages.errors.caseAssigneeOnly);
1231
- return false;
1232
- }, [ensureFocusedCase, focusedCaseId, messages.errors.caseAssigneeOnly, sessionActor?.name]);
1233
- const beginCaseEdit = useCallback((report) => {
1234
- if (!canEditReportCases(report)) {
1235
- setErrorMessage(messages.errors.archivedReadOnly);
1236
- return;
1237
- }
1238
- setCaseEditReportId(report.id);
1239
- setCaseEditDraft(report.cases.map((item) => ({ ...item })));
1240
- setErrorMessage("");
1241
- }, [messages.errors.archivedReadOnly]);
1242
- const updateCaseEditDraftCase = useCallback((caseId, text) => {
1243
- setCaseEditDraft((current) => {
1244
- if (!current) {
1245
- return current;
1246
- }
1247
- return current.map((item) => (item.id === caseId ? { ...item, text } : item));
1248
- });
1249
- }, []);
1250
- const addCaseEditDraftCase = useCallback(() => {
1251
- setCaseEditDraft((current) => (current ? [...current, createReportCase("")] : current));
1252
- }, []);
1253
- const removeCaseEditDraftCase = useCallback((caseId) => {
1254
- setCaseEditDraft((current) => {
1255
- if (!current || current.length <= 1) {
1256
- return current;
1257
- }
1258
- return current.filter((item) => item.id !== caseId);
1259
- });
1260
- }, []);
1261
- const handleCaseEditSave = async () => {
1262
- if (!caseEditReportId || !caseEditDraft) {
1263
- return;
1264
- }
1265
- const report = reports.find((item) => item.id === caseEditReportId) ?? activeReplyReport;
1266
- if (!report) {
1267
- return;
1268
- }
1269
- if (!canEditReportCases(report)) {
1270
- setErrorMessage(messages.errors.archivedNotEditable);
1271
- return;
1272
- }
1273
- const nextError = getFieldError(caseEditDraft, report.field_values, fields, messages.errors);
1274
- if (nextError) {
1275
- setErrorMessage(nextError);
1276
- return;
1277
- }
1278
- try {
1279
- const cases = caseEditDraft.map((item) => ({
1280
- ...item,
1281
- text: item.text.trim(),
1282
- updated_at: new Date().toISOString(),
1283
- }));
1284
- const updatedFeedback = await updateFeedback(report.id, await signUpdatePayload({ cases }));
1285
- await notifyFeedbackUpdate(eventCallbacks, updatedFeedback);
1286
- cancelCaseEdit();
1287
- setErrorMessage("");
1288
- }
1289
- catch (nextError) {
1290
- setErrorMessage(nextError instanceof Error ? nextError.message : messages.errors.updateFeedbackFailed);
1291
- }
1292
- };
1293
- const isCaseEditing = Boolean(caseEditReportId && caseEditDraft);
1294
- const caseEditCases = caseEditReportId === activeReplyReport?.id ? caseEditDraft : null;
1295
- useEffect(() => {
1296
- if (caseEditReportId && activeReplyReportId && caseEditReportId !== activeReplyReportId) {
1297
- cancelCaseEdit();
1298
- }
1299
- }, [activeReplyReportId, cancelCaseEdit, caseEditReportId]);
1300
- const selectReport = (reportId) => {
1301
- setSelectedReportId(reportId);
1302
- if (editingReportId && editingReportId !== reportId) {
1303
- stopEditing();
1304
- }
1305
- };
1306
- const closeReplyComposer = () => {
1307
- setActiveReplyReportId(null);
1308
- setReplyDraft("");
1309
- setReplySubmitAsQuestion(false);
1310
- setPendingComposer(null);
1311
- setShowConfirmAuthorSelect(false);
1312
- cancelCaseEdit();
1313
- clearFocusedCase();
1314
- };
1315
- const showFeedbackTooltip = useCallback(async (report) => {
1316
- await prepareFeedbackLocation(report);
1317
- clearHoverLeaveTimeout();
1318
- closeReplyComposer();
1319
- setHoveredMarkerId(report.id);
1320
- }, [clearHoverLeaveTimeout, closeReplyComposer, prepareFeedbackLocation]);
1321
- const locateFeedback = async (reportId) => {
1322
- const report = filteredReports.find((item) => item.id === reportId);
1323
- if (!report) {
1324
- return;
1325
- }
1326
- selectReport(reportId);
1327
- if (report.pathname !== currentPathname) {
1328
- pendingLocateReportIdRef.current = reportId;
1329
- try {
1330
- if (onNavigate) {
1331
- await onNavigate(report.pathname);
1332
- }
1333
- else if (typeof window !== "undefined") {
1334
- window.location.assign(report.pathname);
1335
- }
1336
- }
1337
- catch (nextError) {
1338
- pendingLocateReportIdRef.current = null;
1339
- setErrorMessage(nextError instanceof Error ? nextError.message : messages.errors.loadFeedbackFailed);
1340
- }
1341
- return;
1342
- }
1343
- showFeedbackTooltip(report);
1344
- };
1345
- useEffect(() => {
1346
- const pendingReportId = pendingLocateReportIdRef.current;
1347
- if (!pendingReportId) {
1348
- return;
1349
- }
1350
- const report = reports.find((item) => item.id === pendingReportId && item.pathname === currentPathname);
1351
- if (!report) {
1352
- return;
1353
- }
1354
- pendingLocateReportIdRef.current = null;
1355
- window.setTimeout(() => showFeedbackTooltip(report), 0);
1356
- }, [currentPathname, reports, showFeedbackTooltip]);
1357
- const focusSearchInput = () => {
1358
- searchInputRef.current?.focus();
1359
- searchInputRef.current?.select();
1360
- };
1361
- const selectAdjacentReport = (direction) => {
1362
- if (filteredReports.length === 0) {
1363
- return;
1364
- }
1365
- const currentIndex = filteredReports.findIndex((report) => report.id === selectedReportId);
1366
- let nextIndex;
1367
- if (currentIndex === -1) {
1368
- nextIndex = direction === "down" ? 0 : filteredReports.length - 1;
1369
- }
1370
- else {
1371
- nextIndex = direction === "down" ? Math.min(currentIndex + 1, filteredReports.length - 1) : Math.max(currentIndex - 1, 0);
1372
- }
1373
- void locateFeedback(filteredReports[nextIndex].id);
1374
- };
1375
- const openReplyComposer = (report) => {
1376
- selectReport(report.id);
1377
- setActiveReplyReportId(report.id);
1378
- setReplyDraft("");
1379
- setReplySubmitAsQuestion(false);
1380
- setPendingComposer(null);
1381
- setReplyAuthorName(sessionActor?.name ?? resolveDefaultAuthorName(activeIdentify, authorizedAuthors, selfProfile?.name));
1382
- setConfirmAuthorName(resolveOriginalFeedbackAuthorName(report));
1383
- setShowConfirmAuthorSelect(false);
1384
- setFocusedCaseId(resolveDefaultFocusedCaseId(report));
1385
- };
1386
- const activateFeedbackMarker = useCallback(async (report) => {
1387
- const enrichedReport = await loadRepliesIfNeeded(report);
1388
- await prepareFeedbackLocation(enrichedReport);
1389
- openReplyComposer(enrichedReport);
1390
- }, [loadRepliesIfNeeded, openReplyComposer, prepareFeedbackLocation]);
1391
- useEffect(() => {
1392
- const feedbackId = pendingDeepLinkFeedbackIdRef.current;
1393
- if (!feedbackId || deepLinkHandledRef.current || isReportsLoading || isFetching) {
1394
- return;
1395
- }
1396
- const report = reports.find((item) => item.id === feedbackId);
1397
- if (!report) {
1398
- pendingDeepLinkFeedbackIdRef.current = null;
1399
- clearFeedbackDeepLinkFromUrl();
1400
- return;
1401
- }
1402
- deepLinkHandledRef.current = true;
1403
- pendingDeepLinkFeedbackIdRef.current = null;
1404
- void activateFeedbackMarker(report).finally(() => {
1405
- clearFeedbackDeepLinkFromUrl();
1406
- });
1407
- }, [activateFeedbackMarker, isFetching, isReportsLoading, reports]);
1408
- const toggleConfirmAuthorSelect = () => {
1409
- setShowConfirmAuthorSelect((current) => !current);
1410
- };
1411
- const startDenyReview = (targetReplyId) => {
1412
- if (!activeReplyReport || !focusedCaseId) {
1413
- return;
1414
- }
1415
- if (!ensureCanActOnFocusedCase(activeReplyReport)) {
1416
- return;
1417
- }
1418
- const latestRoot = getLatestBranchRootForCase(activeReplyReport, focusedCaseId);
1419
- if (!latestRoot) {
1420
- setPendingComposer({
1421
- type: "deny",
1422
- targetReplyId: targetReplyId ?? ISSUE_ROOT_PARENT_ID,
1423
- });
1424
- setReplyDraft("");
1425
- setReplySubmitAsQuestion(false);
1426
- return;
1427
- }
1428
- setPendingComposer({
1429
- type: latestRoot.status === "found_error" ? "recheck" : "deny",
1430
- targetReplyId: latestRoot.id,
1431
- });
1432
- setReplyDraft("");
1433
- setReplySubmitAsQuestion(false);
1434
- };
1435
- const startCheckoutReview = (replyId) => {
1436
- if (!activeReplyReport || !focusedCaseId || !ensureCanActOnFocusedCase(activeReplyReport)) {
1437
- return;
1438
- }
1439
- setPendingComposer({ type: "checkout", targetReplyId: replyId });
1440
- setReplyDraft("");
1441
- setReplySubmitAsQuestion(false);
1442
- };
1443
- const startAskQuestion = () => {
1444
- if (!activeReplyReport || !focusedCaseId || !ensureFocusedCase(activeReplyReport)) {
1445
- return;
1446
- }
1447
- const latestRoot = getLatestBranchRootForCase(activeReplyReport, focusedCaseId);
1448
- setErrorMessage("");
1449
- setReplyDraft("");
1450
- if (!latestRoot) {
1451
- setPendingComposer({
1452
- type: "question",
1453
- targetReplyId: ISSUE_ROOT_PARENT_ID,
1454
- });
1455
- setReplySubmitAsQuestion(true);
1456
- return;
1457
- }
1458
- if (latestRoot.status === "suggested" || latestRoot.status === "found_error" || latestRoot.status === "recheck_requested") {
1459
- setPendingComposer({
1460
- type: "question",
1461
- targetReplyId: latestRoot.id,
1462
- });
1463
- setReplySubmitAsQuestion(true);
1464
- }
1465
- };
1466
- const cancelPendingComposer = () => {
1467
- setPendingComposer(null);
1468
- setReplyDraft("");
1469
- setReplySubmitAsQuestion(false);
1470
- };
1471
- const toggleReportMode = () => {
1472
- setShowTargetPreview(false);
1473
- setMode((current) => (current === "report" ? "idle" : "report"));
1474
- };
1475
- const togglePanelTab = (nextTab) => {
1476
- setPanelTab((current) => {
1477
- if (current === nextTab) {
1478
- return null;
1479
- }
1480
- return nextTab;
1481
- });
1482
- };
1483
- const enableIssueMode = () => {
1484
- setShowTargetPreview(false);
1485
- closeReplyComposer();
1486
- stopEditing();
1487
- setMode("view");
1488
- };
1489
- const openPanelTab = (nextTab) => {
1490
- const isClosing = panelTab === nextTab;
1491
- setPanelTab(isClosing ? null : nextTab);
1492
- if (!isClosing && nextTab === "feedback-list") {
1493
- enableIssueMode();
1494
- }
1495
- };
1496
- const toggleIssueMode = () => {
1497
- setShowTargetPreview(false);
1498
- closeReplyComposer();
1499
- setMode((current) => (current === "view" ? "idle" : "view"));
1500
- stopEditing();
1501
- setSelectedReportId(null);
1502
- };
1503
- const toggleTargetPreview = () => {
1504
- setShowTargetPreview((current) => {
1505
- const next = !current;
1506
- if (next) {
1507
- setMode("idle");
1508
- }
1509
- return next;
1510
- });
1511
- };
1512
- const handleOverlayMove = (event) => {
1513
- if (mode !== "report" || draft) {
1514
- return;
1515
- }
1516
- const targetElement = findPickTargetByPoint(overlayRef.current, event.clientX, event.clientY);
1517
- hoveredElementRef.current = targetElement;
1518
- if (!targetElement) {
1519
- scheduleOverlayHoverLeave();
1520
- return;
1521
- }
1522
- clearOverlayHoverLeaveTimeout();
1523
- setHoverPointer({ clientX: event.clientX, clientY: event.clientY });
1524
- const snapshot = toFeedbackHoverSnapshot(targetElement);
1525
- setHoveredTarget((previous) => (isSameHoverTarget(previous, snapshot) ? previous : snapshot));
1526
- };
1527
- const handleOverlayContextMenu = (event) => {
1528
- if (mode !== "report") {
1529
- return;
1530
- }
1531
- event.preventDefault();
1532
- const targetElement = findPickTargetByPoint(overlayRef.current, event.clientX, event.clientY);
1533
- if (!targetElement) {
1534
- closePickTargetContextMenu();
1535
- return;
1536
- }
1537
- const snapshot = toFeedbackHoverSnapshot(targetElement);
1538
- if (!snapshot) {
1539
- closePickTargetContextMenu();
1540
- return;
1541
- }
1542
- const elementKey = getPickProbeElementKey(targetElement);
1543
- contextMenuElementRef.current = targetElement;
1544
- setContextMenuElementKey(elementKey);
1545
- if (!draft) {
1546
- selectedElementRef.current = targetElement;
1547
- hoveredElementRef.current = targetElement;
1548
- setSelectedTarget(snapshot);
1549
- }
1550
- setPickTargetContextMenu({
1551
- clientX: event.clientX,
1552
- clientY: event.clientY,
1553
- });
1554
- };
1555
- const handleOverlayClick = (event) => {
1556
- if (mode !== "report") {
1557
- return;
1558
- }
1559
- closePickTargetContextMenu();
1560
- resetPickProbeState();
1561
- const targetElement = findPickTargetByPoint(overlayRef.current, event.clientX, event.clientY);
1562
- if (!targetElement) {
1563
- setErrorMessage(messages.errors.clickPickTarget);
1564
- return;
1565
- }
1566
- const anchorSnapshot = resolveFeedbackDocumentAnchor(targetElement);
1567
- const snapshot = toFeedbackHoverSnapshot(targetElement);
1568
- const isTagged = snapshot?.isTagged ?? false;
1569
- if (!snapshot) {
1570
- setErrorMessage(messages.errors.clickPickTarget);
1571
- return;
1572
- }
1573
- hoveredElementRef.current = targetElement;
1574
- selectedElementRef.current = targetElement;
1575
- draftElementRef.current = targetElement;
1576
- setHoverPointer(null);
1577
- setHoveredTarget(null);
1578
- setSelectedTarget(snapshot);
1579
- setErrorMessage("");
1580
- setDraft({
1581
- clientX: event.clientX,
1582
- clientY: event.clientY,
1583
- xRatio: clampRatio(event.clientX / window.innerWidth),
1584
- yRatio: clampRatio(event.clientY / window.innerHeight),
1585
- elementXRatio: clampRatio((event.clientX - snapshot.rect.left) / Math.max(snapshot.rect.width, 1)),
1586
- elementYRatio: clampRatio((event.clientY - snapshot.rect.top) / Math.max(snapshot.rect.height, 1)),
1587
- anchorReportId: anchorSnapshot?.id ?? null,
1588
- anchorReportType: anchorSnapshot?.type ?? null,
1589
- anchorXRatio: anchorSnapshot ? clampRatio((event.clientX - anchorSnapshot.rect.left) / Math.max(anchorSnapshot.rect.width, 1)) : null,
1590
- anchorYRatio: anchorSnapshot ? clampRatio((event.clientY - anchorSnapshot.rect.top) / Math.max(anchorSnapshot.rect.height, 1)) : null,
1591
- scrollY: window.scrollY,
1592
- documentY: Math.round(window.scrollY + event.clientY),
1593
- reportId: snapshot.id,
1594
- reportType: snapshot.type,
1595
- targetSelector: isTagged ? null : (snapshot.targetSelector ?? null),
1596
- suggestedReportId: isTagged ? null : (snapshot.suggestedReportId ?? snapshot.id),
1597
- cases: [createReportCase("")],
1598
- category: null,
1599
- fieldValues: createInitialFieldValues(fields),
1600
- });
1601
- };
1602
- const cancelDraft = () => {
1603
- resetPickProbeState();
1604
- draftElementRef.current = null;
1605
- contextMenuElementRef.current = null;
1606
- setDraft(null);
1607
- setSelectedTarget(null);
1608
- setHoverPointer(null);
1609
- };
1610
- const updateDraftCase = (caseId, text) => {
1611
- setDraft((current) => {
1612
- if (!current) {
1613
- return current;
1614
- }
1615
- return {
1616
- ...current,
1617
- cases: current.cases.map((item) => (item.id === caseId ? { ...item, text } : item)),
1618
- };
1619
- });
1620
- setErrorMessage("");
1621
- };
1622
- const appendSavedProbeSummaryAsNewDraftCase = useCallback(() => {
1623
- if (!draft || Object.keys(savedProbeEdits).length === 0) {
1624
- return;
1625
- }
1626
- const summary = formatSavedProbeEditsSummary(savedProbeEdits, messages);
1627
- if (!summary) {
1628
- return;
1629
- }
1630
- setDraft((current) => {
1631
- if (!current) {
1632
- return current;
1633
- }
1634
- const cases = current.cases.map((item) => ({ ...item }));
1635
- const emptyIndex = cases.findIndex((item) => !item.text.trim());
1636
- const targetIndex = emptyIndex >= 0 ? emptyIndex : 0;
1637
- const target = cases[targetIndex];
1638
- if (!target) {
1639
- return {
1640
- ...current,
1641
- cases: [createReportCase(summary)],
1642
- };
1643
- }
1644
- cases[targetIndex] = {
1645
- ...target,
1646
- text: target.text.trim() ? `${target.text.trim()}\n\n${summary}` : summary,
1647
- updated_at: new Date().toISOString(),
1648
- };
1649
- return {
1650
- ...current,
1651
- cases,
1652
- };
1653
- });
1654
- }, [draft, messages, savedProbeEdits]);
1655
- const updateDraftCategory = (category) => {
1656
- setDraft((current) => current
1657
- ? {
1658
- ...current,
1659
- category,
1660
- }
1661
- : current);
1662
- if (category) {
1663
- setErrorMessage("");
1664
- }
1665
- };
1666
- const addDraftCase = () => {
1667
- setDraft((current) => current
1668
- ? {
1669
- ...current,
1670
- cases: [...current.cases, createReportCase("")],
1671
- }
1672
- : current);
1673
- };
1674
- const removeDraftCase = (caseId) => {
1675
- setDraft((current) => {
1676
- if (!current || current.cases.length <= 1) {
1677
- return current;
1678
- }
1679
- return {
1680
- ...current,
1681
- cases: current.cases.filter((item) => item.id !== caseId),
1682
- };
1683
- });
1684
- };
1685
- const updateDraftField = (key, nextValue) => {
1686
- setDraft((current) => current
1687
- ? {
1688
- ...current,
1689
- fieldValues: {
1690
- ...current.fieldValues,
1691
- [key]: nextValue,
1692
- },
1693
- }
1694
- : current);
1695
- };
1696
- const buildCreatePayloadFromDraft = () => {
1697
- if (!draft) {
1698
- return null;
1699
- }
1700
- const nextError = getFieldError(draft.cases, draft.fieldValues, fields, messages.errors);
1701
- if (nextError) {
1702
- setErrorMessage(nextError);
1703
- return null;
1704
- }
1705
- if (!draft.category) {
1706
- setErrorMessage(messages.errors.categoryRequired);
1707
- return null;
1708
- }
1709
- if (!sessionActor) {
1710
- setErrorMessage(messages.errors.authorRequired);
1711
- return null;
1712
- }
1713
- const cases = draft.cases.map((item) => ({
1714
- ...item,
1715
- text: item.text.trim(),
1716
- updated_at: new Date().toISOString(),
1717
- }));
1718
- return {
1719
- pathname: currentPathname,
1720
- report_id: draft.reportId,
1721
- report_type: draft.reportType,
1722
- ...(draft.targetSelector ? { target_selector: draft.targetSelector } : {}),
1723
- cases,
1724
- status: "open",
1725
- category: draft.category,
1726
- field_values: draft.fieldValues,
1727
- position: {
1728
- target: {
1729
- x: draft.elementXRatio,
1730
- y: draft.elementYRatio,
1731
- },
1732
- viewport: {
1733
- x: draft.xRatio,
1734
- y: draft.yRatio,
1735
- width: window.innerWidth,
1736
- height: window.innerHeight,
1737
- },
1738
- scrollY: draft.scrollY,
1739
- anchor: draft.anchorReportId && draft.anchorReportType && draft.anchorXRatio !== null && draft.anchorYRatio !== null
1740
- ? {
1741
- reportId: draft.anchorReportId,
1742
- reportType: draft.anchorReportType,
1743
- x: draft.anchorXRatio,
1744
- y: draft.anchorYRatio,
1745
- }
1746
- : null,
1747
- },
1748
- ...(environment ? { environment } : {}),
1749
- ...(appVersion ? { app_version: appVersion } : {}),
1750
- ...(sessionActor
1751
- ? {
1752
- author_id: sessionActor.id,
1753
- author_name: sessionActor.name,
1754
- }
1755
- : {}),
1756
- };
1757
- };
1758
- const finalizeDraftCreate = () => {
1759
- resetPickProbeState();
1760
- draftElementRef.current = null;
1761
- contextMenuElementRef.current = null;
1762
- setDraft(null);
1763
- setSelectedTarget(null);
1764
- setHoveredTarget(null);
1765
- setHoverPointer(null);
1766
- setErrorMessage("");
1767
- setMode("view");
1768
- };
1769
- const handleCreateSubmit = async () => {
1770
- const payload = buildCreatePayloadFromDraft();
1771
- if (!payload) {
1772
- return;
1773
- }
1774
- try {
1775
- const savedFeedback = await createFeedback(await signCreatePayload(payload));
1776
- await notifyFeedbackCreate(eventCallbacks, savedFeedback);
1777
- finalizeDraftCreate();
1778
- }
1779
- catch (nextError) {
1780
- setErrorMessage(nextError instanceof Error ? nextError.message : messages.errors.saveFeedbackFailed);
1781
- }
1782
- };
1783
- const handleCreateSubmitWithGitHubIssue = async () => {
1784
- if (!github?.onCreate || !canCreateGitHubIssueOnCreateValue || creatingGitHubIssueId || isCreating) {
1785
- return;
1786
- }
1787
- const payload = buildCreatePayloadFromDraft();
1788
- if (!payload) {
1789
- return;
1790
- }
1791
- setCreatingGitHubIssueId("draft");
1792
- setErrorMessage("");
1793
- try {
1794
- const savedFeedback = await createFeedback(await signCreatePayload(payload));
1795
- await notifyFeedbackCreate(eventCallbacks, savedFeedback);
1796
- const result = await github.onCreate(savedFeedback);
1797
- const updatedFeedback = await applyGitHubIssueUpdate(savedFeedback, result);
1798
- await notifyGitHubIssueCreated(eventCallbacks, {
1799
- feedback: updatedFeedback,
1800
- issueUrl: result.issueUrl,
1801
- });
1802
- finalizeDraftCreate();
1803
- }
1804
- catch (nextError) {
1805
- setErrorMessage(nextError instanceof Error ? nextError.message : messages.errors.createGitHubIssueFailed);
1806
- }
1807
- finally {
1808
- setCreatingGitHubIssueId(null);
1809
- }
1810
- };
1811
- const startEditing = (report) => {
1812
- if (report.status === "archived") {
1813
- setErrorMessage(messages.errors.archivedReadOnly);
1814
- setSelectedReportId(report.id);
1815
- return;
1816
- }
1817
- setEditingReportId(report.id);
1818
- setEditableDraft({
1819
- cases: report.cases.map((item) => ({ ...item })),
1820
- status: report.status,
1821
- fieldValues: createInitialFieldValues(fields, report.field_values),
1822
- });
1823
- setSelectedReportId(report.id);
1824
- };
1825
- const handleUpdateSubmit = async () => {
1826
- if (!selectedReport || !editableDraft) {
1827
- return;
1828
- }
1829
- if (selectedReport.status === "archived") {
1830
- setErrorMessage(messages.errors.archivedNotEditable);
1831
- return;
1832
- }
1833
- const nextError = getFieldError(editableDraft.cases, editableDraft.fieldValues, fields, messages.errors);
1834
- if (nextError) {
1835
- setErrorMessage(nextError);
1836
- return;
1837
- }
1838
- try {
1839
- const cases = editableDraft.cases.map((item) => ({
1840
- ...item,
1841
- text: item.text.trim(),
1842
- updated_at: new Date().toISOString(),
1843
- }));
1844
- const updatedFeedback = await updateFeedback(selectedReport.id, await signUpdatePayload({
1845
- cases,
1846
- status: editableDraft.status,
1847
- field_values: editableDraft.fieldValues,
1848
- }));
1849
- await notifyFeedbackUpdate(eventCallbacks, updatedFeedback);
1850
- stopEditing();
1851
- setErrorMessage("");
1852
- }
1853
- catch (nextError) {
1854
- setErrorMessage(nextError instanceof Error ? nextError.message : messages.errors.updateFeedbackFailed);
1855
- }
1856
- };
1857
- const appendReply = async (report, reply) => {
1858
- if (usesCreateReply) {
1859
- await createReply(report.id, await signReplyPayload({
1860
- message: reply.message,
1861
- status: reply.status,
1862
- case_ids: reply.case_ids,
1863
- parent_reply_id: reply.parent_reply_id,
1864
- author_type: reply.author_type ?? "manager",
1865
- author_name: reply.author_name,
1866
- }));
1867
- }
1868
- else {
1869
- const payload = await signUpdatePayload({
1870
- replies: [...getReportReplies(report), reply],
1871
- });
1872
- await updateFeedback(report.id, payload);
1873
- }
1874
- await notifyFeedbackReply(eventCallbacks, {
1875
- feedbackId: report.id,
1876
- message: reply.message,
1877
- });
1878
- };
1879
- const handleReplySubmit = async () => {
1880
- if (!activeReplyReport) {
1881
- return;
1882
- }
1883
- if (!replyDraft.trim()) {
1884
- setErrorMessage(messages.errors.replyContentRequired);
1885
- return;
1886
- }
1887
- if (!ensureFocusedCase(activeReplyReport) || !focusedCaseId) {
1888
- return;
1889
- }
1890
- const actorName = sessionActor?.name?.trim() ?? "";
1891
- if (!actorName) {
1892
- setErrorMessage(messages.errors.authorRequired);
1893
- return;
1894
- }
1895
- const pendingType = pendingComposer?.type ?? null;
1896
- const isCreatorSubmit = pendingType === "deny" || pendingType === "recheck" || pendingType === "question";
1897
- const isQuestionSubmit = pendingType === "question";
1898
- if (requiresCaseActorPermissionForComposer(pendingType) && !canActOnCase(activeReplyReport, focusedCaseId, actorName)) {
1899
- setErrorMessage(messages.errors.caseAssigneeOnly);
1900
- return;
1901
- }
1902
- const replyMessage = replyDraft.trim();
1903
- const replyStatus = createReplyStatusForSubmit(pendingType, isQuestionSubmit);
1904
- const parentReplyId = replyStatus === "additional_question" ? resolveParentReplyIdForCaseQuestion(activeReplyReport, focusedCaseId, pendingComposer) : null;
1905
- const reply = {
1906
- id: createReplyId(),
1907
- message: replyMessage,
1908
- created_at: new Date().toISOString(),
1909
- status: replyStatus,
1910
- case_ids: [focusedCaseId],
1911
- ...(parentReplyId ? { parent_reply_id: parentReplyId } : {}),
1912
- author_type: isCreatorSubmit ? "user" : "manager",
1913
- author_name: actorName,
1914
- };
1915
- try {
1916
- setIsSubmittingReply(true);
1917
- await appendReply(activeReplyReport, reply);
1918
- setErrorMessage("");
1919
- setReplyDraft("");
1920
- if (replyStatus === "additional_question") {
1921
- setReplySubmitAsQuestion(true);
1922
- if (pendingType === "question" && pendingComposer) {
1923
- setPendingComposer({
1924
- type: "question",
1925
- targetReplyId: pendingComposer.targetReplyId,
1926
- });
1927
- }
1928
- else {
1929
- setPendingComposer(null);
1930
- }
1931
- }
1932
- else {
1933
- setReplySubmitAsQuestion(false);
1934
- setPendingComposer(null);
1935
- }
1936
- }
1937
- catch (nextError) {
1938
- setErrorMessage(nextError instanceof Error ? nextError.message : messages.errors.saveReplyFailed);
1939
- }
1940
- finally {
1941
- setIsSubmittingReply(false);
1942
- }
1943
- };
1944
- const handleClaimAssignee = async () => {
1945
- if (!activeReplyReport) {
1946
- return;
1947
- }
1948
- if (!ensureFocusedCase(activeReplyReport) || !focusedCaseId) {
1949
- return;
1950
- }
1951
- const assigneeName = sessionActor?.name?.trim() ?? "";
1952
- if (!assigneeName) {
1953
- setErrorMessage(messages.errors.authorRequired);
1954
- return;
1955
- }
1956
- if (!canShowCaseClaimAction(activeReplyReport, focusedCaseId, assigneeName)) {
1957
- setErrorMessage(messages.errors.caseAssigneeOnly);
1958
- return;
1959
- }
1960
- const reply = {
1961
- id: createReplyId(),
1962
- message: messages.thread.assigneeAssigned,
1963
- created_at: new Date().toISOString(),
1964
- status: "assignee_assigned",
1965
- case_ids: [focusedCaseId],
1966
- author_type: "manager",
1967
- author_name: assigneeName,
1968
- };
1969
- try {
1970
- setIsClaimingAssignee(true);
1971
- await appendReply(activeReplyReport, reply);
1972
- const nextCases = claimCaseAssignee(activeReplyReport.cases, focusedCaseId, assigneeName);
1973
- await updateFeedback(activeReplyReport.id, await signUpdatePayload({
1974
- cases: nextCases,
1975
- }));
1976
- setErrorMessage("");
1977
- }
1978
- catch (nextError) {
1979
- setErrorMessage(nextError instanceof Error ? nextError.message : messages.errors.saveReplyFailed);
1980
- }
1981
- finally {
1982
- setIsClaimingAssignee(false);
1983
- }
1984
- };
1985
- const handleTransferAssignee = async () => {
1986
- if (!activeReplyReport) {
1987
- return;
1988
- }
1989
- if (!ensureFocusedCase(activeReplyReport) || !focusedCaseId) {
1990
- return;
1991
- }
1992
- const assigneeName = sessionActor?.name?.trim() ?? "";
1993
- if (!assigneeName) {
1994
- setErrorMessage(messages.errors.authorRequired);
1995
- return;
1996
- }
1997
- const currentAssignee = getCaseAssigneeName(activeReplyReport, focusedCaseId);
1998
- if (!currentAssignee || currentAssignee === assigneeName) {
1999
- setErrorMessage(messages.errors.caseAssigneeOnly);
2000
- return;
2001
- }
2002
- const authorName = resolveOriginalFeedbackAuthorName(activeReplyReport);
2003
- if (authorName && assigneeName === authorName) {
2004
- setErrorMessage(messages.errors.caseAssigneeOnly);
2005
- return;
2006
- }
2007
- const reply = {
2008
- id: createReplyId(),
2009
- message: messages.thread.assigneeTransferred,
2010
- created_at: new Date().toISOString(),
2011
- status: "assignee_transferred",
2012
- case_ids: [focusedCaseId],
2013
- author_type: "manager",
2014
- author_name: assigneeName,
2015
- };
2016
- try {
2017
- setIsClaimingAssignee(true);
2018
- await appendReply(activeReplyReport, reply);
2019
- const nextCases = transferCaseAssignee(activeReplyReport.cases, focusedCaseId, assigneeName);
2020
- await updateFeedback(activeReplyReport.id, await signUpdatePayload({
2021
- cases: nextCases,
2022
- }));
2023
- setErrorMessage("");
2024
- }
2025
- catch (nextError) {
2026
- setErrorMessage(nextError instanceof Error ? nextError.message : messages.errors.saveReplyFailed);
2027
- }
2028
- finally {
2029
- setIsClaimingAssignee(false);
2030
- }
2031
- };
2032
- const handleConfirmResolution = async () => {
2033
- if (!activeReplyReport) {
2034
- return;
2035
- }
2036
- if (!ensureFocusedCase(activeReplyReport) || !focusedCaseId) {
2037
- return;
2038
- }
2039
- const resolverName = sessionActor?.name?.trim() ?? "";
2040
- if (!resolverName) {
2041
- setErrorMessage(messages.errors.reviewerRequired);
2042
- return;
2043
- }
2044
- if (!canActOnCase(activeReplyReport, focusedCaseId, resolverName)) {
2045
- setErrorMessage(messages.errors.caseAssigneeOnly);
2046
- return;
2047
- }
2048
- const nextCases = buildResolvedCasesUpdate(activeReplyReport, [focusedCaseId]);
2049
- try {
2050
- if (usesCreateReply) {
2051
- await createReply(activeReplyReport.id, await signReplyPayload({
2052
- message: messages.resolution.issueResolvedMessage,
2053
- status: "resolved",
2054
- case_ids: [focusedCaseId],
2055
- author_type: "user",
2056
- author_name: resolverName,
2057
- }));
2058
- const updatedFeedback = await updateFeedback(activeReplyReport.id, await signUpdatePayload({
2059
- cases: nextCases,
2060
- }));
2061
- await notifyFeedbackUpdate(eventCallbacks, updatedFeedback);
2062
- }
2063
- else {
2064
- const reply = {
2065
- id: createReplyId(),
2066
- message: messages.resolution.issueResolvedMessage,
2067
- created_at: new Date().toISOString(),
2068
- status: "resolved",
2069
- case_ids: [focusedCaseId],
2070
- author_type: "user",
2071
- author_name: resolverName,
2072
- };
2073
- const updatedFeedback = await updateFeedback(activeReplyReport.id, await signUpdatePayload({
2074
- cases: nextCases,
2075
- replies: [...getReportReplies(activeReplyReport), reply],
2076
- }));
2077
- await notifyFeedbackUpdate(eventCallbacks, updatedFeedback);
2078
- }
2079
- setFocusedCaseId(resolveDefaultFocusedCaseId({ ...activeReplyReport, cases: nextCases }));
2080
- setErrorMessage("");
2081
- setPendingComposer(null);
2082
- setReplyDraft("");
2083
- setShowConfirmAuthorSelect(false);
2084
- }
2085
- catch (nextError) {
2086
- setErrorMessage(nextError instanceof Error ? nextError.message : messages.errors.confirmResolutionFailed);
2087
- }
2088
- };
2089
- const handleCreateGitHubIssue = async (report) => {
2090
- if (!github?.onCreate || !canCreateGitHubIssueFromListValue || creatingGitHubIssueId) {
2091
- return;
2092
- }
2093
- if (isGitIssued(report)) {
2094
- return;
2095
- }
2096
- setCreatingGitHubIssueId(report.id);
2097
- setErrorMessage("");
2098
- try {
2099
- const result = await github.onCreate(report);
2100
- const updatedFeedback = await applyGitHubIssueUpdate(report, result);
2101
- await notifyGitHubIssueCreated(eventCallbacks, {
2102
- feedback: updatedFeedback,
2103
- issueUrl: result.issueUrl,
2104
- });
2105
- setErrorMessage("");
2106
- }
2107
- catch (nextError) {
2108
- setErrorMessage(nextError instanceof Error ? nextError.message : messages.errors.createGitHubIssueFailed);
2109
- }
2110
- finally {
2111
- setCreatingGitHubIssueId(null);
2112
- }
2113
- };
2114
- const handleDelete = async (id) => {
2115
- try {
2116
- await deleteFeedback(id);
2117
- await notifyFeedbackDelete(eventCallbacks, id);
2118
- if (selectedReportId === id) {
2119
- setSelectedReportId(null);
2120
- }
2121
- if (editingReportId === id) {
2122
- stopEditing();
2123
- }
2124
- if (activeReplyReportId === id) {
2125
- closeReplyComposer();
2126
- }
2127
- setErrorMessage("");
2128
- }
2129
- catch (nextError) {
2130
- setErrorMessage(nextError instanceof Error ? nextError.message : messages.errors.deleteFeedbackFailed);
2131
- }
2132
- };
2133
- useReportShortcuts({
2134
- mode,
2135
- draft,
2136
- editingReportId,
2137
- panelTab,
2138
- showTargetPreview,
2139
- activeReplyReportId,
2140
- pendingComposer,
2141
- pickProbeOpen,
2142
- toggleReportMode,
2143
- toggleTargetPreview,
2144
- toggleIssueMode,
2145
- cancelDraft,
2146
- cancelPendingComposer,
2147
- closePickProbe,
2148
- closeReplyComposer,
2149
- handleCreateSubmit,
2150
- stopEditing,
2151
- handleUpdateSubmit,
2152
- focusSearchInput,
2153
- selectAdjacentReport,
2154
- });
2155
- return {
2156
- panelAppearance: activePanelAppearance,
2157
- setPanelAppearance,
2158
- tooltipAppearance: activeTooltipAppearance,
2159
- setTooltipAppearance,
2160
- questionThreadDisplay,
2161
- setQuestionThreadDisplay,
2162
- locale,
2163
- setLocale,
2164
- messages,
2165
- fields,
2166
- authors: authorizedAuthors,
2167
- projectId,
2168
- environment,
2169
- appVersion,
2170
- currentPathname,
2171
- showFeedbackList,
2172
- panelTab,
2173
- routeDetailsStats: resolvedRouteDetailsStats,
2174
- panelCollapsed,
2175
- setPanelCollapsed,
2176
- onPanelBootstrap,
2177
- canTransferFeedback,
2178
- personalKey,
2179
- publicKey,
2180
- personalKeyRequired,
2181
- personalKeyCandidates,
2182
- authDiagnostics,
2183
- authorSelectionLocked,
2184
- panelView,
2185
- completeOnboarding,
2186
- restoreFromBackup,
2187
- skipOnboarding,
2188
- selfProfile,
2189
- issuePersonalKey,
2190
- rotatePersonalKey,
2191
- insertPersonalKey,
2192
- canListAllFeedback,
2193
- onActivitySummary,
2194
- visibleShortcutKeys,
2195
- searchInputRef,
2196
- resolvedPanelAppearance,
2197
- resolvedTooltipAppearance,
2198
- isMobileViewport,
2199
- mode,
2200
- showTargetPreview,
2201
- showMarkerTargetPreview,
2202
- setShowMarkerTargetPreview,
2203
- toggleMarkerTargetPreview,
2204
- markerAppearance,
2205
- setMarkerAppearance,
2206
- setMarkerSize,
2207
- setMarkerShape,
2208
- setMarkerColors,
2209
- setMarkerColor,
2210
- typography,
2211
- setTypography,
2212
- setFontSize,
2213
- setFontFamily,
2214
- activeMarkerTarget,
2215
- markerPreviewTargets,
2216
- selectableTargets,
2217
- filters,
2218
- setFilters,
2219
- listScope,
2220
- setListScope,
2221
- reports,
2222
- currentPageReports,
2223
- allPageReports,
2224
- filteredReports,
2225
- isError,
2226
- isFetching,
2227
- hasNextPage,
2228
- isFetchingNextPage,
2229
- fetchNextPage,
2230
- isCreating,
2231
- isUpdating,
2232
- isSubmittingReply,
2233
- isClaimingAssignee,
2234
- isDeleting,
2235
- queryErrorMessage,
2236
- refetch,
2237
- replyHistory,
2238
- replyHistoryByReportId,
2239
- loadRepliesIfNeeded,
2240
- loadOlderReplies,
2241
- goToOlderPaginationPage,
2242
- goToNewerPaginationPage,
2243
- errorMessage,
2244
- setErrorMessage,
2245
- draft,
2246
- hoveredTarget,
2247
- hoverPointer,
2248
- selectedTarget,
2249
- pickProbeOpen,
2250
- pickProbeSupportsTextFields,
2251
- pickProbeLayoutMode,
2252
- pickProbeValues,
2253
- pickProbeCompareMode,
2254
- pickProbeHasEdits,
2255
- pickTargetContextMenu,
2256
- contextMenuElementKey,
2257
- savedProbeEdits,
2258
- savedProbeDeletions,
2259
- hasProbeSessionChanges,
2260
- canUndoProbeSession,
2261
- canRedoProbeSession,
2262
- undoProbeSessionAction,
2263
- redoProbeSessionAction,
2264
- savedProbeCompareMode,
2265
- closePickProbe,
2266
- closePickTargetContextMenu,
2267
- handlePickTargetEdit,
2268
- handlePickTargetDelete,
2269
- handlePickTargetRevert,
2270
- commitPickProbeEdits,
2271
- revertSavedProbeEdit,
2272
- revertAllSavedProbeEdits,
2273
- setSavedProbeCompareMode,
2274
- setPickProbeCompareMode,
2275
- updatePickProbeValue,
2276
- resetPickProbeValues,
2277
- appendSavedProbeSummaryAsNewDraftCase,
2278
- markers,
2279
- selectedReport,
2280
- editingReportId,
2281
- editableDraft,
2282
- setEditableDraft,
2283
- overlayRef,
2284
- activeReplyReportId,
2285
- activeReplyReport,
2286
- tooltipReport,
2287
- tooltipAnchor,
2288
- tooltipFieldTags,
2289
- replyDraft,
2290
- setReplyDraft,
2291
- replySubmitAsQuestion,
2292
- setReplySubmitAsQuestion,
2293
- draftAuthorName,
2294
- setDraftAuthorName: setDraftAuthorNameSafe,
2295
- replyAuthorName,
2296
- setReplyAuthorName: setReplyAuthorNameSafe,
2297
- isPresentationMode,
2298
- sessionActor,
2299
- presentationViewers,
2300
- presentationViewerId: resolvedPresentationViewerId,
2301
- setPresentationViewerId: applyPresentationViewer,
2302
- pendingComposer,
2303
- startDenyReview,
2304
- startCheckoutReview,
2305
- startAskQuestion,
2306
- handleClaimAssignee,
2307
- handleTransferAssignee,
2308
- cancelPendingComposer,
2309
- confirmAuthorName,
2310
- setConfirmAuthorName,
2311
- showConfirmAuthorSelect,
2312
- toggleConfirmAuthorSelect,
2313
- handleConfirmResolution,
2314
- beginCaseEdit,
2315
- cancelCaseEdit,
2316
- handleCaseEditSave,
2317
- updateCaseEditDraftCase,
2318
- addCaseEditDraftCase,
2319
- removeCaseEditDraftCase,
2320
- focusedCaseId,
2321
- selectCase,
2322
- clearFocusedCase,
2323
- isCaseEditing,
2324
- caseEditReportId,
2325
- caseEditCases,
2326
- targetStats,
2327
- roleStatItems,
2328
- panelRole,
2329
- setPanelRole,
2330
- visiblePanelTabs,
2331
- visiblePanelTabsSummary,
2332
- resolvedTabAvailabilityContext,
2333
- setVisiblePanelTabs,
2334
- resetVisibleTabsToRoleDefault,
2335
- applyRoleDefaultTabsForOnboarding,
2336
- savePanelTabPreference,
2337
- storedPanelTabPreference: storedPreference,
2338
- statusText,
2339
- toggleReportMode,
2340
- toggleTargetPreview,
2341
- toggleIssueMode,
2342
- openPanelTab,
2343
- togglePanelTab,
2344
- selectReport,
2345
- locateFeedback,
2346
- focusSearchInput,
2347
- selectAdjacentReport,
2348
- openReplyComposer,
2349
- activateFeedbackMarker,
2350
- closeReplyComposer,
2351
- clearHoverLeaveTimeout,
2352
- scheduleHoverLeave,
2353
- setHoveredMarkerId,
2354
- handleOverlayMove,
2355
- handleOverlayContextMenu,
2356
- handleOverlayClick,
2357
- cancelDraft,
2358
- updateDraftCase,
2359
- addDraftCase,
2360
- removeDraftCase,
2361
- updateDraftField,
2362
- updateDraftCategory,
2363
- handleCreateSubmit,
2364
- startEditing,
2365
- stopEditing,
2366
- handleUpdateSubmit,
2367
- handleReplySubmit,
2368
- handleDelete,
2369
- canCreateGitHubIssueFromList: canCreateGitHubIssueFromListValue,
2370
- canCreateGitHubIssueOnCreate: canCreateGitHubIssueOnCreateValue,
2371
- creatingGitHubIssueId,
2372
- handleCreateGitHubIssue,
2373
- handleCreateSubmitWithGitHubIssue,
2374
- isDraftGitHubIssueSubmitting: creatingGitHubIssueId === "draft",
2375
- };
2376
- }
2377
- //# sourceMappingURL=useReportState.js.map