sanity 6.14.0 → 6.14.1

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 (163) hide show
  1. package/lib/{AddonDatasetProvider-0aiLWkZg.js → AddonDatasetProvider-C9tdum2G.js} +2 -2
  2. package/lib/{AddonDatasetProvider-0aiLWkZg.js.map → AddonDatasetProvider-C9tdum2G.js.map} +1 -1
  3. package/lib/{CalendarFilter-DVz369RP.js → CalendarFilter-C80uOkw-.js} +3 -3
  4. package/lib/{CalendarFilter-DVz369RP.js.map → CalendarFilter-C80uOkw-.js.map} +1 -1
  5. package/lib/{CommandList-CTDV_QZY.js → CommandList-duj-LVnd.js} +2 -2
  6. package/lib/{CommandList-CTDV_QZY.js.map → CommandList-duj-LVnd.js.map} +1 -1
  7. package/lib/{CommentInput-B5T1Iwnt.js → CommentInput-BXYQnGhq.js} +5 -5
  8. package/lib/{CommentInput-B5T1Iwnt.js.map → CommentInput-BXYQnGhq.js.map} +1 -1
  9. package/lib/{CommentsDocumentLayout-ByFwej_y.js → CommentsDocumentLayout-DAwAhx7q.js} +2 -2
  10. package/lib/{CommentsDocumentLayout-ByFwej_y.js.map → CommentsDocumentLayout-DAwAhx7q.js.map} +1 -1
  11. package/lib/{CommentsDocumentLayout-Czb6fC0_.js → CommentsDocumentLayout-pfM29WSy.js} +2 -2
  12. package/lib/{CommentsDocumentLayout-Czb6fC0_.js.map → CommentsDocumentLayout-pfM29WSy.js.map} +1 -1
  13. package/lib/{CommentsEnabledProvider-D2gutvsb.js → CommentsEnabledProvider-DN_oXwXM.js} +3 -3
  14. package/lib/{CommentsEnabledProvider-D2gutvsb.js.map → CommentsEnabledProvider-DN_oXwXM.js.map} +1 -1
  15. package/lib/{CommentsField-D2Fum0Jx.js → CommentsField-B7wTBRMB.js} +5 -5
  16. package/lib/{CommentsField-D2Fum0Jx.js.map → CommentsField-B7wTBRMB.js.map} +1 -1
  17. package/lib/{CommentsField-YM3cp3fA.js → CommentsField-BxoVuJOl.js} +4 -4
  18. package/lib/{CommentsField-YM3cp3fA.js.map → CommentsField-BxoVuJOl.js.map} +1 -1
  19. package/lib/{CommentsInput-Bx2t5AW_.js → CommentsInput-C3rEb5L8.js} +6 -6
  20. package/lib/{CommentsInput-Bx2t5AW_.js.map → CommentsInput-C3rEb5L8.js.map} +1 -1
  21. package/lib/{CommentsInput-BBBng3CJ.js → CommentsInput-CU-PFXmu.js} +7 -7
  22. package/lib/{CommentsInput-BBBng3CJ.js.map → CommentsInput-CU-PFXmu.js.map} +1 -1
  23. package/lib/{CommentsInspector-BnSG5Mq0.js → CommentsInspector-BJ1qwj6P.js} +6 -6
  24. package/lib/{CommentsInspector-BnSG5Mq0.js.map → CommentsInspector-BJ1qwj6P.js.map} +1 -1
  25. package/lib/{CommentsInspector-B5V_Bpz5.js → CommentsInspector-BQiMPjvm.js} +6 -6
  26. package/lib/{CommentsInspector-B5V_Bpz5.js.map → CommentsInspector-BQiMPjvm.js.map} +1 -1
  27. package/lib/{CommentsListItem-DnqAlN4p.js → CommentsListItem-QyYan1DB.js} +5 -5
  28. package/lib/{CommentsListItem-DnqAlN4p.js.map → CommentsListItem-QyYan1DB.js.map} +1 -1
  29. package/lib/{CommentsListItem-DVE4IMls.js → CommentsListItem-dvKmANi3.js} +4 -4
  30. package/lib/{CommentsListItem-DVE4IMls.js.map → CommentsListItem-dvKmANi3.js.map} +1 -1
  31. package/lib/{CommentsSelectedPathProvider-DRJ3Xqs4.js → CommentsSelectedPathProvider-COcPb3W3.js} +3 -3
  32. package/lib/{CommentsSelectedPathProvider-DRJ3Xqs4.js.map → CommentsSelectedPathProvider-COcPb3W3.js.map} +1 -1
  33. package/lib/{CommentsStudioLayout-Di510XhD.js → CommentsStudioLayout-BkX6o14w.js} +3 -3
  34. package/lib/{CommentsStudioLayout-Di510XhD.js.map → CommentsStudioLayout-BkX6o14w.js.map} +1 -1
  35. package/lib/{CommentsStudioLayout-Z09s50bM.js → CommentsStudioLayout-dIXEz52s.js} +3 -3
  36. package/lib/{CommentsStudioLayout-Z09s50bM.js.map → CommentsStudioLayout-dIXEz52s.js.map} +1 -1
  37. package/lib/{GlobalPerspectiveMenu-Cwur4_iD.js → GlobalPerspectiveMenu-0Hs276Z-.js} +15 -15
  38. package/lib/{GlobalPerspectiveMenu-Cwur4_iD.js.map → GlobalPerspectiveMenu-0Hs276Z-.js.map} +1 -1
  39. package/lib/{LoadingBlock-Ch_dBXfn.js → LoadingBlock-CElIdb7F.js} +3 -3
  40. package/lib/{LoadingBlock-Ch_dBXfn.js.map → LoadingBlock-CElIdb7F.js.map} +1 -1
  41. package/lib/{PerspectiveProvider-Yk7lgugx.js → PerspectiveProvider-D-6sweQH.js} +130 -97
  42. package/lib/PerspectiveProvider-D-6sweQH.js.map +1 -0
  43. package/lib/{ReleaseAvatar-C68bGuVQ.js → ReleaseAvatar-Bqp_Ci7r.js} +4 -4
  44. package/lib/{ReleaseAvatar-C68bGuVQ.js.map → ReleaseAvatar-Bqp_Ci7r.js.map} +1 -1
  45. package/lib/{ReleasesMetadataProvider-DabLuMD8.js → ReleasesMetadataProvider-BD6XRcpT.js} +2 -2
  46. package/lib/{ReleasesMetadataProvider-DabLuMD8.js.map → ReleasesMetadataProvider-BD6XRcpT.js.map} +1 -1
  47. package/lib/{ReleasesStudioLayout-DsygG30q.js → ReleasesStudioLayout-C6mmxoaY.js} +7 -7
  48. package/lib/{ReleasesStudioLayout-DsygG30q.js.map → ReleasesStudioLayout-C6mmxoaY.js.map} +1 -1
  49. package/lib/{ReleasesTool-CNXNODI_.js → ReleasesTool-DIDmkzic.js} +23 -23
  50. package/lib/{ReleasesTool-CNXNODI_.js.map → ReleasesTool-DIDmkzic.js.map} +1 -1
  51. package/lib/{SchedulePublishingStudioLayout-EsgEGZ7F.js → SchedulePublishingStudioLayout-DrZO-qbI.js} +3 -3
  52. package/lib/{SchedulePublishingStudioLayout-EsgEGZ7F.js.map → SchedulePublishingStudioLayout-DrZO-qbI.js.map} +1 -1
  53. package/lib/{SchedulePublishingUpsellProvider-CWxgqzFp.js → SchedulePublishingUpsellProvider-DeZ_jZIX.js} +2 -2
  54. package/lib/{SchedulePublishingUpsellProvider-CWxgqzFp.js.map → SchedulePublishingUpsellProvider-DeZ_jZIX.js.map} +1 -1
  55. package/lib/{ScheduledPublishingEnabledProvider-CQ-T1Y96.js → ScheduledPublishingEnabledProvider-B8C0_tc5.js} +3 -3
  56. package/lib/{ScheduledPublishingEnabledProvider-CQ-T1Y96.js.map → ScheduledPublishingEnabledProvider-B8C0_tc5.js.map} +1 -1
  57. package/lib/{SearchProvider-CEXmRg1N.js → SearchProvider-T8fsDJV5.js} +8 -8
  58. package/lib/{SearchProvider-CEXmRg1N.js.map → SearchProvider-T8fsDJV5.js.map} +1 -1
  59. package/lib/{SingleDocReleaseLayout-ByDXFS8N.js → SingleDocReleaseLayout-BpMXU9KY.js} +2 -2
  60. package/lib/{SingleDocReleaseLayout-ByDXFS8N.js.map → SingleDocReleaseLayout-BpMXU9KY.js.map} +1 -1
  61. package/lib/{SingleDocReleaseUpsellProvider-ByuDpBIG.js → SingleDocReleaseUpsellProvider-7_OXHySY.js} +3 -3
  62. package/lib/{SingleDocReleaseUpsellProvider-ByuDpBIG.js.map → SingleDocReleaseUpsellProvider-7_OXHySY.js.map} +1 -1
  63. package/lib/{TasksFooterOpenTasks-BSO8TgVF.js → TasksFooterOpenTasks-IFtOEGnB.js} +2 -2
  64. package/lib/{TasksFooterOpenTasks-BSO8TgVF.js.map → TasksFooterOpenTasks-IFtOEGnB.js.map} +1 -1
  65. package/lib/{TasksStudioActiveToolLayout-BXktrH08.js → TasksStudioActiveToolLayout-C99LQz4S.js} +20 -20
  66. package/lib/{TasksStudioActiveToolLayout-BXktrH08.js.map → TasksStudioActiveToolLayout-C99LQz4S.js.map} +1 -1
  67. package/lib/{TasksStudioLayout-BfN-M93c.js → TasksStudioLayout-CmFbUpnB.js} +4 -4
  68. package/lib/{TasksStudioLayout-BfN-M93c.js.map → TasksStudioLayout-CmFbUpnB.js.map} +1 -1
  69. package/lib/{TasksStudioNavbar-CfqloSfP.js → TasksStudioNavbar-DB7DJC4e.js} +2 -2
  70. package/lib/{TasksStudioNavbar-CfqloSfP.js.map → TasksStudioNavbar-DB7DJC4e.js.map} +1 -1
  71. package/lib/{TimeZoneButton-FCwCyJ1J.js → TimeZoneButton-B_ki5v8q.js} +7 -7
  72. package/lib/{TimeZoneButton-FCwCyJ1J.js.map → TimeZoneButton-B_ki5v8q.js.map} +1 -1
  73. package/lib/{Tool-PzN5dskE.js → Tool-DlkZrcrD.js} +15 -15
  74. package/lib/{Tool-PzN5dskE.js.map → Tool-DlkZrcrD.js.map} +1 -1
  75. package/lib/{UpsellPanel-T-5ZD_7k.js → UpsellPanel-ITWwjktp.js} +2 -2
  76. package/lib/{UpsellPanel-T-5ZD_7k.js.map → UpsellPanel-ITWwjktp.js.map} +1 -1
  77. package/lib/{VariantsStudioNavbar-D0XbvL1D.js → VariantsStudioNavbar-DwEV1roH.js} +9 -9
  78. package/lib/{VariantsStudioNavbar-D0XbvL1D.js.map → VariantsStudioNavbar-DwEV1roH.js.map} +1 -1
  79. package/lib/{VariantsTool-B3EEDrQT.js → VariantsTool-Dzhy3PST.js} +12 -12
  80. package/lib/{VariantsTool-B3EEDrQT.js.map → VariantsTool-Dzhy3PST.js.map} +1 -1
  81. package/lib/{WorkspaceLoader-BH_VDaY4.js → WorkspaceLoader-Ck4TMoR5.js} +31 -31
  82. package/lib/{WorkspaceLoader-BH_VDaY4.js.map → WorkspaceLoader-Ck4TMoR5.js.map} +1 -1
  83. package/lib/_createContext.js +1 -1
  84. package/lib/_unstable-embedded.js +5 -5
  85. package/lib/{buildRangeDecorationSelectionsFromComments-B1-tJPvG.js → buildRangeDecorationSelectionsFromComments-BnlhrvDK.js} +3 -3
  86. package/lib/{buildRangeDecorationSelectionsFromComments-B1-tJPvG.js.map → buildRangeDecorationSelectionsFromComments-BnlhrvDK.js.map} +1 -1
  87. package/lib/{buildTextSelectionFromFragment-BiLg851R.js → buildTextSelectionFromFragment-BXrYd9lr.js} +3 -3
  88. package/lib/{buildTextSelectionFromFragment-BiLg851R.js.map → buildTextSelectionFromFragment-BXrYd9lr.js.map} +1 -1
  89. package/lib/{constants-DdgHySkY.js → constants-BQItnHll.js} +2 -2
  90. package/lib/{constants-DdgHySkY.js.map → constants-BQItnHll.js.map} +1 -1
  91. package/lib/{datastores-D1tF4HQA.js → datastores-DNOJm1LF.js} +2 -2
  92. package/lib/{datastores-D1tF4HQA.js.map → datastores-DNOJm1LF.js.map} +1 -1
  93. package/lib/{i18n-Cl_y4bbR.js → i18n-JUYUb7y_.js} +2 -2
  94. package/lib/{i18n-Cl_y4bbR.js.map → i18n-JUYUb7y_.js.map} +1 -1
  95. package/lib/index.js +38 -38
  96. package/lib/{inputResolver-CUWPjdGU.js → inputResolver-Ce1lTBE-.js} +4 -4
  97. package/lib/{inputResolver-CUWPjdGU.js.map → inputResolver-Ce1lTBE-.js.map} +1 -1
  98. package/lib/{navigation.telemetry-rXclq03x.js → navigation.telemetry-BPxX2IEN.js} +10 -10
  99. package/lib/{navigation.telemetry-rXclq03x.js.map → navigation.telemetry-BPxX2IEN.js.map} +1 -1
  100. package/lib/{plugin-CSp8hwQE.js → plugin-Bvxhb5ko.js} +8 -8
  101. package/lib/{plugin-CSp8hwQE.js.map → plugin-Bvxhb5ko.js.map} +1 -1
  102. package/lib/{plugin-Daxe5hwG.js → plugin-Cv6TLYbE.js} +6 -6
  103. package/lib/{plugin-Daxe5hwG.js.map → plugin-Cv6TLYbE.js.map} +1 -1
  104. package/lib/{plugin-BFTpdKKH.js → plugin-D6-7jrXf.js} +3 -3
  105. package/lib/{plugin-BFTpdKKH.js.map → plugin-D6-7jrXf.js.map} +1 -1
  106. package/lib/{plugin-dtgDcBsL.js → plugin-D_GVPwTR.js} +6 -6
  107. package/lib/{plugin-dtgDcBsL.js.map → plugin-D_GVPwTR.js.map} +1 -1
  108. package/lib/{releases.telemetry-B6tRA9U2.js → releases.telemetry-BAO7xaO7.js} +6 -6
  109. package/lib/{releases.telemetry-B6tRA9U2.js.map → releases.telemetry-BAO7xaO7.js.map} +1 -1
  110. package/lib/{resources-BjljYbUa.js → resources-Bw1bpPhG.js} +2 -2
  111. package/lib/{resources-BjljYbUa.js.map → resources-Bw1bpPhG.js.map} +1 -1
  112. package/lib/{resources-DYxnNjS8.js → resources-CC1qBsSO.js} +2 -2
  113. package/lib/{resources-DYxnNjS8.js.map → resources-CC1qBsSO.js.map} +1 -1
  114. package/lib/{resources-D7Mp6N-8.js → resources-CH42UqhC.js} +2 -2
  115. package/lib/{resources-D7Mp6N-8.js.map → resources-CH42UqhC.js.map} +1 -1
  116. package/lib/{resources-GpX0LblP.js → resources-Cq1lXH8T.js} +2 -2
  117. package/lib/{resources-GpX0LblP.js.map → resources-Cq1lXH8T.js.map} +1 -1
  118. package/lib/{resources-B7mfG9Km.js → resources-D7XsFe7y.js} +2 -2
  119. package/lib/{resources-B7mfG9Km.js.map → resources-D7XsFe7y.js.map} +1 -1
  120. package/lib/{resources-CmmAynkL.js → resources-DYn0yzEW.js} +2 -2
  121. package/lib/{resources-CmmAynkL.js.map → resources-DYn0yzEW.js.map} +1 -1
  122. package/lib/{resources-C79qQva3.js → resources-TsgtFPi7.js} +2 -2
  123. package/lib/{resources-C79qQva3.js.map → resources-TsgtFPi7.js.map} +1 -1
  124. package/lib/{scheduleItem-Bdvl81Kb.js → scheduleItem-5fXCZgfo.js} +13 -13
  125. package/lib/{scheduleItem-Bdvl81Kb.js.map → scheduleItem-5fXCZgfo.js.map} +1 -1
  126. package/lib/{schedules-D7bPbTPm.js → schedules-BsE0_g47.js} +3 -3
  127. package/lib/{schedules-D7bPbTPm.js.map → schedules-BsE0_g47.js.map} +1 -1
  128. package/lib/{searchDocumentRelease-v1o9dMnE.js → searchDocumentRelease-Bang3A8l.js} +5 -5
  129. package/lib/{searchDocumentRelease-v1o9dMnE.js.map → searchDocumentRelease-Bang3A8l.js.map} +1 -1
  130. package/lib/{studioClient-EJDu6kOb.js → studioClient-C7B6Aobi.js} +2 -2
  131. package/lib/{studioClient-EJDu6kOb.js.map → studioClient-C7B6Aobi.js.map} +1 -1
  132. package/lib/{useActiveReleases-Bh_Q6f7G.js → useActiveReleases-DxYjyTB1.js} +5 -5
  133. package/lib/{useActiveReleases-Bh_Q6f7G.js.map → useActiveReleases-DxYjyTB1.js.map} +1 -1
  134. package/lib/{useBundleDocuments-zP6JiTzz.js → useBundleDocuments-2YaaN-2l.js} +3 -3
  135. package/lib/{useBundleDocuments-zP6JiTzz.js.map → useBundleDocuments-2YaaN-2l.js.map} +1 -1
  136. package/lib/{useComments-BGOJwUe0.js → useComments-DWh1k0kS.js} +5 -5
  137. package/lib/{useComments-BGOJwUe0.js.map → useComments-DWh1k0kS.js.map} +1 -1
  138. package/lib/{useCommentsTelemetry-BMkf6MTO.js → useCommentsTelemetry-BbJ8lTKN.js} +4 -4
  139. package/lib/{useCommentsTelemetry-BMkf6MTO.js.map → useCommentsTelemetry-BbJ8lTKN.js.map} +1 -1
  140. package/lib/{useDocumentPreviewValues-CryTvfKc.js → useDocumentPreviewValues-CK5VteK3.js} +4 -4
  141. package/lib/{useDocumentPreviewValues-CryTvfKc.js.map → useDocumentPreviewValues-CK5VteK3.js.map} +1 -1
  142. package/lib/{useFieldActions-BTj7VsW5.js → useFieldActions-BmY1Kh3s.js} +2 -2
  143. package/lib/{useFieldActions-BTj7VsW5.js.map → useFieldActions-BmY1Kh3s.js.map} +1 -1
  144. package/lib/{useProjectId-BN6GCdwS.js → useProjectId-C8pZxybz.js} +2 -2
  145. package/lib/{useProjectId-BN6GCdwS.js.map → useProjectId-C8pZxybz.js.map} +1 -1
  146. package/lib/{useReleasesToolAvailable-CQ9-I8Tt.js → useReleasesToolAvailable-DjaSujLo.js} +3 -3
  147. package/lib/{useReleasesToolAvailable-CQ9-I8Tt.js.map → useReleasesToolAvailable-DjaSujLo.js.map} +1 -1
  148. package/lib/{useScheduledDraftMenuActions-OSkdxONo.js → useScheduledDraftMenuActions-DSJU6xQa.js} +9 -9
  149. package/lib/{useScheduledDraftMenuActions-OSkdxONo.js.map → useScheduledDraftMenuActions-DSJU6xQa.js.map} +1 -1
  150. package/lib/{useStudioUrl-DUBI_S4K.js → useStudioUrl-DcTGV00c.js} +5 -5
  151. package/lib/{useStudioUrl-DUBI_S4K.js.map → useStudioUrl-DcTGV00c.js.map} +1 -1
  152. package/lib/{useTasksNavigation-fohCXW6l.js → useTasksNavigation-tAXFJd2V.js} +2 -2
  153. package/lib/{useTasksNavigation-fohCXW6l.js.map → useTasksNavigation-tAXFJd2V.js.map} +1 -1
  154. package/lib/{useTimeZone-DM8ZmUO2.js → useTimeZone-Dj7C8tfZ.js} +2 -2
  155. package/lib/{useTimeZone-DM8ZmUO2.js.map → useTimeZone-Dj7C8tfZ.js.map} +1 -1
  156. package/lib/{utils-D-4rueJZ.js → utils-CT034e4q.js} +3 -3
  157. package/lib/{utils-D-4rueJZ.js.map → utils-CT034e4q.js.map} +1 -1
  158. package/lib/{validationUtils-jTd1rxfY.js → validationUtils-BZPoHEYN.js} +4 -4
  159. package/lib/{validationUtils-jTd1rxfY.js.map → validationUtils-BZPoHEYN.js.map} +1 -1
  160. package/lib/{version-D0Vx4cX1.js → version-BDSMcNU7.js} +2 -2
  161. package/lib/{version-D0Vx4cX1.js.map → version-BDSMcNU7.js.map} +1 -1
  162. package/package.json +17 -17
  163. package/lib/PerspectiveProvider-Yk7lgugx.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"CommentsField-YM3cp3fA.js","names":["() => {\n if (!open) return\n onClose()\n addCommentButtonElement?.focus()\n }","addCommentButtonElement?.focus","useCallback(() => {\n if (!open) return\n onClose()\n addCommentButtonElement?.focus()\n }, [addCommentButtonElement, open, onClose])","(nextValue: PortableTextBlock[]) => {\n onCommentAdd(nextValue)\n closePopover()\n }","useCallback(\n (nextValue: PortableTextBlock[]) => {\n onCommentAdd(nextValue)\n closePopover()\n },\n [closePopover, onCommentAdd],\n )","hasCommentMessageValue(value)","useMemo(() => hasCommentMessageValue(value), [value])","() => {\n if (!hasValue) {\n closePopover()\n return\n }\n\n commentInputHandle.current?.discardDialogController.open()\n }","useCallback(() => {\n if (!hasValue) {\n closePopover()\n return\n }\n\n commentInputHandle.current?.discardDialogController.open()\n }, [closePopover, hasValue])","(event: React.KeyboardEvent) => {\n // Don't act if the input already prevented this event\n if (event.isDefaultPrevented()) {\n return\n }\n\n // Call parent handler\n if (onInputKeyDown) onInputKeyDown(event)\n }","useCallback(\n (event: React.KeyboardEvent) => {\n // Don't act if the input already prevented this event\n if (event.isDefaultPrevented()) {\n return\n }\n\n // Call parent handler\n if (onInputKeyDown) onInputKeyDown(event)\n },\n [onInputKeyDown],\n )","() => {\n commentInputHandle.current?.discardDialogController.close()\n }","useCallback(() => {\n commentInputHandle.current?.discardDialogController.close()\n }, [])","() => {\n commentInputHandle.current?.discardDialogController.close()\n closePopover()\n onDiscard()\n }","useCallback(() => {\n commentInputHandle.current?.discardDialogController.close()\n closePopover()\n onDiscard()\n }, [closePopover, onDiscard])","(event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n event.stopPropagation()\n startDiscard()\n }\n }","event","useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n event.stopPropagation()\n startDiscard()\n }\n },\n [startDiscard],\n )","() => [popoverRef.current]","{field: fieldTitle}","<Translate\n t={t}\n i18nKey=\"compose.add-comment-input-placeholder\"\n values={{field: fieldTitle}}\n />","<ContentStack padding={2} gap={4} flexDirection=\"column\">\n <CommentInput\n currentUser={currentUser}\n focusLock\n focusOnMount\n mentionOptions={mentionOptions}\n onChange={onChange}\n onDiscardCancel={handleDiscardCancel}\n onDiscardConfirm={handleDiscardConfirm}\n onKeyDown={handleInputKeyDown}\n onSubmit={handleSubmit}\n placeholder={placeholder}\n readOnly={isCreatingDataset}\n ref={commentInputHandle}\n value={value}\n />\n </ContentStack>","['bottom-end']","t('field-button.aria-label-add')","t('field-button.title')","{\n content: t('field-button.title'),\n placement: 'top',\n }","<div>\n <Button\n aria-label={t('field-button.aria-label-add')}\n disabled={isCreatingDataset || Boolean(addonDatasetError)}\n icon={AddCommentIcon}\n mode=\"bleed\"\n onClick={onClick}\n ref={setAddCommentButtonElement}\n selected={open}\n tooltipProps={{\n content: t('field-button.title'),\n placement: 'top',\n }}\n />\n </div>","isCreatingDataset || Boolean(addonDatasetError)","<Popover\n constrainSize\n content={content}\n fallbackPlacements={['bottom-end']}\n open={open}\n placement=\"right-start\"\n portal\n ref={popoverRef}\n onKeyDown={handlePopoverKeyDown}\n >\n <div>\n <Button\n aria-label={t('field-button.aria-label-add')}\n disabled={isCreatingDataset || Boolean(addonDatasetError)}\n icon={AddCommentIcon}\n mode=\"bleed\"\n onClick={onClick}\n ref={setAddCommentButtonElement}\n selected={open}\n tooltipProps={{\n content: t('field-button.title'),\n placement: 'top',\n }}\n />\n </div>\n </Popover>","t('field-button.content', {count})","t('field-button.aria-label-open')","<Icon muted size={1} icon={CommentIcon} style={{margin: '-0.375rem'}} />","<Flex alignItems=\"center\" gap={2}>\n <Icon muted size={1} icon={CommentIcon} style={{margin: '-0.375rem'}} />\n <Text size={0} as=\"div\" trim={true}>\n {count > 9 ? '9+' : count}\n </Text>\n </Flex>","count > 9 ? '9+' : count","<SanityUIButton\n aria-label={t('field-button.aria-label-open')}\n mode=\"bleed\"\n onClick={onClick}\n padding={2}\n gap={2}\n >\n <Flex alignItems=\"center\" gap={2}>\n <Icon muted size={1} icon={CommentIcon} style={{margin: '-0.375rem'}} />\n <Text size={0} as=\"div\" trim={true}>\n {count > 9 ? '9+' : count}\n </Text>\n </Flex>\n </SanityUIButton>","<Tooltip portal placement=\"top\" content={t('field-button.content', {count})}>\n <SanityUIButton\n aria-label={t('field-button.aria-label-open')}\n mode=\"bleed\"\n onClick={onClick}\n padding={2}\n gap={2}\n >\n <Flex alignItems=\"center\" gap={2}>\n <Icon muted size={1} icon={CommentIcon} style={{margin: '-0.375rem'}} />\n <Text size={0} as=\"div\" trim={true}>\n {count > 9 ? '9+' : count}\n </Text>\n </Flex>\n </SanityUIButton>\n </Tooltip>","props.renderDefault(props)","props.renderDefault","<CommentFieldInner {...props} mode={mode} />","{\n boundaryElement,\n }","getSchemaTypeTitle(props.schemaType)","schemaType","useMemo(() => getSchemaTypeTitle(props.schemaType), [props.schemaType])","PathUtils.toString(props.path)","path","useMemo(() => PathUtils.toString(props.path), [props.path])","messageCache.get(stringPath) || null","() => {\n if (!isCommentsOpen) return false\n if (selectedPath?.origin === 'form' || selectedPath?.origin === 'url') return false\n return belongsToField(selectedPath?.fieldPath, props.path)\n }","fieldPath","origin","useMemo(() => {\n if (!isCommentsOpen) return false\n if (selectedPath?.origin === 'form' || selectedPath?.origin === 'url') return false\n return belongsToField(selectedPath?.fieldPath, props.path)\n }, [isCommentsOpen, selectedPath?.fieldPath, selectedPath?.origin, props.path])","comments.data.open\n .filter((c) => c.threadId === selectedPath?.threadId)\n .some((x) => isTextSelectionComment(x.parentComment))","open","threadId","(c) => c.threadId === selectedPath?.threadId","(x) => isTextSelectionComment(x.parentComment)","useMemo(() => {\n return comments.data.open\n .filter((c) => c.threadId === selectedPath?.threadId)\n .some((x) => isTextSelectionComment(x.parentComment))\n }, [comments.data.open, selectedPath?.threadId])","comments.data.open\n .map((c) => (belongsToField(c.fieldPath, props.path) ? c.commentsCount : 0))\n .reduce((acc, val) => acc + val, 0)","(c) => (belongsToField(c.fieldPath, props.path) ? c.commentsCount : 0)","c","(acc, val) => acc + val","() => {\n // Reset the value and remove the message from the cache\n setValue(null)\n messageCache.delete(stringPath)\n }","useCallback(() => {\n // Reset the value and remove the message from the cache\n setValue(null)\n messageCache.delete(stringPath)\n }, [stringPath])","() => {\n // When clicking a comment button when the field has comments, we want to:\n if (hasComments) {\n // 1. Change the status to 'open' if it's 'resolved'\n if (status === 'resolved') {\n setStatus('open')\n }\n\n // 2. Ensure that the authoring path is reset when clicking\n // the comment button when the field has comments.\n setAuthoringPath(null)\n\n // 3. Open the comments inspector\n onCommentsOpen?.()\n\n // 4. Find the latest comment thread for the current field\n const latestThread = comments.data.open.find((c) => belongsToField(c.fieldPath, props.path))\n\n // 5. Set the latest thread ID as the selected thread ID\n // and scroll to the it. The selected path carries the thread's own\n // `fieldPath`: the inspector marks a thread selected by comparing\n // against the stored path, which for nested threads is deeper than\n // this field's path.\n if (latestThread) {\n setSelectedPath({\n threadId: latestThread.threadId,\n origin: 'form',\n fieldPath: latestThread.fieldPath,\n })\n\n scrollToGroup(latestThread.threadId)\n }\n\n return\n }\n\n if (mode === 'upsell') {\n if (upsellData) {\n handleOpenDialog('field_action')\n } else {\n // Open the comments inspector\n onCommentsOpen?.()\n }\n return\n }\n\n // If the field is open (i.e. the authoring path is set to the current field)\n // we close the field by resetting the authoring path. If the field is not open,\n // we set the authoring path to the current field so that the comment form is opened.\n setAuthoringPath(isOpen ? null : stringPath)\n }","useCallback(() => {\n // When clicking a comment button when the field has comments, we want to:\n if (hasComments) {\n // 1. Change the status to 'open' if it's 'resolved'\n if (status === 'resolved') {\n setStatus('open')\n }\n\n // 2. Ensure that the authoring path is reset when clicking\n // the comment button when the field has comments.\n setAuthoringPath(null)\n\n // 3. Open the comments inspector\n onCommentsOpen?.()\n\n // 4. Find the latest comment thread for the current field\n const latestThread = comments.data.open.find((c) => belongsToField(c.fieldPath, props.path))\n\n // 5. Set the latest thread ID as the selected thread ID\n // and scroll to the it. The selected path carries the thread's own\n // `fieldPath`: the inspector marks a thread selected by comparing\n // against the stored path, which for nested threads is deeper than\n // this field's path.\n if (latestThread) {\n setSelectedPath({\n threadId: latestThread.threadId,\n origin: 'form',\n fieldPath: latestThread.fieldPath,\n })\n\n scrollToGroup(latestThread.threadId)\n }\n\n return\n }\n\n if (mode === 'upsell') {\n if (upsellData) {\n handleOpenDialog('field_action')\n } else {\n // Open the comments inspector\n onCommentsOpen?.()\n }\n return\n }\n\n // If the field is open (i.e. the authoring path is set to the current field)\n // we close the field by resetting the authoring path. If the field is not open,\n // we set the authoring path to the current field so that the comment form is opened.\n setAuthoringPath(isOpen ? null : stringPath)\n }, [\n comments.data.open,\n handleOpenDialog,\n hasComments,\n isOpen,\n mode,\n onCommentsOpen,\n props.path,\n scrollToGroup,\n setAuthoringPath,\n setSelectedPath,\n setStatus,\n status,\n stringPath,\n upsellData,\n ])","(nextValue: PortableTextBlock[]) => {\n if (nextValue) {\n // Since this is a new comment, we generate a new thread ID\n const newThreadId = uuid()\n\n // Construct the comment payload\n const nextComment: CommentCreatePayload = {\n type: 'field',\n fieldPath: PathUtils.toString(props.path),\n message: nextValue,\n parentCommentId: undefined,\n status: 'open',\n threadId: newThreadId,\n // New comments have no reactions\n reactions: EMPTY_ARRAY,\n }\n\n // Execute the create mutation\n void operation.create(nextComment)\n\n // If a comment is added to a field when viewing resolved comments, we switch\n // to open comments and scroll to the comment that was just added\n // Open the inspector when a new comment is added\n onCommentsOpen?.()\n\n if (status === 'resolved') {\n // Set the status to 'open' so that the comment is visible\n setStatus('open')\n }\n\n resetMessageValue()\n\n // Scroll to the thread\n setSelectedPath({\n threadId: newThreadId,\n origin: 'form',\n fieldPath: PathUtils.toString(props.path),\n })\n\n scrollToGroup(newThreadId)\n }\n }","useCallback(\n (nextValue: PortableTextBlock[]) => {\n if (nextValue) {\n // Since this is a new comment, we generate a new thread ID\n const newThreadId = uuid()\n\n // Construct the comment payload\n const nextComment: CommentCreatePayload = {\n type: 'field',\n fieldPath: PathUtils.toString(props.path),\n message: nextValue,\n parentCommentId: undefined,\n status: 'open',\n threadId: newThreadId,\n // New comments have no reactions\n reactions: EMPTY_ARRAY,\n }\n\n // Execute the create mutation\n void operation.create(nextComment)\n\n // If a comment is added to a field when viewing resolved comments, we switch\n // to open comments and scroll to the comment that was just added\n // Open the inspector when a new comment is added\n onCommentsOpen?.()\n\n if (status === 'resolved') {\n // Set the status to 'open' so that the comment is visible\n setStatus('open')\n }\n\n resetMessageValue()\n\n // Scroll to the thread\n setSelectedPath({\n threadId: newThreadId,\n origin: 'form',\n fieldPath: PathUtils.toString(props.path),\n })\n\n scrollToGroup(newThreadId)\n }\n },\n [\n onCommentsOpen,\n operation,\n props.path,\n resetMessageValue,\n scrollToGroup,\n setSelectedPath,\n setStatus,\n status,\n ],\n )","() => setAuthoringPath(null)","useCallback(() => setAuthoringPath(null), [setAuthoringPath])","(nextValue: CommentMessage) => {\n setValue(nextValue)\n messageCache.set(stringPath, nextValue)\n }","nextValue","useCallback(\n (nextValue: CommentMessage) => {\n setValue(nextValue)\n messageCache.set(stringPath, nextValue)\n },\n [stringPath],\n )","currentUser && (\n <CommentsFieldButton\n count={Number(count)}\n currentUser={currentUser}\n fieldTitle={fieldTitle}\n isCreatingDataset={isCreatingDataset}\n mentionOptions={mentionOptions}\n onChange={handleOnChange}\n onClick={handleClick}\n onClose={handleClose}\n onCommentAdd={handleCommentAdd}\n onDiscard={resetMessageValue}\n open={isOpen}\n value={value}\n />\n )","{\n button: currentUser && (\n <CommentsFieldButton\n count={Number(count)}\n currentUser={currentUser}\n fieldTitle={fieldTitle}\n isCreatingDataset={isCreatingDataset}\n mentionOptions={mentionOptions}\n onChange={handleOnChange}\n onClick={handleClick}\n onClose={handleClose}\n onCommentAdd={handleCommentAdd}\n onDiscard={resetMessageValue}\n open={isOpen}\n value={value}\n />\n ),\n hasComments,\n isAddingComment: isOpen,\n }","useMemo(\n () => ({\n button: currentUser && (\n <CommentsFieldButton\n count={Number(count)}\n currentUser={currentUser}\n fieldTitle={fieldTitle}\n isCreatingDataset={isCreatingDataset}\n mentionOptions={mentionOptions}\n onChange={handleOnChange}\n onClick={handleClick}\n onClose={handleClose}\n onCommentAdd={handleCommentAdd}\n onDiscard={resetMessageValue}\n open={isOpen}\n value={value}\n />\n ),\n hasComments,\n isAddingComment: isOpen,\n }),\n [\n currentUser,\n count,\n fieldTitle,\n isCreatingDataset,\n mentionOptions,\n handleOnChange,\n handleClick,\n handleClose,\n handleCommentAdd,\n resetMessageValue,\n isOpen,\n value,\n hasComments,\n ],\n )","applyCommentsFieldAttr(PathUtils.toString(props.path))","props.renderDefault({\n ...props,\n // oxlint-disable-next-line no-deprecated -- will fix in follow up PR\n __internal_comments: internalComments,\n })","isSelected && !isInlineCommentThread && (\n <HighlightDiv\n animate=\"animate\"\n exit=\"exit\"\n initial=\"initial\"\n variants={HIGHLIGHT_BLOCK_VARIANTS}\n />\n )","<AnimatePresence>\n {isSelected && !isInlineCommentThread && (\n <HighlightDiv\n animate=\"animate\"\n exit=\"exit\"\n initial=\"initial\"\n variants={HIGHLIGHT_BLOCK_VARIANTS}\n />\n )}\n </AnimatePresence>","<FieldStack {...applyCommentsFieldAttr(PathUtils.toString(props.path))} ref={rootRef}>\n {props.renderDefault({\n ...props,\n // oxlint-disable-next-line no-deprecated -- will fix in follow up PR\n __internal_comments: internalComments,\n })}\n\n <AnimatePresence>\n {isSelected && !isInlineCommentThread && (\n <HighlightDiv\n animate=\"animate\"\n exit=\"exit\"\n initial=\"initial\"\n variants={HIGHLIGHT_BLOCK_VARIANTS}\n />\n )}\n </AnimatePresence>\n </FieldStack>"],"sources":["../src/core/comments/hooks/useCommentsAuthoringPath.ts","../src/core/comments/plugin/field/CommentsFieldButton.tsx","../src/core/comments/plugin/field/CommentsField.tsx"],"sourcesContent":["import {useContext} from 'react'\nimport {CommentsAuthoringPathContext} from 'sanity/_singletons'\n\nimport {type CommentsAuthoringPathContextValue} from '../context/authoring-path/types'\n\n/**\n * @beta\n * @hidden\n */\nexport function useCommentsAuthoringPath(): CommentsAuthoringPathContextValue {\n const value = useContext(CommentsAuthoringPathContext)\n\n if (!value) {\n throw new Error('useCommentsAuthoringPath: missing context value')\n }\n\n return value\n}\n","import {AddCommentIcon} from '@sanity/icons/AddComment'\nimport {CommentIcon} from '@sanity/icons/Comment'\nimport {type CurrentUser, type PortableTextBlock} from '@sanity/types'\nimport {\n // oxlint-disable-next-line no-restricted-imports\n Button as SanityUIButton,\n useClickOutsideEvent,\n} from '@sanity/ui'\nimport {useCallback, useMemo, useRef, useState} from 'react'\nimport {styled} from 'styled-components'\nimport {Text, Flex, Icon} from 'ui5'\n\nimport {Button} from '../../../../ui-components/button/Button'\nimport {Popover} from '../../../../ui-components/popover/Popover'\nimport {Tooltip} from '../../../../ui-components/tooltip/Tooltip'\nimport {type UserListWithPermissionsHookValue} from '../../../hooks/useUserListWithPermissions'\nimport {useTranslation} from '../../../i18n/hooks/useTranslation'\nimport {Translate} from '../../../i18n/Translate'\nimport {useAddonDataset} from '../../../studio/addonDataset/useAddonDataset'\nimport {\n CommentInput,\n type CommentInputHandle,\n} from '../../components/pte/comment-input/CommentInput'\nimport {hasCommentMessageValue} from '../../helpers'\nimport {commentsLocaleNamespace} from '../../i18n'\nimport {type CommentMessage} from '../../types'\n\nconst ContentStack = styled(Flex)`\n width: 320px;\n`\n\ninterface CommentsFieldButtonProps {\n count: number\n currentUser: CurrentUser\n fieldTitle: string\n isCreatingDataset: boolean\n mentionOptions: UserListWithPermissionsHookValue\n onChange: (value: PortableTextBlock[]) => void\n onClick?: () => void\n onClose: () => void\n onCommentAdd: (value: PortableTextBlock[]) => void\n onDiscard: () => void\n onInputKeyDown?: (event: React.KeyboardEvent) => void\n open: boolean\n value: CommentMessage\n}\n\nexport function CommentsFieldButton(props: CommentsFieldButtonProps) {\n const {\n count,\n currentUser,\n fieldTitle,\n isCreatingDataset,\n mentionOptions,\n onChange,\n onClick,\n onClose,\n onCommentAdd,\n onDiscard,\n onInputKeyDown,\n open,\n value,\n } = props\n const {t} = useTranslation(commentsLocaleNamespace)\n const {error: addonDatasetError} = useAddonDataset()\n const popoverRef = useRef<HTMLDivElement | null>(null)\n const [addCommentButtonElement, setAddCommentButtonElement] = useState<HTMLButtonElement | null>(\n null,\n )\n const commentInputHandle = useRef<CommentInputHandle | null>(null)\n const hasComments = Boolean(count > 0)\n\n const closePopover = useCallback(() => {\n if (!open) return\n onClose()\n addCommentButtonElement?.focus()\n }, [addCommentButtonElement, open, onClose])\n\n const handleSubmit = useCallback(\n (nextValue: PortableTextBlock[]) => {\n onCommentAdd(nextValue)\n closePopover()\n },\n [closePopover, onCommentAdd],\n )\n\n const hasValue = useMemo(() => hasCommentMessageValue(value), [value])\n\n const startDiscard = useCallback(() => {\n if (!hasValue) {\n closePopover()\n return\n }\n\n commentInputHandle.current?.discardDialogController.open()\n }, [closePopover, hasValue])\n\n const handleInputKeyDown = useCallback(\n (event: React.KeyboardEvent) => {\n // Don't act if the input already prevented this event\n if (event.isDefaultPrevented()) {\n return\n }\n\n // Call parent handler\n if (onInputKeyDown) onInputKeyDown(event)\n },\n [onInputKeyDown],\n )\n\n const handleDiscardCancel = useCallback(() => {\n commentInputHandle.current?.discardDialogController.close()\n }, [])\n\n const handleDiscardConfirm = useCallback(() => {\n commentInputHandle.current?.discardDialogController.close()\n closePopover()\n onDiscard()\n }, [closePopover, onDiscard])\n\n const handlePopoverKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n event.stopPropagation()\n startDiscard()\n }\n },\n [startDiscard],\n )\n\n useClickOutsideEvent(open && startDiscard, () => [popoverRef.current])\n\n if (!hasComments) {\n const placeholder = (\n <Translate\n t={t}\n i18nKey=\"compose.add-comment-input-placeholder\"\n values={{field: fieldTitle}}\n />\n )\n\n const content = (\n <ContentStack padding={2} gap={4} flexDirection=\"column\">\n <CommentInput\n currentUser={currentUser}\n focusLock\n focusOnMount\n mentionOptions={mentionOptions}\n onChange={onChange}\n onDiscardCancel={handleDiscardCancel}\n onDiscardConfirm={handleDiscardConfirm}\n onKeyDown={handleInputKeyDown}\n onSubmit={handleSubmit}\n placeholder={placeholder}\n readOnly={isCreatingDataset}\n ref={commentInputHandle}\n value={value}\n />\n </ContentStack>\n )\n\n return (\n <Popover\n constrainSize\n content={content}\n fallbackPlacements={['bottom-end']}\n open={open}\n placement=\"right-start\"\n portal\n ref={popoverRef}\n onKeyDown={handlePopoverKeyDown}\n >\n <div>\n <Button\n aria-label={t('field-button.aria-label-add')}\n disabled={isCreatingDataset || Boolean(addonDatasetError)}\n icon={AddCommentIcon}\n mode=\"bleed\"\n onClick={onClick}\n ref={setAddCommentButtonElement}\n selected={open}\n tooltipProps={{\n content: t('field-button.title'),\n placement: 'top',\n }}\n />\n </div>\n </Popover>\n )\n }\n\n return (\n <Tooltip portal placement=\"top\" content={t('field-button.content', {count})}>\n <SanityUIButton\n aria-label={t('field-button.aria-label-open')}\n mode=\"bleed\"\n onClick={onClick}\n padding={2}\n gap={2}\n >\n <Flex alignItems=\"center\" gap={2}>\n <Icon muted size={1} icon={CommentIcon} style={{margin: '-0.375rem'}} />\n <Text size={0} as=\"div\" trim={true}>\n {count > 9 ? '9+' : count}\n </Text>\n </Flex>\n </SanityUIButton>\n </Tooltip>\n )\n}\n","import {hues} from '@sanity/color'\nimport {type Path, type PortableTextBlock} from '@sanity/types'\nimport {useBoundaryElement} from '@sanity/ui'\nimport * as PathUtils from '@sanity/util/paths'\nimport {uuid} from '@sanity/uuid'\nimport {AnimatePresence, motion, type Variants} from 'motion/react'\nimport {useCallback, useMemo, useRef, useState} from 'react'\nimport {css, styled} from 'styled-components'\nimport {VStack} from 'ui5'\n\nimport {type FieldProps} from '../../../form/types/fieldProps'\nimport {getSchemaTypeTitle} from '../../../schema/helpers'\nimport {useCurrentUser} from '../../../store/user/hooks'\nimport {COMMENTS_HIGHLIGHT_HUE_KEY} from '../../constants'\nimport {isTextSelectionComment, parseCommentFieldPath} from '../../helpers'\nimport {useComments} from '../../hooks/useComments'\nimport {useCommentsAuthoringPath} from '../../hooks/useCommentsAuthoringPath'\nimport {useCommentsEnabled} from '../../hooks/useCommentsEnabled'\nimport {applyCommentsFieldAttr, useCommentsScroll} from '../../hooks/useCommentsScroll'\nimport {useCommentsSelectedPath} from '../../hooks/useCommentsSelectedPath'\nimport {useCommentsUpsell} from '../../hooks/useCommentsUpsell'\nimport {type CommentCreatePayload, type CommentMessage, type CommentsUIMode} from '../../types'\nimport {CommentsFieldButton} from './CommentsFieldButton'\n\n// When the form is temporarily set to `readOnly` while reconnecting, the form\n// will be re-rendered and any comment that is being authored will be lost.\n// To avoid this, we cache the comment message in a map and restore it when the\n// field is re-rendered.\nconst messageCache = new Map<string, CommentMessage>()\n\nconst EMPTY_ARRAY: [] = []\n\nconst HIGHLIGHT_BLOCK_VARIANTS: Variants = {\n initial: {\n opacity: 0,\n },\n animate: {\n opacity: 1,\n },\n exit: {\n opacity: 0,\n },\n}\n\nexport function CommentsField(props: FieldProps) {\n const {enabled, mode} = useCommentsEnabled()\n\n if (!enabled) {\n return props.renderDefault(props)\n }\n\n return <CommentFieldInner {...props} mode={mode} />\n}\n\nconst HighlightDiv = styled(motion.div)(({theme}) => {\n // oxlint-disable-next-line no-deprecated -- will fix in follow up PR\n const {radius, space, color} = theme.sanity\n const bg = hues[COMMENTS_HIGHLIGHT_HUE_KEY][color.dark ? 900 : 50].hex\n\n return css`\n mix-blend-mode: ${color.dark ? 'screen' : 'multiply'};\n border-radius: ${radius[3]}px;\n top: -${space[2]}px;\n left: -${space[2]}px;\n bottom: -${space[2]}px;\n right: -${space[2]}px;\n pointer-events: none;\n position: absolute;\n z-index: 1;\n width: calc(100% + ${space[2] * 2}px);\n height: calc(100% + ${space[2] * 2}px);\n background-color: ${bg};\n `\n})\n\nconst FieldStack = styled(VStack)`\n position: relative;\n\n // Hide when the field component renders nothing (e.g. a custom\n // field component that returns null) to avoid an empty wrapper\n // taking up space in the form.\n &:empty:not([hidden]) {\n display: none;\n }\n`\n\nfunction CommentFieldInner(\n props: FieldProps & {\n mode: CommentsUIMode\n },\n) {\n const {mode} = props\n\n const currentUser = useCurrentUser()\n const {element: boundaryElement} = useBoundaryElement()\n\n const rootRef = useRef<HTMLDivElement | null>(null)\n\n const {\n comments,\n isCommentsOpen,\n isCreatingDataset,\n mentionOptions,\n onCommentsOpen,\n operation,\n setStatus,\n status,\n } = useComments()\n const {upsellData, handleOpenDialog} = useCommentsUpsell()\n const {selectedPath, setSelectedPath} = useCommentsSelectedPath()\n const {authoringPath, setAuthoringPath} = useCommentsAuthoringPath()\n const {scrollToGroup} = useCommentsScroll({\n boundaryElement,\n })\n\n const fieldTitle = useMemo(() => getSchemaTypeTitle(props.schemaType), [props.schemaType])\n const stringPath = useMemo(() => PathUtils.toString(props.path), [props.path])\n\n // Use the cached value if it exists as the initial value\n const cachedValue = messageCache.get(stringPath) || null\n\n const [value, setValue] = useState<PortableTextBlock[] | null>(cachedValue)\n\n // If the path of the field matches the authoring path, the comment input should be open.\n const isOpen = useMemo(() => authoringPath === stringPath, [authoringPath, stringPath])\n\n // Determine if the current field is selected\n const isSelected = useMemo(() => {\n if (!isCommentsOpen) return false\n if (selectedPath?.origin === 'form' || selectedPath?.origin === 'url') return false\n return belongsToField(selectedPath?.fieldPath, props.path)\n }, [isCommentsOpen, selectedPath?.fieldPath, selectedPath?.origin, props.path])\n\n const isInlineCommentThread = useMemo(() => {\n return comments.data.open\n .filter((c) => c.threadId === selectedPath?.threadId)\n .some((x) => isTextSelectionComment(x.parentComment))\n }, [comments.data.open, selectedPath?.threadId])\n\n // Total number of comments for the current field, including comments on\n // blocks nested below it (container-nested and dialog-authored comments\n // store the block's data path as their `fieldPath`).\n const count = useMemo(() => {\n const commentsCount = comments.data.open\n .map((c) => (belongsToField(c.fieldPath, props.path) ? c.commentsCount : 0))\n .reduce((acc, val) => acc + val, 0)\n\n return commentsCount || 0\n }, [comments.data.open, props.path])\n\n const hasComments = Boolean(count > 0)\n\n const resetMessageValue = useCallback(() => {\n // Reset the value and remove the message from the cache\n setValue(null)\n messageCache.delete(stringPath)\n }, [stringPath])\n\n const handleClick = useCallback(() => {\n // When clicking a comment button when the field has comments, we want to:\n if (hasComments) {\n // 1. Change the status to 'open' if it's 'resolved'\n if (status === 'resolved') {\n setStatus('open')\n }\n\n // 2. Ensure that the authoring path is reset when clicking\n // the comment button when the field has comments.\n setAuthoringPath(null)\n\n // 3. Open the comments inspector\n onCommentsOpen?.()\n\n // 4. Find the latest comment thread for the current field\n const latestThread = comments.data.open.find((c) => belongsToField(c.fieldPath, props.path))\n\n // 5. Set the latest thread ID as the selected thread ID\n // and scroll to the it. The selected path carries the thread's own\n // `fieldPath`: the inspector marks a thread selected by comparing\n // against the stored path, which for nested threads is deeper than\n // this field's path.\n if (latestThread) {\n setSelectedPath({\n threadId: latestThread.threadId,\n origin: 'form',\n fieldPath: latestThread.fieldPath,\n })\n\n scrollToGroup(latestThread.threadId)\n }\n\n return\n }\n\n if (mode === 'upsell') {\n if (upsellData) {\n handleOpenDialog('field_action')\n } else {\n // Open the comments inspector\n onCommentsOpen?.()\n }\n return\n }\n\n // If the field is open (i.e. the authoring path is set to the current field)\n // we close the field by resetting the authoring path. If the field is not open,\n // we set the authoring path to the current field so that the comment form is opened.\n setAuthoringPath(isOpen ? null : stringPath)\n }, [\n comments.data.open,\n handleOpenDialog,\n hasComments,\n isOpen,\n mode,\n onCommentsOpen,\n props.path,\n scrollToGroup,\n setAuthoringPath,\n setSelectedPath,\n setStatus,\n status,\n stringPath,\n upsellData,\n ])\n\n const handleCommentAdd = useCallback(\n (nextValue: PortableTextBlock[]) => {\n if (nextValue) {\n // Since this is a new comment, we generate a new thread ID\n const newThreadId = uuid()\n\n // Construct the comment payload\n const nextComment: CommentCreatePayload = {\n type: 'field',\n fieldPath: PathUtils.toString(props.path),\n message: nextValue,\n parentCommentId: undefined,\n status: 'open',\n threadId: newThreadId,\n // New comments have no reactions\n reactions: EMPTY_ARRAY,\n }\n\n // Execute the create mutation\n void operation.create(nextComment)\n\n // If a comment is added to a field when viewing resolved comments, we switch\n // to open comments and scroll to the comment that was just added\n // Open the inspector when a new comment is added\n onCommentsOpen?.()\n\n if (status === 'resolved') {\n // Set the status to 'open' so that the comment is visible\n setStatus('open')\n }\n\n resetMessageValue()\n\n // Scroll to the thread\n setSelectedPath({\n threadId: newThreadId,\n origin: 'form',\n fieldPath: PathUtils.toString(props.path),\n })\n\n scrollToGroup(newThreadId)\n }\n },\n [\n onCommentsOpen,\n operation,\n props.path,\n resetMessageValue,\n scrollToGroup,\n setSelectedPath,\n setStatus,\n status,\n ],\n )\n\n const handleClose = useCallback(() => setAuthoringPath(null), [setAuthoringPath])\n\n const handleOnChange = useCallback(\n (nextValue: CommentMessage) => {\n setValue(nextValue)\n messageCache.set(stringPath, nextValue)\n },\n [stringPath],\n )\n\n const internalComments: FieldProps['__internal_comments'] = useMemo(\n () => ({\n button: currentUser && (\n <CommentsFieldButton\n count={Number(count)}\n currentUser={currentUser}\n fieldTitle={fieldTitle}\n isCreatingDataset={isCreatingDataset}\n mentionOptions={mentionOptions}\n onChange={handleOnChange}\n onClick={handleClick}\n onClose={handleClose}\n onCommentAdd={handleCommentAdd}\n onDiscard={resetMessageValue}\n open={isOpen}\n value={value}\n />\n ),\n hasComments,\n isAddingComment: isOpen,\n }),\n [\n currentUser,\n count,\n fieldTitle,\n isCreatingDataset,\n mentionOptions,\n handleOnChange,\n handleClick,\n handleClose,\n handleCommentAdd,\n resetMessageValue,\n isOpen,\n value,\n hasComments,\n ],\n )\n\n return (\n <FieldStack {...applyCommentsFieldAttr(PathUtils.toString(props.path))} ref={rootRef}>\n {props.renderDefault({\n ...props,\n // oxlint-disable-next-line no-deprecated -- will fix in follow up PR\n __internal_comments: internalComments,\n })}\n\n <AnimatePresence>\n {isSelected && !isInlineCommentThread && (\n <HighlightDiv\n animate=\"animate\"\n exit=\"exit\"\n initial=\"initial\"\n variants={HIGHLIGHT_BLOCK_VARIANTS}\n />\n )}\n </AnimatePresence>\n </FieldStack>\n )\n}\n\n/**\n * Whether a comment's stored `fieldPath` sits at or below the field's path.\n */\nfunction belongsToField(fieldPath: string | null | undefined, path: Path): boolean {\n const commentFieldPath = parseCommentFieldPath(fieldPath)\n return commentFieldPath ? PathUtils.startsWith(path, commentFieldPath) : false\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"CommentsField-BxoVuJOl.js","names":["() => {\n if (!open) return\n onClose()\n addCommentButtonElement?.focus()\n }","addCommentButtonElement?.focus","useCallback(() => {\n if (!open) return\n onClose()\n addCommentButtonElement?.focus()\n }, [addCommentButtonElement, open, onClose])","(nextValue: PortableTextBlock[]) => {\n onCommentAdd(nextValue)\n closePopover()\n }","useCallback(\n (nextValue: PortableTextBlock[]) => {\n onCommentAdd(nextValue)\n closePopover()\n },\n [closePopover, onCommentAdd],\n )","hasCommentMessageValue(value)","useMemo(() => hasCommentMessageValue(value), [value])","() => {\n if (!hasValue) {\n closePopover()\n return\n }\n\n commentInputHandle.current?.discardDialogController.open()\n }","useCallback(() => {\n if (!hasValue) {\n closePopover()\n return\n }\n\n commentInputHandle.current?.discardDialogController.open()\n }, [closePopover, hasValue])","(event: React.KeyboardEvent) => {\n // Don't act if the input already prevented this event\n if (event.isDefaultPrevented()) {\n return\n }\n\n // Call parent handler\n if (onInputKeyDown) onInputKeyDown(event)\n }","useCallback(\n (event: React.KeyboardEvent) => {\n // Don't act if the input already prevented this event\n if (event.isDefaultPrevented()) {\n return\n }\n\n // Call parent handler\n if (onInputKeyDown) onInputKeyDown(event)\n },\n [onInputKeyDown],\n )","() => {\n commentInputHandle.current?.discardDialogController.close()\n }","useCallback(() => {\n commentInputHandle.current?.discardDialogController.close()\n }, [])","() => {\n commentInputHandle.current?.discardDialogController.close()\n closePopover()\n onDiscard()\n }","useCallback(() => {\n commentInputHandle.current?.discardDialogController.close()\n closePopover()\n onDiscard()\n }, [closePopover, onDiscard])","(event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n event.stopPropagation()\n startDiscard()\n }\n }","event","useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n event.stopPropagation()\n startDiscard()\n }\n },\n [startDiscard],\n )","() => [popoverRef.current]","{field: fieldTitle}","<Translate\n t={t}\n i18nKey=\"compose.add-comment-input-placeholder\"\n values={{field: fieldTitle}}\n />","<ContentStack padding={2} gap={4} flexDirection=\"column\">\n <CommentInput\n currentUser={currentUser}\n focusLock\n focusOnMount\n mentionOptions={mentionOptions}\n onChange={onChange}\n onDiscardCancel={handleDiscardCancel}\n onDiscardConfirm={handleDiscardConfirm}\n onKeyDown={handleInputKeyDown}\n onSubmit={handleSubmit}\n placeholder={placeholder}\n readOnly={isCreatingDataset}\n ref={commentInputHandle}\n value={value}\n />\n </ContentStack>","['bottom-end']","t('field-button.aria-label-add')","t('field-button.title')","{\n content: t('field-button.title'),\n placement: 'top',\n }","<div>\n <Button\n aria-label={t('field-button.aria-label-add')}\n disabled={isCreatingDataset || Boolean(addonDatasetError)}\n icon={AddCommentIcon}\n mode=\"bleed\"\n onClick={onClick}\n ref={setAddCommentButtonElement}\n selected={open}\n tooltipProps={{\n content: t('field-button.title'),\n placement: 'top',\n }}\n />\n </div>","isCreatingDataset || Boolean(addonDatasetError)","<Popover\n constrainSize\n content={content}\n fallbackPlacements={['bottom-end']}\n open={open}\n placement=\"right-start\"\n portal\n ref={popoverRef}\n onKeyDown={handlePopoverKeyDown}\n >\n <div>\n <Button\n aria-label={t('field-button.aria-label-add')}\n disabled={isCreatingDataset || Boolean(addonDatasetError)}\n icon={AddCommentIcon}\n mode=\"bleed\"\n onClick={onClick}\n ref={setAddCommentButtonElement}\n selected={open}\n tooltipProps={{\n content: t('field-button.title'),\n placement: 'top',\n }}\n />\n </div>\n </Popover>","t('field-button.content', {count})","t('field-button.aria-label-open')","<Icon muted size={1} icon={CommentIcon} style={{margin: '-0.375rem'}} />","<Flex alignItems=\"center\" gap={2}>\n <Icon muted size={1} icon={CommentIcon} style={{margin: '-0.375rem'}} />\n <Text size={0} as=\"div\" trim={true}>\n {count > 9 ? '9+' : count}\n </Text>\n </Flex>","count > 9 ? '9+' : count","<SanityUIButton\n aria-label={t('field-button.aria-label-open')}\n mode=\"bleed\"\n onClick={onClick}\n padding={2}\n gap={2}\n >\n <Flex alignItems=\"center\" gap={2}>\n <Icon muted size={1} icon={CommentIcon} style={{margin: '-0.375rem'}} />\n <Text size={0} as=\"div\" trim={true}>\n {count > 9 ? '9+' : count}\n </Text>\n </Flex>\n </SanityUIButton>","<Tooltip portal placement=\"top\" content={t('field-button.content', {count})}>\n <SanityUIButton\n aria-label={t('field-button.aria-label-open')}\n mode=\"bleed\"\n onClick={onClick}\n padding={2}\n gap={2}\n >\n <Flex alignItems=\"center\" gap={2}>\n <Icon muted size={1} icon={CommentIcon} style={{margin: '-0.375rem'}} />\n <Text size={0} as=\"div\" trim={true}>\n {count > 9 ? '9+' : count}\n </Text>\n </Flex>\n </SanityUIButton>\n </Tooltip>","props.renderDefault(props)","props.renderDefault","<CommentFieldInner {...props} mode={mode} />","{\n boundaryElement,\n }","getSchemaTypeTitle(props.schemaType)","schemaType","useMemo(() => getSchemaTypeTitle(props.schemaType), [props.schemaType])","PathUtils.toString(props.path)","path","useMemo(() => PathUtils.toString(props.path), [props.path])","messageCache.get(stringPath) || null","() => {\n if (!isCommentsOpen) return false\n if (selectedPath?.origin === 'form' || selectedPath?.origin === 'url') return false\n return belongsToField(selectedPath?.fieldPath, props.path)\n }","fieldPath","origin","useMemo(() => {\n if (!isCommentsOpen) return false\n if (selectedPath?.origin === 'form' || selectedPath?.origin === 'url') return false\n return belongsToField(selectedPath?.fieldPath, props.path)\n }, [isCommentsOpen, selectedPath?.fieldPath, selectedPath?.origin, props.path])","comments.data.open\n .filter((c) => c.threadId === selectedPath?.threadId)\n .some((x) => isTextSelectionComment(x.parentComment))","open","threadId","(c) => c.threadId === selectedPath?.threadId","(x) => isTextSelectionComment(x.parentComment)","useMemo(() => {\n return comments.data.open\n .filter((c) => c.threadId === selectedPath?.threadId)\n .some((x) => isTextSelectionComment(x.parentComment))\n }, [comments.data.open, selectedPath?.threadId])","comments.data.open\n .map((c) => (belongsToField(c.fieldPath, props.path) ? c.commentsCount : 0))\n .reduce((acc, val) => acc + val, 0)","(c) => (belongsToField(c.fieldPath, props.path) ? c.commentsCount : 0)","c","(acc, val) => acc + val","() => {\n // Reset the value and remove the message from the cache\n setValue(null)\n messageCache.delete(stringPath)\n }","useCallback(() => {\n // Reset the value and remove the message from the cache\n setValue(null)\n messageCache.delete(stringPath)\n }, [stringPath])","() => {\n // When clicking a comment button when the field has comments, we want to:\n if (hasComments) {\n // 1. Change the status to 'open' if it's 'resolved'\n if (status === 'resolved') {\n setStatus('open')\n }\n\n // 2. Ensure that the authoring path is reset when clicking\n // the comment button when the field has comments.\n setAuthoringPath(null)\n\n // 3. Open the comments inspector\n onCommentsOpen?.()\n\n // 4. Find the latest comment thread for the current field\n const latestThread = comments.data.open.find((c) => belongsToField(c.fieldPath, props.path))\n\n // 5. Set the latest thread ID as the selected thread ID\n // and scroll to the it. The selected path carries the thread's own\n // `fieldPath`: the inspector marks a thread selected by comparing\n // against the stored path, which for nested threads is deeper than\n // this field's path.\n if (latestThread) {\n setSelectedPath({\n threadId: latestThread.threadId,\n origin: 'form',\n fieldPath: latestThread.fieldPath,\n })\n\n scrollToGroup(latestThread.threadId)\n }\n\n return\n }\n\n if (mode === 'upsell') {\n if (upsellData) {\n handleOpenDialog('field_action')\n } else {\n // Open the comments inspector\n onCommentsOpen?.()\n }\n return\n }\n\n // If the field is open (i.e. the authoring path is set to the current field)\n // we close the field by resetting the authoring path. If the field is not open,\n // we set the authoring path to the current field so that the comment form is opened.\n setAuthoringPath(isOpen ? null : stringPath)\n }","useCallback(() => {\n // When clicking a comment button when the field has comments, we want to:\n if (hasComments) {\n // 1. Change the status to 'open' if it's 'resolved'\n if (status === 'resolved') {\n setStatus('open')\n }\n\n // 2. Ensure that the authoring path is reset when clicking\n // the comment button when the field has comments.\n setAuthoringPath(null)\n\n // 3. Open the comments inspector\n onCommentsOpen?.()\n\n // 4. Find the latest comment thread for the current field\n const latestThread = comments.data.open.find((c) => belongsToField(c.fieldPath, props.path))\n\n // 5. Set the latest thread ID as the selected thread ID\n // and scroll to the it. The selected path carries the thread's own\n // `fieldPath`: the inspector marks a thread selected by comparing\n // against the stored path, which for nested threads is deeper than\n // this field's path.\n if (latestThread) {\n setSelectedPath({\n threadId: latestThread.threadId,\n origin: 'form',\n fieldPath: latestThread.fieldPath,\n })\n\n scrollToGroup(latestThread.threadId)\n }\n\n return\n }\n\n if (mode === 'upsell') {\n if (upsellData) {\n handleOpenDialog('field_action')\n } else {\n // Open the comments inspector\n onCommentsOpen?.()\n }\n return\n }\n\n // If the field is open (i.e. the authoring path is set to the current field)\n // we close the field by resetting the authoring path. If the field is not open,\n // we set the authoring path to the current field so that the comment form is opened.\n setAuthoringPath(isOpen ? null : stringPath)\n }, [\n comments.data.open,\n handleOpenDialog,\n hasComments,\n isOpen,\n mode,\n onCommentsOpen,\n props.path,\n scrollToGroup,\n setAuthoringPath,\n setSelectedPath,\n setStatus,\n status,\n stringPath,\n upsellData,\n ])","(nextValue: PortableTextBlock[]) => {\n if (nextValue) {\n // Since this is a new comment, we generate a new thread ID\n const newThreadId = uuid()\n\n // Construct the comment payload\n const nextComment: CommentCreatePayload = {\n type: 'field',\n fieldPath: PathUtils.toString(props.path),\n message: nextValue,\n parentCommentId: undefined,\n status: 'open',\n threadId: newThreadId,\n // New comments have no reactions\n reactions: EMPTY_ARRAY,\n }\n\n // Execute the create mutation\n void operation.create(nextComment)\n\n // If a comment is added to a field when viewing resolved comments, we switch\n // to open comments and scroll to the comment that was just added\n // Open the inspector when a new comment is added\n onCommentsOpen?.()\n\n if (status === 'resolved') {\n // Set the status to 'open' so that the comment is visible\n setStatus('open')\n }\n\n resetMessageValue()\n\n // Scroll to the thread\n setSelectedPath({\n threadId: newThreadId,\n origin: 'form',\n fieldPath: PathUtils.toString(props.path),\n })\n\n scrollToGroup(newThreadId)\n }\n }","useCallback(\n (nextValue: PortableTextBlock[]) => {\n if (nextValue) {\n // Since this is a new comment, we generate a new thread ID\n const newThreadId = uuid()\n\n // Construct the comment payload\n const nextComment: CommentCreatePayload = {\n type: 'field',\n fieldPath: PathUtils.toString(props.path),\n message: nextValue,\n parentCommentId: undefined,\n status: 'open',\n threadId: newThreadId,\n // New comments have no reactions\n reactions: EMPTY_ARRAY,\n }\n\n // Execute the create mutation\n void operation.create(nextComment)\n\n // If a comment is added to a field when viewing resolved comments, we switch\n // to open comments and scroll to the comment that was just added\n // Open the inspector when a new comment is added\n onCommentsOpen?.()\n\n if (status === 'resolved') {\n // Set the status to 'open' so that the comment is visible\n setStatus('open')\n }\n\n resetMessageValue()\n\n // Scroll to the thread\n setSelectedPath({\n threadId: newThreadId,\n origin: 'form',\n fieldPath: PathUtils.toString(props.path),\n })\n\n scrollToGroup(newThreadId)\n }\n },\n [\n onCommentsOpen,\n operation,\n props.path,\n resetMessageValue,\n scrollToGroup,\n setSelectedPath,\n setStatus,\n status,\n ],\n )","() => setAuthoringPath(null)","useCallback(() => setAuthoringPath(null), [setAuthoringPath])","(nextValue: CommentMessage) => {\n setValue(nextValue)\n messageCache.set(stringPath, nextValue)\n }","nextValue","useCallback(\n (nextValue: CommentMessage) => {\n setValue(nextValue)\n messageCache.set(stringPath, nextValue)\n },\n [stringPath],\n )","currentUser && (\n <CommentsFieldButton\n count={Number(count)}\n currentUser={currentUser}\n fieldTitle={fieldTitle}\n isCreatingDataset={isCreatingDataset}\n mentionOptions={mentionOptions}\n onChange={handleOnChange}\n onClick={handleClick}\n onClose={handleClose}\n onCommentAdd={handleCommentAdd}\n onDiscard={resetMessageValue}\n open={isOpen}\n value={value}\n />\n )","{\n button: currentUser && (\n <CommentsFieldButton\n count={Number(count)}\n currentUser={currentUser}\n fieldTitle={fieldTitle}\n isCreatingDataset={isCreatingDataset}\n mentionOptions={mentionOptions}\n onChange={handleOnChange}\n onClick={handleClick}\n onClose={handleClose}\n onCommentAdd={handleCommentAdd}\n onDiscard={resetMessageValue}\n open={isOpen}\n value={value}\n />\n ),\n hasComments,\n isAddingComment: isOpen,\n }","useMemo(\n () => ({\n button: currentUser && (\n <CommentsFieldButton\n count={Number(count)}\n currentUser={currentUser}\n fieldTitle={fieldTitle}\n isCreatingDataset={isCreatingDataset}\n mentionOptions={mentionOptions}\n onChange={handleOnChange}\n onClick={handleClick}\n onClose={handleClose}\n onCommentAdd={handleCommentAdd}\n onDiscard={resetMessageValue}\n open={isOpen}\n value={value}\n />\n ),\n hasComments,\n isAddingComment: isOpen,\n }),\n [\n currentUser,\n count,\n fieldTitle,\n isCreatingDataset,\n mentionOptions,\n handleOnChange,\n handleClick,\n handleClose,\n handleCommentAdd,\n resetMessageValue,\n isOpen,\n value,\n hasComments,\n ],\n )","applyCommentsFieldAttr(PathUtils.toString(props.path))","props.renderDefault({\n ...props,\n // oxlint-disable-next-line no-deprecated -- will fix in follow up PR\n __internal_comments: internalComments,\n })","isSelected && !isInlineCommentThread && (\n <HighlightDiv\n animate=\"animate\"\n exit=\"exit\"\n initial=\"initial\"\n variants={HIGHLIGHT_BLOCK_VARIANTS}\n />\n )","<AnimatePresence>\n {isSelected && !isInlineCommentThread && (\n <HighlightDiv\n animate=\"animate\"\n exit=\"exit\"\n initial=\"initial\"\n variants={HIGHLIGHT_BLOCK_VARIANTS}\n />\n )}\n </AnimatePresence>","<FieldStack {...applyCommentsFieldAttr(PathUtils.toString(props.path))} ref={rootRef}>\n {props.renderDefault({\n ...props,\n // oxlint-disable-next-line no-deprecated -- will fix in follow up PR\n __internal_comments: internalComments,\n })}\n\n <AnimatePresence>\n {isSelected && !isInlineCommentThread && (\n <HighlightDiv\n animate=\"animate\"\n exit=\"exit\"\n initial=\"initial\"\n variants={HIGHLIGHT_BLOCK_VARIANTS}\n />\n )}\n </AnimatePresence>\n </FieldStack>"],"sources":["../src/core/comments/hooks/useCommentsAuthoringPath.ts","../src/core/comments/plugin/field/CommentsFieldButton.tsx","../src/core/comments/plugin/field/CommentsField.tsx"],"sourcesContent":["import {useContext} from 'react'\nimport {CommentsAuthoringPathContext} from 'sanity/_singletons'\n\nimport {type CommentsAuthoringPathContextValue} from '../context/authoring-path/types'\n\n/**\n * @beta\n * @hidden\n */\nexport function useCommentsAuthoringPath(): CommentsAuthoringPathContextValue {\n const value = useContext(CommentsAuthoringPathContext)\n\n if (!value) {\n throw new Error('useCommentsAuthoringPath: missing context value')\n }\n\n return value\n}\n","import {AddCommentIcon} from '@sanity/icons/AddComment'\nimport {CommentIcon} from '@sanity/icons/Comment'\nimport {type CurrentUser, type PortableTextBlock} from '@sanity/types'\nimport {\n // oxlint-disable-next-line no-restricted-imports\n Button as SanityUIButton,\n useClickOutsideEvent,\n} from '@sanity/ui'\nimport {useCallback, useMemo, useRef, useState} from 'react'\nimport {styled} from 'styled-components'\nimport {Text, Flex, Icon} from 'ui5'\n\nimport {Button} from '../../../../ui-components/button/Button'\nimport {Popover} from '../../../../ui-components/popover/Popover'\nimport {Tooltip} from '../../../../ui-components/tooltip/Tooltip'\nimport {type UserListWithPermissionsHookValue} from '../../../hooks/useUserListWithPermissions'\nimport {useTranslation} from '../../../i18n/hooks/useTranslation'\nimport {Translate} from '../../../i18n/Translate'\nimport {useAddonDataset} from '../../../studio/addonDataset/useAddonDataset'\nimport {\n CommentInput,\n type CommentInputHandle,\n} from '../../components/pte/comment-input/CommentInput'\nimport {hasCommentMessageValue} from '../../helpers'\nimport {commentsLocaleNamespace} from '../../i18n'\nimport {type CommentMessage} from '../../types'\n\nconst ContentStack = styled(Flex)`\n width: 320px;\n`\n\ninterface CommentsFieldButtonProps {\n count: number\n currentUser: CurrentUser\n fieldTitle: string\n isCreatingDataset: boolean\n mentionOptions: UserListWithPermissionsHookValue\n onChange: (value: PortableTextBlock[]) => void\n onClick?: () => void\n onClose: () => void\n onCommentAdd: (value: PortableTextBlock[]) => void\n onDiscard: () => void\n onInputKeyDown?: (event: React.KeyboardEvent) => void\n open: boolean\n value: CommentMessage\n}\n\nexport function CommentsFieldButton(props: CommentsFieldButtonProps) {\n const {\n count,\n currentUser,\n fieldTitle,\n isCreatingDataset,\n mentionOptions,\n onChange,\n onClick,\n onClose,\n onCommentAdd,\n onDiscard,\n onInputKeyDown,\n open,\n value,\n } = props\n const {t} = useTranslation(commentsLocaleNamespace)\n const {error: addonDatasetError} = useAddonDataset()\n const popoverRef = useRef<HTMLDivElement | null>(null)\n const [addCommentButtonElement, setAddCommentButtonElement] = useState<HTMLButtonElement | null>(\n null,\n )\n const commentInputHandle = useRef<CommentInputHandle | null>(null)\n const hasComments = Boolean(count > 0)\n\n const closePopover = useCallback(() => {\n if (!open) return\n onClose()\n addCommentButtonElement?.focus()\n }, [addCommentButtonElement, open, onClose])\n\n const handleSubmit = useCallback(\n (nextValue: PortableTextBlock[]) => {\n onCommentAdd(nextValue)\n closePopover()\n },\n [closePopover, onCommentAdd],\n )\n\n const hasValue = useMemo(() => hasCommentMessageValue(value), [value])\n\n const startDiscard = useCallback(() => {\n if (!hasValue) {\n closePopover()\n return\n }\n\n commentInputHandle.current?.discardDialogController.open()\n }, [closePopover, hasValue])\n\n const handleInputKeyDown = useCallback(\n (event: React.KeyboardEvent) => {\n // Don't act if the input already prevented this event\n if (event.isDefaultPrevented()) {\n return\n }\n\n // Call parent handler\n if (onInputKeyDown) onInputKeyDown(event)\n },\n [onInputKeyDown],\n )\n\n const handleDiscardCancel = useCallback(() => {\n commentInputHandle.current?.discardDialogController.close()\n }, [])\n\n const handleDiscardConfirm = useCallback(() => {\n commentInputHandle.current?.discardDialogController.close()\n closePopover()\n onDiscard()\n }, [closePopover, onDiscard])\n\n const handlePopoverKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n event.stopPropagation()\n startDiscard()\n }\n },\n [startDiscard],\n )\n\n useClickOutsideEvent(open && startDiscard, () => [popoverRef.current])\n\n if (!hasComments) {\n const placeholder = (\n <Translate\n t={t}\n i18nKey=\"compose.add-comment-input-placeholder\"\n values={{field: fieldTitle}}\n />\n )\n\n const content = (\n <ContentStack padding={2} gap={4} flexDirection=\"column\">\n <CommentInput\n currentUser={currentUser}\n focusLock\n focusOnMount\n mentionOptions={mentionOptions}\n onChange={onChange}\n onDiscardCancel={handleDiscardCancel}\n onDiscardConfirm={handleDiscardConfirm}\n onKeyDown={handleInputKeyDown}\n onSubmit={handleSubmit}\n placeholder={placeholder}\n readOnly={isCreatingDataset}\n ref={commentInputHandle}\n value={value}\n />\n </ContentStack>\n )\n\n return (\n <Popover\n constrainSize\n content={content}\n fallbackPlacements={['bottom-end']}\n open={open}\n placement=\"right-start\"\n portal\n ref={popoverRef}\n onKeyDown={handlePopoverKeyDown}\n >\n <div>\n <Button\n aria-label={t('field-button.aria-label-add')}\n disabled={isCreatingDataset || Boolean(addonDatasetError)}\n icon={AddCommentIcon}\n mode=\"bleed\"\n onClick={onClick}\n ref={setAddCommentButtonElement}\n selected={open}\n tooltipProps={{\n content: t('field-button.title'),\n placement: 'top',\n }}\n />\n </div>\n </Popover>\n )\n }\n\n return (\n <Tooltip portal placement=\"top\" content={t('field-button.content', {count})}>\n <SanityUIButton\n aria-label={t('field-button.aria-label-open')}\n mode=\"bleed\"\n onClick={onClick}\n padding={2}\n gap={2}\n >\n <Flex alignItems=\"center\" gap={2}>\n <Icon muted size={1} icon={CommentIcon} style={{margin: '-0.375rem'}} />\n <Text size={0} as=\"div\" trim={true}>\n {count > 9 ? '9+' : count}\n </Text>\n </Flex>\n </SanityUIButton>\n </Tooltip>\n )\n}\n","import {hues} from '@sanity/color'\nimport {type Path, type PortableTextBlock} from '@sanity/types'\nimport {useBoundaryElement} from '@sanity/ui'\nimport * as PathUtils from '@sanity/util/paths'\nimport {uuid} from '@sanity/uuid'\nimport {AnimatePresence, motion, type Variants} from 'motion/react'\nimport {useCallback, useMemo, useRef, useState} from 'react'\nimport {css, styled} from 'styled-components'\nimport {VStack} from 'ui5'\n\nimport {type FieldProps} from '../../../form/types/fieldProps'\nimport {getSchemaTypeTitle} from '../../../schema/helpers'\nimport {useCurrentUser} from '../../../store/user/hooks'\nimport {COMMENTS_HIGHLIGHT_HUE_KEY} from '../../constants'\nimport {isTextSelectionComment, parseCommentFieldPath} from '../../helpers'\nimport {useComments} from '../../hooks/useComments'\nimport {useCommentsAuthoringPath} from '../../hooks/useCommentsAuthoringPath'\nimport {useCommentsEnabled} from '../../hooks/useCommentsEnabled'\nimport {applyCommentsFieldAttr, useCommentsScroll} from '../../hooks/useCommentsScroll'\nimport {useCommentsSelectedPath} from '../../hooks/useCommentsSelectedPath'\nimport {useCommentsUpsell} from '../../hooks/useCommentsUpsell'\nimport {type CommentCreatePayload, type CommentMessage, type CommentsUIMode} from '../../types'\nimport {CommentsFieldButton} from './CommentsFieldButton'\n\n// When the form is temporarily set to `readOnly` while reconnecting, the form\n// will be re-rendered and any comment that is being authored will be lost.\n// To avoid this, we cache the comment message in a map and restore it when the\n// field is re-rendered.\nconst messageCache = new Map<string, CommentMessage>()\n\nconst EMPTY_ARRAY: [] = []\n\nconst HIGHLIGHT_BLOCK_VARIANTS: Variants = {\n initial: {\n opacity: 0,\n },\n animate: {\n opacity: 1,\n },\n exit: {\n opacity: 0,\n },\n}\n\nexport function CommentsField(props: FieldProps) {\n const {enabled, mode} = useCommentsEnabled()\n\n if (!enabled) {\n return props.renderDefault(props)\n }\n\n return <CommentFieldInner {...props} mode={mode} />\n}\n\nconst HighlightDiv = styled(motion.div)(({theme}) => {\n // oxlint-disable-next-line no-deprecated -- will fix in follow up PR\n const {radius, space, color} = theme.sanity\n const bg = hues[COMMENTS_HIGHLIGHT_HUE_KEY][color.dark ? 900 : 50].hex\n\n return css`\n mix-blend-mode: ${color.dark ? 'screen' : 'multiply'};\n border-radius: ${radius[3]}px;\n top: -${space[2]}px;\n left: -${space[2]}px;\n bottom: -${space[2]}px;\n right: -${space[2]}px;\n pointer-events: none;\n position: absolute;\n z-index: 1;\n width: calc(100% + ${space[2] * 2}px);\n height: calc(100% + ${space[2] * 2}px);\n background-color: ${bg};\n `\n})\n\nconst FieldStack = styled(VStack)`\n position: relative;\n\n // Hide when the field component renders nothing (e.g. a custom\n // field component that returns null) to avoid an empty wrapper\n // taking up space in the form.\n &:empty:not([hidden]) {\n display: none;\n }\n`\n\nfunction CommentFieldInner(\n props: FieldProps & {\n mode: CommentsUIMode\n },\n) {\n const {mode} = props\n\n const currentUser = useCurrentUser()\n const {element: boundaryElement} = useBoundaryElement()\n\n const rootRef = useRef<HTMLDivElement | null>(null)\n\n const {\n comments,\n isCommentsOpen,\n isCreatingDataset,\n mentionOptions,\n onCommentsOpen,\n operation,\n setStatus,\n status,\n } = useComments()\n const {upsellData, handleOpenDialog} = useCommentsUpsell()\n const {selectedPath, setSelectedPath} = useCommentsSelectedPath()\n const {authoringPath, setAuthoringPath} = useCommentsAuthoringPath()\n const {scrollToGroup} = useCommentsScroll({\n boundaryElement,\n })\n\n const fieldTitle = useMemo(() => getSchemaTypeTitle(props.schemaType), [props.schemaType])\n const stringPath = useMemo(() => PathUtils.toString(props.path), [props.path])\n\n // Use the cached value if it exists as the initial value\n const cachedValue = messageCache.get(stringPath) || null\n\n const [value, setValue] = useState<PortableTextBlock[] | null>(cachedValue)\n\n // If the path of the field matches the authoring path, the comment input should be open.\n const isOpen = useMemo(() => authoringPath === stringPath, [authoringPath, stringPath])\n\n // Determine if the current field is selected\n const isSelected = useMemo(() => {\n if (!isCommentsOpen) return false\n if (selectedPath?.origin === 'form' || selectedPath?.origin === 'url') return false\n return belongsToField(selectedPath?.fieldPath, props.path)\n }, [isCommentsOpen, selectedPath?.fieldPath, selectedPath?.origin, props.path])\n\n const isInlineCommentThread = useMemo(() => {\n return comments.data.open\n .filter((c) => c.threadId === selectedPath?.threadId)\n .some((x) => isTextSelectionComment(x.parentComment))\n }, [comments.data.open, selectedPath?.threadId])\n\n // Total number of comments for the current field, including comments on\n // blocks nested below it (container-nested and dialog-authored comments\n // store the block's data path as their `fieldPath`).\n const count = useMemo(() => {\n const commentsCount = comments.data.open\n .map((c) => (belongsToField(c.fieldPath, props.path) ? c.commentsCount : 0))\n .reduce((acc, val) => acc + val, 0)\n\n return commentsCount || 0\n }, [comments.data.open, props.path])\n\n const hasComments = Boolean(count > 0)\n\n const resetMessageValue = useCallback(() => {\n // Reset the value and remove the message from the cache\n setValue(null)\n messageCache.delete(stringPath)\n }, [stringPath])\n\n const handleClick = useCallback(() => {\n // When clicking a comment button when the field has comments, we want to:\n if (hasComments) {\n // 1. Change the status to 'open' if it's 'resolved'\n if (status === 'resolved') {\n setStatus('open')\n }\n\n // 2. Ensure that the authoring path is reset when clicking\n // the comment button when the field has comments.\n setAuthoringPath(null)\n\n // 3. Open the comments inspector\n onCommentsOpen?.()\n\n // 4. Find the latest comment thread for the current field\n const latestThread = comments.data.open.find((c) => belongsToField(c.fieldPath, props.path))\n\n // 5. Set the latest thread ID as the selected thread ID\n // and scroll to the it. The selected path carries the thread's own\n // `fieldPath`: the inspector marks a thread selected by comparing\n // against the stored path, which for nested threads is deeper than\n // this field's path.\n if (latestThread) {\n setSelectedPath({\n threadId: latestThread.threadId,\n origin: 'form',\n fieldPath: latestThread.fieldPath,\n })\n\n scrollToGroup(latestThread.threadId)\n }\n\n return\n }\n\n if (mode === 'upsell') {\n if (upsellData) {\n handleOpenDialog('field_action')\n } else {\n // Open the comments inspector\n onCommentsOpen?.()\n }\n return\n }\n\n // If the field is open (i.e. the authoring path is set to the current field)\n // we close the field by resetting the authoring path. If the field is not open,\n // we set the authoring path to the current field so that the comment form is opened.\n setAuthoringPath(isOpen ? null : stringPath)\n }, [\n comments.data.open,\n handleOpenDialog,\n hasComments,\n isOpen,\n mode,\n onCommentsOpen,\n props.path,\n scrollToGroup,\n setAuthoringPath,\n setSelectedPath,\n setStatus,\n status,\n stringPath,\n upsellData,\n ])\n\n const handleCommentAdd = useCallback(\n (nextValue: PortableTextBlock[]) => {\n if (nextValue) {\n // Since this is a new comment, we generate a new thread ID\n const newThreadId = uuid()\n\n // Construct the comment payload\n const nextComment: CommentCreatePayload = {\n type: 'field',\n fieldPath: PathUtils.toString(props.path),\n message: nextValue,\n parentCommentId: undefined,\n status: 'open',\n threadId: newThreadId,\n // New comments have no reactions\n reactions: EMPTY_ARRAY,\n }\n\n // Execute the create mutation\n void operation.create(nextComment)\n\n // If a comment is added to a field when viewing resolved comments, we switch\n // to open comments and scroll to the comment that was just added\n // Open the inspector when a new comment is added\n onCommentsOpen?.()\n\n if (status === 'resolved') {\n // Set the status to 'open' so that the comment is visible\n setStatus('open')\n }\n\n resetMessageValue()\n\n // Scroll to the thread\n setSelectedPath({\n threadId: newThreadId,\n origin: 'form',\n fieldPath: PathUtils.toString(props.path),\n })\n\n scrollToGroup(newThreadId)\n }\n },\n [\n onCommentsOpen,\n operation,\n props.path,\n resetMessageValue,\n scrollToGroup,\n setSelectedPath,\n setStatus,\n status,\n ],\n )\n\n const handleClose = useCallback(() => setAuthoringPath(null), [setAuthoringPath])\n\n const handleOnChange = useCallback(\n (nextValue: CommentMessage) => {\n setValue(nextValue)\n messageCache.set(stringPath, nextValue)\n },\n [stringPath],\n )\n\n const internalComments: FieldProps['__internal_comments'] = useMemo(\n () => ({\n button: currentUser && (\n <CommentsFieldButton\n count={Number(count)}\n currentUser={currentUser}\n fieldTitle={fieldTitle}\n isCreatingDataset={isCreatingDataset}\n mentionOptions={mentionOptions}\n onChange={handleOnChange}\n onClick={handleClick}\n onClose={handleClose}\n onCommentAdd={handleCommentAdd}\n onDiscard={resetMessageValue}\n open={isOpen}\n value={value}\n />\n ),\n hasComments,\n isAddingComment: isOpen,\n }),\n [\n currentUser,\n count,\n fieldTitle,\n isCreatingDataset,\n mentionOptions,\n handleOnChange,\n handleClick,\n handleClose,\n handleCommentAdd,\n resetMessageValue,\n isOpen,\n value,\n hasComments,\n ],\n )\n\n return (\n <FieldStack {...applyCommentsFieldAttr(PathUtils.toString(props.path))} ref={rootRef}>\n {props.renderDefault({\n ...props,\n // oxlint-disable-next-line no-deprecated -- will fix in follow up PR\n __internal_comments: internalComments,\n })}\n\n <AnimatePresence>\n {isSelected && !isInlineCommentThread && (\n <HighlightDiv\n animate=\"animate\"\n exit=\"exit\"\n initial=\"initial\"\n variants={HIGHLIGHT_BLOCK_VARIANTS}\n />\n )}\n </AnimatePresence>\n </FieldStack>\n )\n}\n\n/**\n * Whether a comment's stored `fieldPath` sits at or below the field's path.\n */\nfunction belongsToField(fieldPath: string | null | undefined, path: Path): boolean {\n const commentFieldPath = parseCommentFieldPath(fieldPath)\n return commentFieldPath ? PathUtils.startsWith(path, commentFieldPath) : false\n}\n"],"mappings":"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"}
@@ -1,11 +1,11 @@
1
- import { Mr as useFormValue } from "./PerspectiveProvider-Yk7lgugx.js";
2
- import { t as useFieldActions } from "./useFieldActions-BTj7VsW5.js";
1
+ import { Mr as useFormValue } from "./PerspectiveProvider-D-6sweQH.js";
2
+ import { t as useFieldActions } from "./useFieldActions-BmY1Kh3s.js";
3
3
  import { t as useTranslation } from "./useTranslation-Cqs6Itwv.js";
4
4
  import { o as Button$1 } from "./Tab-Dx6d0Ug4.js";
5
- import { n as useCurrentUser } from "./LoadingBlock-Ch_dBXfn.js";
5
+ import { n as useCurrentUser } from "./LoadingBlock-CElIdb7F.js";
6
6
  import { r as Popover } from "./MenuGroup-DwiYr9LF.js";
7
- import { b as commentsLocaleNamespace, d as hasCommentMessageValue, f as isTextSelectionComment, o as CommentInput, p as parseCommentFieldPath, t as useComments, y as useCommentsScroll } from "./useComments-BGOJwUe0.js";
8
- import { a as CommentInlineHighlightSpan, i as buildRangeDecorationSelectionsFromComments, n as getCommentFieldPath, o as CommentDisabledIcon, r as buildCommentRangeDecorations, t as buildTextSelectionFromFragment } from "./buildTextSelectionFromFragment-BiLg851R.js";
7
+ import { b as commentsLocaleNamespace, d as hasCommentMessageValue, f as isTextSelectionComment, o as CommentInput, p as parseCommentFieldPath, t as useComments, y as useCommentsScroll } from "./useComments-DWh1k0kS.js";
8
+ import { a as CommentInlineHighlightSpan, i as buildRangeDecorationSelectionsFromComments, n as getCommentFieldPath, o as CommentDisabledIcon, r as buildCommentRangeDecorations, t as buildTextSelectionFromFragment } from "./buildTextSelectionFromFragment-BXrYd9lr.js";
9
9
  import { t as useAddonDataset } from "./useAddonDataset-BvCgByG6.js";
10
10
  import { t as useCommentsEnabled } from "./useCommentsEnabled-BPc3788v.js";
11
11
  import { t as useCommentsSelectedPath } from "./useCommentsSelectedPath-D5HXM3NF.js";
@@ -533,4 +533,4 @@ function CommentsInput(props) {
533
533
  }
534
534
  export { CommentsInput };
535
535
 
536
- //# sourceMappingURL=CommentsInput-Bx2t5AW_.js.map
536
+ //# sourceMappingURL=CommentsInput-C3rEb5L8.js.map