@fivepixels-js/react 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +648 -0
- package/dist/components/ShortcutHint.d.ts +8 -0
- package/dist/components/ShortcutHint.d.ts.map +1 -0
- package/dist/components/ShortcutHint.js +9 -0
- package/dist/components/ShortcutHint.js.map +1 -0
- package/dist/components/icons/Icons.d.ts +70 -0
- package/dist/components/icons/Icons.d.ts.map +1 -0
- package/dist/components/icons/Icons.js +127 -0
- package/dist/components/icons/Icons.js.map +1 -0
- package/dist/components/icons/MaterialIcon.d.ts +8 -0
- package/dist/components/icons/MaterialIcon.d.ts.map +1 -0
- package/dist/components/icons/MaterialIcon.js +5 -0
- package/dist/components/icons/MaterialIcon.js.map +1 -0
- package/dist/components/motion/index.d.ts +48 -0
- package/dist/components/motion/index.d.ts.map +1 -0
- package/dist/components/motion/index.js +910 -0
- package/dist/components/motion/index.js.map +1 -0
- package/dist/components/overlay/ReportOverlayLayer.d.ts +7 -0
- package/dist/components/overlay/ReportOverlayLayer.d.ts.map +1 -0
- package/dist/components/overlay/ReportOverlayLayer.js +14 -0
- package/dist/components/overlay/ReportOverlayLayer.js.map +1 -0
- package/dist/components/overlay/TargetHighlights.d.ts +9 -0
- package/dist/components/overlay/TargetHighlights.d.ts.map +1 -0
- package/dist/components/overlay/TargetHighlights.js +24 -0
- package/dist/components/overlay/TargetHighlights.js.map +1 -0
- package/dist/components/panel/PanelDockGuides.d.ts +8 -0
- package/dist/components/panel/PanelDockGuides.d.ts.map +1 -0
- package/dist/components/panel/PanelDockGuides.js +15 -0
- package/dist/components/panel/PanelDockGuides.js.map +1 -0
- package/dist/components/panel/PanelDropdownMenu.d.ts +19 -0
- package/dist/components/panel/PanelDropdownMenu.d.ts.map +1 -0
- package/dist/components/panel/PanelDropdownMenu.js +132 -0
- package/dist/components/panel/PanelDropdownMenu.js.map +1 -0
- package/dist/components/panel/PanelMoreMenu.d.ts +20 -0
- package/dist/components/panel/PanelMoreMenu.d.ts.map +1 -0
- package/dist/components/panel/PanelMoreMenu.js +20 -0
- package/dist/components/panel/PanelMoreMenu.js.map +1 -0
- package/dist/components/panel/PanelOptionSwitch.d.ts +14 -0
- package/dist/components/panel/PanelOptionSwitch.d.ts.map +1 -0
- package/dist/components/panel/PanelOptionSwitch.js +10 -0
- package/dist/components/panel/PanelOptionSwitch.js.map +1 -0
- package/dist/components/panel/ReportCommandPanel.d.ts +18 -0
- package/dist/components/panel/ReportCommandPanel.d.ts.map +1 -0
- package/dist/components/panel/ReportCommandPanel.js +43 -0
- package/dist/components/panel/ReportCommandPanel.js.map +1 -0
- package/dist/components/panel/ReportCommandReplaceConfirmDialog.d.ts +9 -0
- package/dist/components/panel/ReportCommandReplaceConfirmDialog.d.ts.map +1 -0
- package/dist/components/panel/ReportCommandReplaceConfirmDialog.js +7 -0
- package/dist/components/panel/ReportCommandReplaceConfirmDialog.js.map +1 -0
- package/dist/components/panel/ReportControlPanel.d.ts +2 -0
- package/dist/components/panel/ReportControlPanel.d.ts.map +1 -0
- package/dist/components/panel/ReportControlPanel.js +119 -0
- package/dist/components/panel/ReportControlPanel.js.map +1 -0
- package/dist/components/panel/ReportDraftForm.d.ts +2 -0
- package/dist/components/panel/ReportDraftForm.d.ts.map +1 -0
- package/dist/components/panel/ReportDraftForm.js +33 -0
- package/dist/components/panel/ReportDraftForm.js.map +1 -0
- package/dist/components/panel/ReportFeedbackList.d.ts +2 -0
- package/dist/components/panel/ReportFeedbackList.d.ts.map +1 -0
- package/dist/components/panel/ReportFeedbackList.js +165 -0
- package/dist/components/panel/ReportFeedbackList.js.map +1 -0
- package/dist/components/panel/ReportImportConfirmDialog.d.ts +8 -0
- package/dist/components/panel/ReportImportConfirmDialog.d.ts.map +1 -0
- package/dist/components/panel/ReportImportConfirmDialog.js +7 -0
- package/dist/components/panel/ReportImportConfirmDialog.js.map +1 -0
- package/dist/components/panel/ReportImportProjectMismatchDialog.d.ts +12 -0
- package/dist/components/panel/ReportImportProjectMismatchDialog.d.ts.map +1 -0
- package/dist/components/panel/ReportImportProjectMismatchDialog.js +19 -0
- package/dist/components/panel/ReportImportProjectMismatchDialog.js.map +1 -0
- package/dist/components/panel/ReportPersonalKeyDialog.d.ts +8 -0
- package/dist/components/panel/ReportPersonalKeyDialog.d.ts.map +1 -0
- package/dist/components/panel/ReportPersonalKeyDialog.js +60 -0
- package/dist/components/panel/ReportPersonalKeyDialog.js.map +1 -0
- package/dist/components/panel/ReportRouteDetails.d.ts +2 -0
- package/dist/components/panel/ReportRouteDetails.d.ts.map +1 -0
- package/dist/components/panel/ReportRouteDetails.js +18 -0
- package/dist/components/panel/ReportRouteDetails.js.map +1 -0
- package/dist/components/panel/feedback/AuthorSelector.d.ts +9 -0
- package/dist/components/panel/feedback/AuthorSelector.d.ts.map +1 -0
- package/dist/components/panel/feedback/AuthorSelector.js +17 -0
- package/dist/components/panel/feedback/AuthorSelector.js.map +1 -0
- package/dist/components/panel/feedback/FeedbackComposer.d.ts +23 -0
- package/dist/components/panel/feedback/FeedbackComposer.d.ts.map +1 -0
- package/dist/components/panel/feedback/FeedbackComposer.js +48 -0
- package/dist/components/panel/feedback/FeedbackComposer.js.map +1 -0
- package/dist/components/panel/feedback/FeedbackCreatorBadge.d.ts +2 -0
- package/dist/components/panel/feedback/FeedbackCreatorBadge.d.ts.map +1 -0
- package/dist/components/panel/feedback/FeedbackCreatorBadge.js +7 -0
- package/dist/components/panel/feedback/FeedbackCreatorBadge.js.map +1 -0
- package/dist/components/panel/feedback/FeedbackFieldTags.d.ts +9 -0
- package/dist/components/panel/feedback/FeedbackFieldTags.d.ts.map +1 -0
- package/dist/components/panel/feedback/FeedbackFieldTags.js +8 -0
- package/dist/components/panel/feedback/FeedbackFieldTags.js.map +1 -0
- package/dist/components/panel/feedback/FeedbackHoverCard.d.ts +11 -0
- package/dist/components/panel/feedback/FeedbackHoverCard.d.ts.map +1 -0
- package/dist/components/panel/feedback/FeedbackHoverCard.js +14 -0
- package/dist/components/panel/feedback/FeedbackHoverCard.js.map +1 -0
- package/dist/components/panel/feedback/FeedbackIssueHeader.d.ts +12 -0
- package/dist/components/panel/feedback/FeedbackIssueHeader.d.ts.map +1 -0
- package/dist/components/panel/feedback/FeedbackIssueHeader.js +10 -0
- package/dist/components/panel/feedback/FeedbackIssueHeader.js.map +1 -0
- package/dist/components/panel/feedback/FeedbackStatusBadge.d.ts +8 -0
- package/dist/components/panel/feedback/FeedbackStatusBadge.d.ts.map +1 -0
- package/dist/components/panel/feedback/FeedbackStatusBadge.js +10 -0
- package/dist/components/panel/feedback/FeedbackStatusBadge.js.map +1 -0
- package/dist/components/panel/feedback/FeedbackThread.d.ts +21 -0
- package/dist/components/panel/feedback/FeedbackThread.d.ts.map +1 -0
- package/dist/components/panel/feedback/FeedbackThread.js +90 -0
- package/dist/components/panel/feedback/FeedbackThread.js.map +1 -0
- package/dist/components/panel/feedback/FieldTagSelector.d.ts +9 -0
- package/dist/components/panel/feedback/FieldTagSelector.d.ts.map +1 -0
- package/dist/components/panel/feedback/FieldTagSelector.js +15 -0
- package/dist/components/panel/feedback/FieldTagSelector.js.map +1 -0
- package/dist/components/panel/feedback/GitIssueButton.d.ts +12 -0
- package/dist/components/panel/feedback/GitIssueButton.d.ts.map +1 -0
- package/dist/components/panel/feedback/GitIssueButton.js +43 -0
- package/dist/components/panel/feedback/GitIssueButton.js.map +1 -0
- package/dist/components/panel/feedback/GitIssuedThreadEntry.d.ts +8 -0
- package/dist/components/panel/feedback/GitIssuedThreadEntry.d.ts.map +1 -0
- package/dist/components/panel/feedback/GitIssuedThreadEntry.js +25 -0
- package/dist/components/panel/feedback/GitIssuedThreadEntry.js.map +1 -0
- package/dist/components/point/ReportDraftMarker.d.ts +2 -0
- package/dist/components/point/ReportDraftMarker.d.ts.map +1 -0
- package/dist/components/point/ReportDraftMarker.js +28 -0
- package/dist/components/point/ReportDraftMarker.js.map +1 -0
- package/dist/components/point/ReportMarkersLayer.d.ts +2 -0
- package/dist/components/point/ReportMarkersLayer.d.ts.map +1 -0
- package/dist/components/point/ReportMarkersLayer.js +129 -0
- package/dist/components/point/ReportMarkersLayer.js.map +1 -0
- package/dist/components/report/FivePixels.d.ts +50 -0
- package/dist/components/report/FivePixels.d.ts.map +1 -0
- package/dist/components/report/FivePixels.js +15 -0
- package/dist/components/report/FivePixels.js.map +1 -0
- package/dist/components/report/ReportView.d.ts +2 -0
- package/dist/components/report/ReportView.d.ts.map +1 -0
- package/dist/components/report/ReportView.js +14 -0
- package/dist/components/report/ReportView.js.map +1 -0
- package/dist/components/report/ShadowReportRoot.d.ts +9 -0
- package/dist/components/report/ShadowReportRoot.d.ts.map +1 -0
- package/dist/components/report/ShadowReportRoot.js +80 -0
- package/dist/components/report/ShadowReportRoot.js.map +1 -0
- package/dist/components/report/index.d.ts +13 -0
- package/dist/components/report/index.d.ts.map +1 -0
- package/dist/components/report/index.js +9 -0
- package/dist/components/report/index.js.map +1 -0
- package/dist/components/ui/HoverTooltip.d.ts +10 -0
- package/dist/components/ui/HoverTooltip.d.ts.map +1 -0
- package/dist/components/ui/HoverTooltip.js +64 -0
- package/dist/components/ui/HoverTooltip.js.map +1 -0
- package/dist/components/ui/IconTooltipButton.d.ts +12 -0
- package/dist/components/ui/IconTooltipButton.d.ts.map +1 -0
- package/dist/components/ui/IconTooltipButton.js +7 -0
- package/dist/components/ui/IconTooltipButton.js.map +1 -0
- package/dist/constants/feedbackStatus.d.ts +6 -0
- package/dist/constants/feedbackStatus.d.ts.map +1 -0
- package/dist/constants/feedbackStatus.js +27 -0
- package/dist/constants/feedbackStatus.js.map +1 -0
- package/dist/constants/project.d.ts +2 -0
- package/dist/constants/project.d.ts.map +1 -0
- package/dist/constants/project.js +2 -0
- package/dist/constants/project.js.map +1 -0
- package/dist/constants/report.d.ts +7 -0
- package/dist/constants/report.d.ts.map +1 -0
- package/dist/constants/report.js +14 -0
- package/dist/constants/report.js.map +1 -0
- package/dist/constants/reportShortcuts.d.ts +31 -0
- package/dist/constants/reportShortcuts.d.ts.map +1 -0
- package/dist/constants/reportShortcuts.js +9 -0
- package/dist/constants/reportShortcuts.js.map +1 -0
- package/dist/constants/storageKeys.d.ts +5 -0
- package/dist/constants/storageKeys.d.ts.map +1 -0
- package/dist/constants/storageKeys.js +16 -0
- package/dist/constants/storageKeys.js.map +1 -0
- package/dist/hooks/report.api.d.ts +8 -0
- package/dist/hooks/report.api.d.ts.map +1 -0
- package/dist/hooks/report.api.js +20 -0
- package/dist/hooks/report.api.js.map +1 -0
- package/dist/hooks/report.query.d.ts +27 -0
- package/dist/hooks/report.query.d.ts.map +1 -0
- package/dist/hooks/report.query.js +137 -0
- package/dist/hooks/report.query.js.map +1 -0
- package/dist/hooks/useAppearancePreference.d.ts +6 -0
- package/dist/hooks/useAppearancePreference.d.ts.map +1 -0
- package/dist/hooks/useAppearancePreference.js +40 -0
- package/dist/hooks/useAppearancePreference.js.map +1 -0
- package/dist/hooks/useCurrentPathname.d.ts +2 -0
- package/dist/hooks/useCurrentPathname.d.ts.map +1 -0
- package/dist/hooks/useCurrentPathname.js +18 -0
- package/dist/hooks/useCurrentPathname.js.map +1 -0
- package/dist/hooks/useIsMobileViewport.d.ts +2 -0
- package/dist/hooks/useIsMobileViewport.d.ts.map +1 -0
- package/dist/hooks/useIsMobileViewport.js +12 -0
- package/dist/hooks/useIsMobileViewport.js.map +1 -0
- package/dist/hooks/useLocalePreference.d.ts +6 -0
- package/dist/hooks/useLocalePreference.d.ts.map +1 -0
- package/dist/hooks/useLocalePreference.js +40 -0
- package/dist/hooks/useLocalePreference.js.map +1 -0
- package/dist/hooks/useNativeHover.d.ts +7 -0
- package/dist/hooks/useNativeHover.d.ts.map +1 -0
- package/dist/hooks/useNativeHover.js +28 -0
- package/dist/hooks/useNativeHover.js.map +1 -0
- package/dist/hooks/usePanelDock.d.ts +29 -0
- package/dist/hooks/usePanelDock.d.ts.map +1 -0
- package/dist/hooks/usePanelDock.js +279 -0
- package/dist/hooks/usePanelDock.js.map +1 -0
- package/dist/hooks/usePanelFeedbackTransfer.d.ts +59 -0
- package/dist/hooks/usePanelFeedbackTransfer.d.ts.map +1 -0
- package/dist/hooks/usePanelFeedbackTransfer.js +250 -0
- package/dist/hooks/usePanelFeedbackTransfer.js.map +1 -0
- package/dist/hooks/usePersonalKey.d.ts +30 -0
- package/dist/hooks/usePersonalKey.d.ts.map +1 -0
- package/dist/hooks/usePersonalKey.js +72 -0
- package/dist/hooks/usePersonalKey.js.map +1 -0
- package/dist/hooks/useReportPersistence.d.ts +63 -0
- package/dist/hooks/useReportPersistence.d.ts.map +1 -0
- package/dist/hooks/useReportPersistence.js +142 -0
- package/dist/hooks/useReportPersistence.js.map +1 -0
- package/dist/hooks/useReportShortcuts.d.ts +5 -0
- package/dist/hooks/useReportShortcuts.d.ts.map +1 -0
- package/dist/hooks/useReportShortcuts.js +117 -0
- package/dist/hooks/useReportShortcuts.js.map +1 -0
- package/dist/hooks/useReportState.d.ts +177 -0
- package/dist/hooks/useReportState.d.ts.map +1 -0
- package/dist/hooks/useReportState.js +904 -0
- package/dist/hooks/useReportState.js.map +1 -0
- package/dist/hooks/useResolvedAppearance.d.ts +4 -0
- package/dist/hooks/useResolvedAppearance.d.ts.map +1 -0
- package/dist/hooks/useResolvedAppearance.js +23 -0
- package/dist/hooks/useResolvedAppearance.js.map +1 -0
- package/dist/hooks/useTooltipLayout.d.ts +21 -0
- package/dist/hooks/useTooltipLayout.d.ts.map +1 -0
- package/dist/hooks/useTooltipLayout.js +45 -0
- package/dist/hooks/useTooltipLayout.js.map +1 -0
- package/dist/i18n/en.d.ts +3 -0
- package/dist/i18n/en.d.ts.map +1 -0
- package/dist/i18n/en.js +277 -0
- package/dist/i18n/en.js.map +1 -0
- package/dist/i18n/index.d.ts +20 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +77 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/ko.d.ts +3 -0
- package/dist/i18n/ko.d.ts.map +1 -0
- package/dist/i18n/ko.js +277 -0
- package/dist/i18n/ko.js.map +1 -0
- package/dist/i18n/types.d.ts +267 -0
- package/dist/i18n/types.d.ts.map +1 -0
- package/dist/i18n/types.js +2 -0
- package/dist/i18n/types.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/ReportProvider.d.ts +52 -0
- package/dist/providers/ReportProvider.d.ts.map +1 -0
- package/dist/providers/ReportProvider.js +49 -0
- package/dist/providers/ReportProvider.js.map +1 -0
- package/dist/providers/reportContext.d.ts +286 -0
- package/dist/providers/reportContext.d.ts.map +1 -0
- package/dist/providers/reportContext.js +11 -0
- package/dist/providers/reportContext.js.map +1 -0
- package/dist/storage/local/localStorageAdapter.d.ts +12 -0
- package/dist/storage/local/localStorageAdapter.d.ts.map +1 -0
- package/dist/storage/local/localStorageAdapter.js +187 -0
- package/dist/storage/local/localStorageAdapter.js.map +1 -0
- package/dist/styles/reportStylesheet.d.ts +2 -0
- package/dist/styles/reportStylesheet.d.ts.map +1 -0
- package/dist/styles/reportStylesheet.js +3 -0
- package/dist/styles/reportStylesheet.js.map +1 -0
- package/dist/types/report-ui.d.ts +47 -0
- package/dist/types/report-ui.d.ts.map +1 -0
- package/dist/types/report-ui.js +2 -0
- package/dist/types/report-ui.js.map +1 -0
- package/dist/types/report.d.ts +177 -0
- package/dist/types/report.d.ts.map +1 -0
- package/dist/types/report.js +8 -0
- package/dist/types/report.js.map +1 -0
- package/dist/utils/coordinates.d.ts +63 -0
- package/dist/utils/coordinates.d.ts.map +1 -0
- package/dist/utils/coordinates.js +236 -0
- package/dist/utils/coordinates.js.map +1 -0
- package/dist/utils/dom.d.ts +14 -0
- package/dist/utils/dom.d.ts.map +1 -0
- package/dist/utils/dom.js +104 -0
- package/dist/utils/dom.js.map +1 -0
- package/dist/utils/env.d.ts +6 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/env.js +18 -0
- package/dist/utils/env.js.map +1 -0
- package/dist/utils/feedbackDataTransfer.d.ts +31 -0
- package/dist/utils/feedbackDataTransfer.d.ts.map +1 -0
- package/dist/utils/feedbackDataTransfer.js +195 -0
- package/dist/utils/feedbackDataTransfer.js.map +1 -0
- package/dist/utils/feedbackThread.d.ts +14 -0
- package/dist/utils/feedbackThread.d.ts.map +1 -0
- package/dist/utils/feedbackThread.js +57 -0
- package/dist/utils/feedbackThread.js.map +1 -0
- package/dist/utils/feedbackTransferSchema.d.ts +37 -0
- package/dist/utils/feedbackTransferSchema.d.ts.map +1 -0
- package/dist/utils/feedbackTransferSchema.js +162 -0
- package/dist/utils/feedbackTransferSchema.js.map +1 -0
- package/dist/utils/fields.d.ts +11 -0
- package/dist/utils/fields.d.ts.map +1 -0
- package/dist/utils/fields.js +43 -0
- package/dist/utils/fields.js.map +1 -0
- package/dist/utils/format.d.ts +6 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +46 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/formatStatCount.d.ts +2 -0
- package/dist/utils/formatStatCount.d.ts.map +1 -0
- package/dist/utils/formatStatCount.js +4 -0
- package/dist/utils/formatStatCount.js.map +1 -0
- package/dist/utils/githubIntegration.d.ts +12 -0
- package/dist/utils/githubIntegration.d.ts.map +1 -0
- package/dist/utils/githubIntegration.js +56 -0
- package/dist/utils/githubIntegration.js.map +1 -0
- package/dist/utils/hoverTooltipLayout.d.ts +8 -0
- package/dist/utils/hoverTooltipLayout.d.ts.map +1 -0
- package/dist/utils/hoverTooltipLayout.js +30 -0
- package/dist/utils/hoverTooltipLayout.js.map +1 -0
- package/dist/utils/locateFeedback.d.ts +11 -0
- package/dist/utils/locateFeedback.d.ts.map +1 -0
- package/dist/utils/locateFeedback.js +16 -0
- package/dist/utils/locateFeedback.js.map +1 -0
- package/dist/utils/panelTypography.d.ts +4 -0
- package/dist/utils/panelTypography.d.ts.map +1 -0
- package/dist/utils/panelTypography.js +4 -0
- package/dist/utils/panelTypography.js.map +1 -0
- package/dist/utils/pathname.d.ts +2 -0
- package/dist/utils/pathname.d.ts.map +1 -0
- package/dist/utils/pathname.js +10 -0
- package/dist/utils/pathname.js.map +1 -0
- package/dist/utils/pathnameNavigation.d.ts +4 -0
- package/dist/utils/pathnameNavigation.d.ts.map +1 -0
- package/dist/utils/pathnameNavigation.js +52 -0
- package/dist/utils/pathnameNavigation.js.map +1 -0
- package/dist/utils/personalKey.d.ts +45 -0
- package/dist/utils/personalKey.d.ts.map +1 -0
- package/dist/utils/personalKey.js +180 -0
- package/dist/utils/personalKey.js.map +1 -0
- package/dist/utils/projectId.d.ts +2 -0
- package/dist/utils/projectId.d.ts.map +1 -0
- package/dist/utils/projectId.js +14 -0
- package/dist/utils/projectId.js.map +1 -0
- package/dist/utils/reportCallbacks.d.ts +20 -0
- package/dist/utils/reportCallbacks.d.ts.map +1 -0
- package/dist/utils/reportCallbacks.js +42 -0
- package/dist/utils/reportCallbacks.js.map +1 -0
- package/dist/utils/reportProject.d.ts +17 -0
- package/dist/utils/reportProject.d.ts.map +1 -0
- package/dist/utils/reportProject.js +9 -0
- package/dist/utils/reportProject.js.map +1 -0
- package/dist/utils/reportTeam.d.ts +15 -0
- package/dist/utils/reportTeam.d.ts.map +1 -0
- package/dist/utils/reportTeam.js +8 -0
- package/dist/utils/reportTeam.js.map +1 -0
- package/dist/utils/reportUi.d.ts +24 -0
- package/dist/utils/reportUi.d.ts.map +1 -0
- package/dist/utils/reportUi.js +19 -0
- package/dist/utils/reportUi.js.map +1 -0
- package/dist/utils/reportVisibility.d.ts +19 -0
- package/dist/utils/reportVisibility.d.ts.map +1 -0
- package/dist/utils/reportVisibility.js +12 -0
- package/dist/utils/reportVisibility.js.map +1 -0
- package/dist/utils/reportVisual.d.ts +12 -0
- package/dist/utils/reportVisual.d.ts.map +1 -0
- package/dist/utils/reportVisual.js +31 -0
- package/dist/utils/reportVisual.js.map +1 -0
- package/dist/utils/routeDetailStatus.d.ts +7 -0
- package/dist/utils/routeDetailStatus.d.ts.map +1 -0
- package/dist/utils/routeDetailStatus.js +29 -0
- package/dist/utils/routeDetailStatus.js.map +1 -0
- package/dist/utils/shortcuts.d.ts +12 -0
- package/dist/utils/shortcuts.d.ts.map +1 -0
- package/dist/utils/shortcuts.js +59 -0
- package/dist/utils/shortcuts.js.map +1 -0
- package/dist/utils/storage.d.ts +17 -0
- package/dist/utils/storage.d.ts.map +1 -0
- package/dist/utils/storage.js +36 -0
- package/dist/utils/storage.js.map +1 -0
- package/dist/utils/validateFeedbackImport.d.ts +4 -0
- package/dist/utils/validateFeedbackImport.d.ts.map +1 -0
- package/dist/utils/validateFeedbackImport.js +187 -0
- package/dist/utils/validateFeedbackImport.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { ReportAuthAction, ReportAuthor, ReportIdentify } from "../types/report.js";
|
|
2
|
+
type UsePersonalKeyOptions = {
|
|
3
|
+
enabled: boolean;
|
|
4
|
+
projectId: string;
|
|
5
|
+
environment?: string;
|
|
6
|
+
identify?: ReportIdentify;
|
|
7
|
+
authors: ReportAuthor[];
|
|
8
|
+
};
|
|
9
|
+
export declare function usePersonalKey({ enabled, projectId, environment, identify, authors }: UsePersonalKeyOptions): {
|
|
10
|
+
personalKey: string | null;
|
|
11
|
+
publicKey: string | null;
|
|
12
|
+
personalKeyRequired: boolean;
|
|
13
|
+
personalKeyPendingRegistration: boolean;
|
|
14
|
+
personalKeyCandidates: ReportAuthor[];
|
|
15
|
+
authorizedAuthors: ReportIdentify[];
|
|
16
|
+
issuePersonalKey: (authorId?: string) => Promise<{
|
|
17
|
+
privateKey: string;
|
|
18
|
+
publicKey: string;
|
|
19
|
+
} | null>;
|
|
20
|
+
rotatePersonalKey: () => Promise<{
|
|
21
|
+
privateKey: string;
|
|
22
|
+
publicKey: string;
|
|
23
|
+
} | null>;
|
|
24
|
+
insertPersonalKey: (key: string) => Promise<{
|
|
25
|
+
authorized: boolean;
|
|
26
|
+
} | null>;
|
|
27
|
+
signPayload: (action: ReportAuthAction, payload: unknown) => Promise<import("../types/report.js").ReportAuthProof | null>;
|
|
28
|
+
};
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=usePersonalKey.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePersonalKey.d.ts","sourceRoot":"","sources":["../../src/hooks/usePersonalKey.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAYxF,KAAK,qBAAqB,GAAG;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,OAAO,EAAE,YAAY,EAAE,CAAC;CAC3B,CAAC;AAEF,wBAAgB,cAAc,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,qBAAqB;;;;;;;kCAqBjD,MAAM;;;;;;;;6BAyB7C,MAAM;;;0BAkBH,gBAAgB,WAAW,OAAO;EA2BxD"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { useCallback, useEffect, useMemo, useState } from "react";
|
|
2
|
+
import { createReviewerKeyPair, getPublicKeyFromPrivateKey, parsePrivateKeyBundle, readPersonalKey, resolvePersonalKeyAuthor, resolvePersonalKeyOwner, savePersonalKey, signReportPayload, } from "../utils/personalKey.js";
|
|
3
|
+
export function usePersonalKey({ enabled, projectId, environment, identify, authors }) {
|
|
4
|
+
const [personalKey, setPersonalKey] = useState(null);
|
|
5
|
+
const [isReady, setIsReady] = useState(!enabled);
|
|
6
|
+
useEffect(() => {
|
|
7
|
+
if (!enabled) {
|
|
8
|
+
setPersonalKey(null);
|
|
9
|
+
setIsReady(true);
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
setPersonalKey(readPersonalKey(projectId, environment));
|
|
13
|
+
setIsReady(true);
|
|
14
|
+
}, [enabled, environment, projectId]);
|
|
15
|
+
const keyBundle = useMemo(() => (personalKey ? parsePrivateKeyBundle(personalKey) : null), [personalKey]);
|
|
16
|
+
const authorizedAuthor = useMemo(() => (keyBundle ? resolvePersonalKeyAuthor(keyBundle, identify, authors) : undefined), [authors, identify, keyBundle]);
|
|
17
|
+
const issuePersonalKey = useCallback(async (authorId) => {
|
|
18
|
+
const owner = authors.find((author) => author.id === authorId) ?? resolvePersonalKeyOwner(identify, authors);
|
|
19
|
+
if (!owner) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
const issued = await createReviewerKeyPair(projectId, environment, owner.id);
|
|
23
|
+
savePersonalKey(projectId, environment, issued.privateKey);
|
|
24
|
+
setPersonalKey(issued.privateKey);
|
|
25
|
+
return issued;
|
|
26
|
+
}, [authors, environment, identify, projectId]);
|
|
27
|
+
const rotatePersonalKey = useCallback(async () => {
|
|
28
|
+
if (!authorizedAuthor) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
const issued = await createReviewerKeyPair(projectId, environment, authorizedAuthor.id);
|
|
32
|
+
savePersonalKey(projectId, environment, issued.privateKey);
|
|
33
|
+
setPersonalKey(issued.privateKey);
|
|
34
|
+
return issued;
|
|
35
|
+
}, [authorizedAuthor, environment, projectId]);
|
|
36
|
+
const insertPersonalKey = useCallback(async (key) => {
|
|
37
|
+
const saved = savePersonalKey(projectId, environment, key);
|
|
38
|
+
if (saved) {
|
|
39
|
+
setPersonalKey(key.trim());
|
|
40
|
+
}
|
|
41
|
+
const bundle = saved ? parsePrivateKeyBundle(key) : null;
|
|
42
|
+
return bundle
|
|
43
|
+
? {
|
|
44
|
+
authorized: Boolean(resolvePersonalKeyAuthor(bundle, identify, authors)),
|
|
45
|
+
}
|
|
46
|
+
: null;
|
|
47
|
+
}, [authors, environment, identify, projectId]);
|
|
48
|
+
const signPayload = useCallback(async (action, payload) => {
|
|
49
|
+
if (!personalKey || !authorizedAuthor) {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
return signReportPayload(personalKey, {
|
|
53
|
+
projectId,
|
|
54
|
+
environment,
|
|
55
|
+
action,
|
|
56
|
+
payload,
|
|
57
|
+
});
|
|
58
|
+
}, [authorizedAuthor, environment, personalKey, projectId]);
|
|
59
|
+
return {
|
|
60
|
+
personalKey,
|
|
61
|
+
publicKey: personalKey ? getPublicKeyFromPrivateKey(personalKey) : null,
|
|
62
|
+
personalKeyRequired: enabled && isReady && !authorizedAuthor,
|
|
63
|
+
personalKeyPendingRegistration: enabled && Boolean(personalKey) && !authorizedAuthor,
|
|
64
|
+
personalKeyCandidates: authors,
|
|
65
|
+
authorizedAuthors: enabled ? (authorizedAuthor ? [authorizedAuthor] : []) : authors,
|
|
66
|
+
issuePersonalKey,
|
|
67
|
+
rotatePersonalKey,
|
|
68
|
+
insertPersonalKey,
|
|
69
|
+
signPayload,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=usePersonalKey.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePersonalKey.js","sourceRoot":"","sources":["../../src/hooks/usePersonalKey.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { CreateReportFeedbackPayload, ReportFeedback, ReportField, ReportPersistenceHandlers, ReportStorageAdapter, UpdateReportFeedbackPayload } from "../types/report.js";
|
|
2
|
+
import type { ReportFilters, ReportListScope } from "../types/report-ui.js";
|
|
3
|
+
export type ReportPersistenceConfig = {
|
|
4
|
+
projectId: string;
|
|
5
|
+
environment?: string;
|
|
6
|
+
appVersion?: string;
|
|
7
|
+
fields: ReportField[];
|
|
8
|
+
onList?: (params: {
|
|
9
|
+
pathname: string;
|
|
10
|
+
}) => Promise<ReportFeedback[]>;
|
|
11
|
+
onListAll?: ReportPersistenceHandlers["onListAll"];
|
|
12
|
+
onCreate?: (payload: CreateReportFeedbackPayload) => Promise<ReportFeedback>;
|
|
13
|
+
onUpdate?: (id: string, payload: UpdateReportFeedbackPayload) => Promise<ReportFeedback>;
|
|
14
|
+
onDelete?: (id: string) => Promise<void>;
|
|
15
|
+
routeKey?: string;
|
|
16
|
+
};
|
|
17
|
+
export declare function useReportPersistence({ projectId, environment, appVersion, fields, onList, onListAll, onCreate, onUpdate, onDelete, routeKey, }: ReportPersistenceConfig): {
|
|
18
|
+
storageAdapterInstance: ReportStorageAdapter;
|
|
19
|
+
canTransferFeedback: boolean;
|
|
20
|
+
canListAllFeedback: boolean;
|
|
21
|
+
currentPathname: string;
|
|
22
|
+
listScope: ReportListScope;
|
|
23
|
+
setListScope: import("react").Dispatch<import("react").SetStateAction<ReportListScope>>;
|
|
24
|
+
filters: ReportFilters;
|
|
25
|
+
setFilters: import("react").Dispatch<import("react").SetStateAction<ReportFilters>>;
|
|
26
|
+
selectedReportId: string | null;
|
|
27
|
+
setSelectedReportId: import("react").Dispatch<import("react").SetStateAction<string | null>>;
|
|
28
|
+
reports: ReportFeedback[];
|
|
29
|
+
filteredReports: ReportFeedback[];
|
|
30
|
+
currentPageFilteredReports: ReportFeedback[];
|
|
31
|
+
routeDetailsStats: {
|
|
32
|
+
pathname: string;
|
|
33
|
+
statusRows: {
|
|
34
|
+
status: import("../constants/feedbackStatus.js").FeedbackDisplayStatus;
|
|
35
|
+
all: number;
|
|
36
|
+
today: number;
|
|
37
|
+
}[];
|
|
38
|
+
fieldCounts: {
|
|
39
|
+
key: string;
|
|
40
|
+
label: string;
|
|
41
|
+
type: "textarea" | "checkbox";
|
|
42
|
+
count: number;
|
|
43
|
+
}[];
|
|
44
|
+
};
|
|
45
|
+
selectedReport: ReportFeedback;
|
|
46
|
+
isError: boolean;
|
|
47
|
+
isFetching: boolean;
|
|
48
|
+
hasNextPage: boolean;
|
|
49
|
+
isFetchingNextPage: boolean;
|
|
50
|
+
fetchNextPage: () => Promise<void>;
|
|
51
|
+
isCreating: boolean;
|
|
52
|
+
isUpdating: boolean;
|
|
53
|
+
isDeleting: boolean;
|
|
54
|
+
queryErrorMessage: string | undefined;
|
|
55
|
+
refetch: () => Promise<ReportFeedback[]>;
|
|
56
|
+
createFeedback: (payload: CreateReportFeedbackPayload) => Promise<ReportFeedback>;
|
|
57
|
+
updateFeedback: (id: string, payload: UpdateReportFeedbackPayload) => Promise<ReportFeedback>;
|
|
58
|
+
deleteFeedback: (id: string) => Promise<void>;
|
|
59
|
+
};
|
|
60
|
+
export type ReportPersistenceState = ReturnType<typeof useReportPersistence> & {
|
|
61
|
+
storageAdapterInstance: ReportStorageAdapter;
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=useReportPersistence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useReportPersistence.d.ts","sourceRoot":"","sources":["../../src/hooks/useReportPersistence.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACR,2BAA2B,EAC3B,cAAc,EACd,WAAW,EACX,yBAAyB,EACzB,oBAAoB,EACpB,2BAA2B,EAC9B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAM3E,MAAM,MAAM,uBAAuB,GAAG;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IACrE,SAAS,CAAC,EAAE,yBAAyB,CAAC,WAAW,CAAC,CAAC;IACnD,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,2BAA2B,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7E,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,2BAA2B,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IACzF,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAqBF,wBAAgB,oBAAoB,CAAC,EACjC,SAAS,EACT,WAAW,EACX,UAAU,EACV,MAAM,EACN,MAAM,EACN,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,GACX,EAAE,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkJzB;AAED,MAAM,MAAM,sBAAsB,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,GAAG;IAC3E,sBAAsB,EAAE,oBAAoB,CAAC;CAChD,CAAC"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { useEffect, useMemo, useState } from "react";
|
|
2
|
+
import { useCreateReportMutation, useDeleteReportMutation, useReportsQuery, useUpdateReportMutation } from "./report.query.js";
|
|
3
|
+
import { useCurrentPathname } from "./useCurrentPathname.js";
|
|
4
|
+
import { getRouteDetailStatus, isCreatedToday } from "../utils/routeDetailStatus.js";
|
|
5
|
+
import { getFeedbackDisplayStatus } from "../utils/feedbackThread.js";
|
|
6
|
+
import { FEEDBACK_DISPLAY_STATUS_ORDER } from "../constants/feedbackStatus.js";
|
|
7
|
+
import { resolveStorageAdapter } from "../utils/storage.js";
|
|
8
|
+
function filterReports(reports, filters) {
|
|
9
|
+
return reports.filter((report) => {
|
|
10
|
+
if (filters.status !== "all" && getRouteDetailStatus(report) !== filters.status) {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
if (filters.reportType !== "all" && report.report_type !== filters.reportType) {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
if (!filters.keyword.trim()) {
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
const keyword = filters.keyword.trim().toLowerCase();
|
|
20
|
+
return [report.message, report.report_id, report.status, report.pathname].join(" ").toLowerCase().includes(keyword);
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
export function useReportPersistence({ projectId, environment, appVersion, fields, onList, onListAll, onCreate, onUpdate, onDelete, routeKey, }) {
|
|
24
|
+
const { adapter: storageAdapterInstance, usesLocalStorage } = useMemo(() => resolveStorageAdapter({ projectId, environment, appVersion, onList, onListAll, onCreate, onUpdate, onDelete }), [appVersion, environment, onCreate, onDelete, onList, onListAll, onUpdate, projectId]);
|
|
25
|
+
const canTransferFeedback = usesLocalStorage;
|
|
26
|
+
const currentPathname = useCurrentPathname(routeKey);
|
|
27
|
+
const [filters, setFilters] = useState({
|
|
28
|
+
keyword: "",
|
|
29
|
+
status: "all",
|
|
30
|
+
reportType: "all",
|
|
31
|
+
});
|
|
32
|
+
const [selectedReportId, setSelectedReportId] = useState(null);
|
|
33
|
+
const [listScope, setListScope] = useState("current");
|
|
34
|
+
const currentReportsQuery = useReportsQuery(storageAdapterInstance, currentPathname, "current", true);
|
|
35
|
+
const allReportsQuery = useReportsQuery(storageAdapterInstance, currentPathname, "all", listScope === "all" && Boolean(storageAdapterInstance.listAll));
|
|
36
|
+
const activeReportsQuery = listScope === "all" ? allReportsQuery : currentReportsQuery;
|
|
37
|
+
const reports = activeReportsQuery.data;
|
|
38
|
+
const { error, isError, isFetching, hasNextPage, isFetchingNextPage, fetchNextPage, refetch } = activeReportsQuery;
|
|
39
|
+
const { mutateAsync: createFeedback, isPending: isCreating } = useCreateReportMutation(storageAdapterInstance, () => {
|
|
40
|
+
void refetch();
|
|
41
|
+
if (listScope === "all") {
|
|
42
|
+
void currentReportsQuery.refetch();
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
const { mutateAsync: updateFeedback, isPending: isUpdating } = useUpdateReportMutation(storageAdapterInstance, () => {
|
|
46
|
+
void refetch();
|
|
47
|
+
if (listScope === "all") {
|
|
48
|
+
void currentReportsQuery.refetch();
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
const { mutateAsync: deleteFeedback, isPending: isDeleting } = useDeleteReportMutation(storageAdapterInstance, () => {
|
|
52
|
+
void refetch();
|
|
53
|
+
if (listScope === "all") {
|
|
54
|
+
void currentReportsQuery.refetch();
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
const filteredReports = useMemo(() => filterReports(reports, filters), [filters, reports]);
|
|
58
|
+
const currentPageFilteredReports = useMemo(() => filterReports(currentReportsQuery.data, filters), [currentReportsQuery.data, filters]);
|
|
59
|
+
const routeDetailsStats = useMemo(() => {
|
|
60
|
+
const currentPageReports = currentReportsQuery.data;
|
|
61
|
+
const statusRows = FEEDBACK_DISPLAY_STATUS_ORDER.map((status) => ({
|
|
62
|
+
status,
|
|
63
|
+
all: 0,
|
|
64
|
+
today: 0,
|
|
65
|
+
}));
|
|
66
|
+
const statusIndex = new Map(statusRows.map((row, index) => [row.status, index]));
|
|
67
|
+
for (const report of currentPageReports) {
|
|
68
|
+
const status = getFeedbackDisplayStatus(report, true);
|
|
69
|
+
const index = statusIndex.get(status);
|
|
70
|
+
if (index === undefined) {
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
statusRows[index].all += 1;
|
|
74
|
+
if (isCreatedToday(report.created_at)) {
|
|
75
|
+
statusRows[index].today += 1;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
const fieldCounts = fields
|
|
79
|
+
.filter((field) => field.key !== "message")
|
|
80
|
+
.map((field) => {
|
|
81
|
+
const count = currentPageReports.filter((report) => {
|
|
82
|
+
if (field.type === "checkbox") {
|
|
83
|
+
return report.field_values[field.key] === true;
|
|
84
|
+
}
|
|
85
|
+
return String(report.field_values[field.key] ?? "").trim().length > 0;
|
|
86
|
+
}).length;
|
|
87
|
+
return {
|
|
88
|
+
key: field.key,
|
|
89
|
+
label: field.label,
|
|
90
|
+
type: field.type,
|
|
91
|
+
count,
|
|
92
|
+
};
|
|
93
|
+
});
|
|
94
|
+
return {
|
|
95
|
+
pathname: currentPathname,
|
|
96
|
+
statusRows,
|
|
97
|
+
fieldCounts,
|
|
98
|
+
};
|
|
99
|
+
}, [currentPathname, currentReportsQuery.data, fields]);
|
|
100
|
+
const selectedReport = useMemo(() => {
|
|
101
|
+
return filteredReports.find((report) => report.id === selectedReportId) ?? filteredReports[0] ?? null;
|
|
102
|
+
}, [filteredReports, selectedReportId]);
|
|
103
|
+
useEffect(() => {
|
|
104
|
+
if (!selectedReportId) {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
if (!filteredReports.some((report) => report.id === selectedReportId)) {
|
|
108
|
+
setSelectedReportId(filteredReports[0]?.id ?? null);
|
|
109
|
+
}
|
|
110
|
+
}, [filteredReports, selectedReportId]);
|
|
111
|
+
return {
|
|
112
|
+
storageAdapterInstance,
|
|
113
|
+
canTransferFeedback,
|
|
114
|
+
canListAllFeedback: Boolean(storageAdapterInstance.listAll),
|
|
115
|
+
currentPathname,
|
|
116
|
+
listScope,
|
|
117
|
+
setListScope,
|
|
118
|
+
filters,
|
|
119
|
+
setFilters,
|
|
120
|
+
selectedReportId,
|
|
121
|
+
setSelectedReportId,
|
|
122
|
+
reports,
|
|
123
|
+
filteredReports,
|
|
124
|
+
currentPageFilteredReports,
|
|
125
|
+
routeDetailsStats,
|
|
126
|
+
selectedReport,
|
|
127
|
+
isError,
|
|
128
|
+
isFetching,
|
|
129
|
+
hasNextPage,
|
|
130
|
+
isFetchingNextPage,
|
|
131
|
+
fetchNextPage,
|
|
132
|
+
isCreating,
|
|
133
|
+
isUpdating,
|
|
134
|
+
isDeleting,
|
|
135
|
+
queryErrorMessage: error?.message,
|
|
136
|
+
refetch,
|
|
137
|
+
createFeedback,
|
|
138
|
+
updateFeedback,
|
|
139
|
+
deleteFeedback,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=useReportPersistence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useReportPersistence.js","sourceRoot":"","sources":["../../src/hooks/useReportPersistence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { useReportState } from "./useReportState.js";
|
|
2
|
+
type ReportShortcutHandlers = Pick<ReturnType<typeof useReportState>, "mode" | "draft" | "editingReportId" | "panelTab" | "showTargetPreview" | "activeReplyReportId" | "pendingComposer" | "toggleReportMode" | "toggleTargetPreview" | "toggleIssueMode" | "cancelDraft" | "cancelPendingComposer" | "closeReplyComposer" | "handleCreateSubmit" | "stopEditing" | "handleUpdateSubmit" | "focusSearchInput" | "selectAdjacentReport">;
|
|
3
|
+
export declare function useReportShortcuts(handlers: ReportShortcutHandlers): void;
|
|
4
|
+
export {};
|
|
5
|
+
//# sourceMappingURL=useReportShortcuts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useReportShortcuts.d.ts","sourceRoot":"","sources":["../../src/hooks/useReportShortcuts.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,KAAK,sBAAsB,GAAG,IAAI,CAC9B,UAAU,CAAC,OAAO,cAAc,CAAC,EAC/B,MAAM,GACN,OAAO,GACP,iBAAiB,GACjB,UAAU,GACV,mBAAmB,GACnB,qBAAqB,GACrB,iBAAiB,GACjB,kBAAkB,GAClB,qBAAqB,GACrB,iBAAiB,GACjB,aAAa,GACb,uBAAuB,GACvB,oBAAoB,GACpB,oBAAoB,GACpB,aAAa,GACb,oBAAoB,GACpB,kBAAkB,GAClB,sBAAsB,CAC3B,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,sBAAsB,QAwJlE"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { useEffect } from "react";
|
|
2
|
+
import { REPORT_SHORTCUTS } from "../constants/reportShortcuts.js";
|
|
3
|
+
import { isEditableTarget, matchesShortcut } from "../utils/shortcuts.js";
|
|
4
|
+
export function useReportShortcuts(handlers) {
|
|
5
|
+
const { mode, draft, editingReportId, panelTab, showTargetPreview, activeReplyReportId, pendingComposer, toggleReportMode, toggleTargetPreview, toggleIssueMode, cancelDraft, cancelPendingComposer, closeReplyComposer, handleCreateSubmit, stopEditing, handleUpdateSubmit, focusSearchInput, selectAdjacentReport, } = handlers;
|
|
6
|
+
useEffect(() => {
|
|
7
|
+
const handleKeyDown = (event) => {
|
|
8
|
+
const inEditable = isEditableTarget(event.target);
|
|
9
|
+
const isFeedbackListOpen = panelTab === "feedback-list";
|
|
10
|
+
if (matchesShortcut(event, REPORT_SHORTCUTS.submit)) {
|
|
11
|
+
if (draft) {
|
|
12
|
+
event.preventDefault();
|
|
13
|
+
void handleCreateSubmit();
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
if (editingReportId) {
|
|
17
|
+
event.preventDefault();
|
|
18
|
+
void handleUpdateSubmit();
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
if (matchesShortcut(event, REPORT_SHORTCUTS.cancel)) {
|
|
24
|
+
if (draft) {
|
|
25
|
+
event.preventDefault();
|
|
26
|
+
cancelDraft();
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
if (editingReportId) {
|
|
30
|
+
event.preventDefault();
|
|
31
|
+
stopEditing();
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
if (mode === "report") {
|
|
35
|
+
event.preventDefault();
|
|
36
|
+
toggleReportMode();
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
if (pendingComposer) {
|
|
40
|
+
event.preventDefault();
|
|
41
|
+
cancelPendingComposer();
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (activeReplyReportId) {
|
|
45
|
+
event.preventDefault();
|
|
46
|
+
closeReplyComposer();
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
if (mode === "view") {
|
|
50
|
+
event.preventDefault();
|
|
51
|
+
toggleIssueMode();
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
if (showTargetPreview) {
|
|
55
|
+
event.preventDefault();
|
|
56
|
+
toggleTargetPreview();
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if (isFeedbackListOpen && matchesShortcut(event, REPORT_SHORTCUTS.focusSearch)) {
|
|
62
|
+
event.preventDefault();
|
|
63
|
+
focusSearchInput();
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
if (isFeedbackListOpen && !inEditable && (event.key === "ArrowUp" || event.key === "ArrowDown")) {
|
|
67
|
+
event.preventDefault();
|
|
68
|
+
selectAdjacentReport(event.key === "ArrowDown" ? "down" : "up");
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
if (inEditable) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
if (matchesShortcut(event, REPORT_SHORTCUTS.toggleReportMode)) {
|
|
75
|
+
event.preventDefault();
|
|
76
|
+
toggleReportMode();
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
if (matchesShortcut(event, REPORT_SHORTCUTS.toggleTargetPreview)) {
|
|
80
|
+
if (mode !== "idle") {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
event.preventDefault();
|
|
84
|
+
toggleTargetPreview();
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (matchesShortcut(event, REPORT_SHORTCUTS.toggleViewMode)) {
|
|
88
|
+
event.preventDefault();
|
|
89
|
+
toggleIssueMode();
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
window.addEventListener("keydown", handleKeyDown);
|
|
93
|
+
return () => {
|
|
94
|
+
window.removeEventListener("keydown", handleKeyDown);
|
|
95
|
+
};
|
|
96
|
+
}, [
|
|
97
|
+
mode,
|
|
98
|
+
draft,
|
|
99
|
+
editingReportId,
|
|
100
|
+
panelTab,
|
|
101
|
+
showTargetPreview,
|
|
102
|
+
activeReplyReportId,
|
|
103
|
+
pendingComposer,
|
|
104
|
+
toggleReportMode,
|
|
105
|
+
toggleTargetPreview,
|
|
106
|
+
toggleIssueMode,
|
|
107
|
+
cancelDraft,
|
|
108
|
+
cancelPendingComposer,
|
|
109
|
+
closeReplyComposer,
|
|
110
|
+
handleCreateSubmit,
|
|
111
|
+
stopEditing,
|
|
112
|
+
handleUpdateSubmit,
|
|
113
|
+
focusSearchInput,
|
|
114
|
+
selectAdjacentReport,
|
|
115
|
+
]);
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=useReportShortcuts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useReportShortcuts.js","sourceRoot":"","sources":["../../src/hooks/useReportShortcuts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { type MouseEvent } from "react";
|
|
2
|
+
import type { DeepPartialReportMessages } from "../i18n/types.js";
|
|
3
|
+
import type { ReportLocale } from "../i18n/types.js";
|
|
4
|
+
import type { CreateReportFeedbackPayload, ReportAppearance, ReportAuthor, ReportEvent, ReportFeedback, ReportField, ReportGitHubConfig, ReportIdentify, ReportListAllParams, ReportListAllResult, UpdateReportFeedbackPayload } from "../types/report.js";
|
|
5
|
+
import type { DraftReport, EditableDraft, Marker, PendingFeedbackComposer, ReportMode, ReportPanelTab, TargetSnapshot } from "../types/report-ui.js";
|
|
6
|
+
export type ReportStateConfig = {
|
|
7
|
+
projectId: string;
|
|
8
|
+
environment?: string;
|
|
9
|
+
appVersion?: string;
|
|
10
|
+
appearance: ReportAppearance;
|
|
11
|
+
fields: ReportField[];
|
|
12
|
+
authors?: ReportAuthor[];
|
|
13
|
+
requireReviewerKey?: boolean;
|
|
14
|
+
shortcut?: string;
|
|
15
|
+
identify?: ReportIdentify;
|
|
16
|
+
onList?: (params: {
|
|
17
|
+
pathname: string;
|
|
18
|
+
}) => Promise<ReportFeedback[]>;
|
|
19
|
+
onListAll?: (params: ReportListAllParams) => Promise<ReportListAllResult>;
|
|
20
|
+
onNavigate?: (pathname: string) => void | Promise<void>;
|
|
21
|
+
onCreate?: (payload: CreateReportFeedbackPayload) => Promise<ReportFeedback>;
|
|
22
|
+
onUpdate?: (id: string, payload: UpdateReportFeedbackPayload) => Promise<ReportFeedback>;
|
|
23
|
+
onDelete?: (id: string) => Promise<void>;
|
|
24
|
+
onEvent?: (event: ReportEvent) => void | Promise<void>;
|
|
25
|
+
onReply?: (params: {
|
|
26
|
+
feedbackId: string;
|
|
27
|
+
message: string;
|
|
28
|
+
}) => void | Promise<void>;
|
|
29
|
+
github?: ReportGitHubConfig;
|
|
30
|
+
routeKey?: string;
|
|
31
|
+
showFeedbackList: boolean;
|
|
32
|
+
visibleShortcutKeys?: boolean;
|
|
33
|
+
initialLocale: ReportLocale;
|
|
34
|
+
messageOverrides?: DeepPartialReportMessages;
|
|
35
|
+
};
|
|
36
|
+
export declare function useReportState({ projectId, environment, appVersion, appearance, fields, authors, requireReviewerKey, shortcut: _shortcut, identify, onList, onListAll, onNavigate, onCreate, onUpdate, onDelete, onEvent, onReply, github, routeKey, showFeedbackList, visibleShortcutKeys, initialLocale, messageOverrides, }: ReportStateConfig): {
|
|
37
|
+
appearance: ReportAppearance;
|
|
38
|
+
setAppearance: (nextAppearance: ReportAppearance) => void;
|
|
39
|
+
locale: ReportLocale;
|
|
40
|
+
setLocale: (nextLocale: ReportLocale) => void;
|
|
41
|
+
messages: import("../i18n/types.js").ReportMessages;
|
|
42
|
+
fields: ReportField[];
|
|
43
|
+
authors: ReportIdentify[];
|
|
44
|
+
projectId: string;
|
|
45
|
+
environment: string | undefined;
|
|
46
|
+
appVersion: string | undefined;
|
|
47
|
+
currentPathname: string;
|
|
48
|
+
showFeedbackList: boolean;
|
|
49
|
+
panelTab: ReportPanelTab | null;
|
|
50
|
+
routeDetailsStats: {
|
|
51
|
+
pathname: string;
|
|
52
|
+
statusRows: {
|
|
53
|
+
status: import("../constants/feedbackStatus.js").FeedbackDisplayStatus;
|
|
54
|
+
all: number;
|
|
55
|
+
today: number;
|
|
56
|
+
}[];
|
|
57
|
+
fieldCounts: {
|
|
58
|
+
key: string;
|
|
59
|
+
label: string;
|
|
60
|
+
type: "textarea" | "checkbox";
|
|
61
|
+
count: number;
|
|
62
|
+
}[];
|
|
63
|
+
};
|
|
64
|
+
canTransferFeedback: boolean;
|
|
65
|
+
personalKey: string | null;
|
|
66
|
+
publicKey: string | null;
|
|
67
|
+
personalKeyRequired: boolean;
|
|
68
|
+
personalKeyPendingRegistration: boolean;
|
|
69
|
+
personalKeyCandidates: ReportAuthor[];
|
|
70
|
+
issuePersonalKey: (authorId?: string) => Promise<{
|
|
71
|
+
privateKey: string;
|
|
72
|
+
publicKey: string;
|
|
73
|
+
} | null>;
|
|
74
|
+
rotatePersonalKey: () => Promise<{
|
|
75
|
+
privateKey: string;
|
|
76
|
+
publicKey: string;
|
|
77
|
+
} | null>;
|
|
78
|
+
insertPersonalKey: (key: string) => Promise<{
|
|
79
|
+
authorized: boolean;
|
|
80
|
+
} | null>;
|
|
81
|
+
canListAllFeedback: boolean;
|
|
82
|
+
visibleShortcutKeys: boolean;
|
|
83
|
+
searchInputRef: import("react").MutableRefObject<HTMLInputElement | null>;
|
|
84
|
+
resolvedAppearance: import("../types/report-ui.js").ResolvedAppearance;
|
|
85
|
+
isMobileViewport: boolean;
|
|
86
|
+
mode: ReportMode;
|
|
87
|
+
showTargetPreview: boolean;
|
|
88
|
+
selectableTargets: TargetSnapshot[];
|
|
89
|
+
filters: import("../types/report-ui.js").ReportFilters;
|
|
90
|
+
setFilters: import("react").Dispatch<import("react").SetStateAction<import("../types/report-ui.js").ReportFilters>>;
|
|
91
|
+
listScope: import("../types/report-ui.js").ReportListScope;
|
|
92
|
+
setListScope: import("react").Dispatch<import("react").SetStateAction<import("../types/report-ui.js").ReportListScope>>;
|
|
93
|
+
reports: ReportFeedback[];
|
|
94
|
+
filteredReports: ReportFeedback[];
|
|
95
|
+
isError: boolean;
|
|
96
|
+
isFetching: boolean;
|
|
97
|
+
hasNextPage: boolean;
|
|
98
|
+
isFetchingNextPage: boolean;
|
|
99
|
+
fetchNextPage: () => Promise<void>;
|
|
100
|
+
isCreating: boolean;
|
|
101
|
+
isUpdating: boolean;
|
|
102
|
+
isDeleting: boolean;
|
|
103
|
+
queryErrorMessage: string | undefined;
|
|
104
|
+
refetch: () => Promise<ReportFeedback[]>;
|
|
105
|
+
errorMessage: string;
|
|
106
|
+
setErrorMessage: import("react").Dispatch<import("react").SetStateAction<string>>;
|
|
107
|
+
draft: DraftReport | null;
|
|
108
|
+
hoveredTarget: TargetSnapshot | null;
|
|
109
|
+
selectedTarget: TargetSnapshot | null;
|
|
110
|
+
markers: Marker[];
|
|
111
|
+
selectedReport: ReportFeedback;
|
|
112
|
+
editingReportId: string | null;
|
|
113
|
+
editableDraft: EditableDraft | null;
|
|
114
|
+
setEditableDraft: import("react").Dispatch<import("react").SetStateAction<EditableDraft | null>>;
|
|
115
|
+
overlayRef: import("react").MutableRefObject<HTMLDivElement | null>;
|
|
116
|
+
activeReplyReportId: string | null;
|
|
117
|
+
activeReplyReport: ReportFeedback | null;
|
|
118
|
+
tooltipReport: ReportFeedback | null;
|
|
119
|
+
tooltipAnchor: Marker | null;
|
|
120
|
+
tooltipFieldTags: {
|
|
121
|
+
key: string;
|
|
122
|
+
label: string;
|
|
123
|
+
}[];
|
|
124
|
+
replyDraft: string;
|
|
125
|
+
setReplyDraft: import("react").Dispatch<import("react").SetStateAction<string>>;
|
|
126
|
+
draftAuthorName: string;
|
|
127
|
+
setDraftAuthorName: import("react").Dispatch<import("react").SetStateAction<string>>;
|
|
128
|
+
replyAuthorName: string;
|
|
129
|
+
setReplyAuthorName: import("react").Dispatch<import("react").SetStateAction<string>>;
|
|
130
|
+
pendingComposer: PendingFeedbackComposer;
|
|
131
|
+
startDenyReview: () => void;
|
|
132
|
+
startCheckoutReview: (replyId: string) => void;
|
|
133
|
+
cancelPendingComposer: () => void;
|
|
134
|
+
confirmAuthorName: string;
|
|
135
|
+
setConfirmAuthorName: import("react").Dispatch<import("react").SetStateAction<string>>;
|
|
136
|
+
showConfirmAuthorSelect: boolean;
|
|
137
|
+
toggleConfirmAuthorSelect: () => void;
|
|
138
|
+
handleConfirmResolution: () => Promise<void>;
|
|
139
|
+
targetStats: {
|
|
140
|
+
found: number;
|
|
141
|
+
group: number;
|
|
142
|
+
item: number;
|
|
143
|
+
};
|
|
144
|
+
statusText: string;
|
|
145
|
+
toggleReportMode: () => void;
|
|
146
|
+
toggleTargetPreview: () => void;
|
|
147
|
+
toggleIssueMode: () => void;
|
|
148
|
+
openPanelTab: (nextTab: ReportPanelTab) => void;
|
|
149
|
+
togglePanelTab: (nextTab: ReportPanelTab) => void;
|
|
150
|
+
selectReport: (reportId: string) => void;
|
|
151
|
+
locateFeedback: (reportId: string) => Promise<void>;
|
|
152
|
+
focusSearchInput: () => void;
|
|
153
|
+
selectAdjacentReport: (direction: "up" | "down") => void;
|
|
154
|
+
openReplyComposer: (report: ReportFeedback) => void;
|
|
155
|
+
closeReplyComposer: () => void;
|
|
156
|
+
clearHoverLeaveTimeout: () => void;
|
|
157
|
+
scheduleHoverLeave: (markerId: string) => void;
|
|
158
|
+
setHoveredMarkerId: import("react").Dispatch<import("react").SetStateAction<string | null>>;
|
|
159
|
+
handleOverlayMove: (event: MouseEvent<HTMLDivElement>) => void;
|
|
160
|
+
handleOverlayClick: (event: MouseEvent<HTMLDivElement>) => void;
|
|
161
|
+
cancelDraft: () => void;
|
|
162
|
+
updateDraftMessage: (nextMessage: string) => void;
|
|
163
|
+
updateDraftField: (key: string, nextValue: string | boolean) => void;
|
|
164
|
+
handleCreateSubmit: () => Promise<void>;
|
|
165
|
+
startEditing: (report: ReportFeedback) => void;
|
|
166
|
+
stopEditing: () => void;
|
|
167
|
+
handleUpdateSubmit: () => Promise<void>;
|
|
168
|
+
handleReplySubmit: () => Promise<void>;
|
|
169
|
+
handleDelete: (id: string) => Promise<void>;
|
|
170
|
+
canCreateGitHubIssueFromList: boolean;
|
|
171
|
+
canCreateGitHubIssueOnCreate: boolean;
|
|
172
|
+
creatingGitHubIssueId: string | null;
|
|
173
|
+
handleCreateGitHubIssue: (report: ReportFeedback) => Promise<void>;
|
|
174
|
+
handleCreateSubmitWithGitHubIssue: () => Promise<void>;
|
|
175
|
+
isDraftGitHubIssueSubmitting: boolean;
|
|
176
|
+
};
|
|
177
|
+
//# sourceMappingURL=useReportState.d.ts.map
|