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,9 +1,9 @@
1
1
  import { t as useTranslation } from "./useTranslation-Cqs6Itwv.js";
2
2
  import { s as Tooltip } from "./Tab-Dx6d0Ug4.js";
3
3
  import { t as Translate } from "./Translate-YUHPpk6j.js";
4
- import { t as LoadingBlock } from "./LoadingBlock-Ch_dBXfn.js";
5
- import { _ as applyCommentsGroupAttr, b as commentsLocaleNamespace, d as hasCommentMessageValue, o as CommentInput } from "./useComments-BGOJwUe0.js";
6
- import { n as ThreadCard, t as CommentsListItem } from "./CommentsListItem-DVE4IMls.js";
4
+ import { t as LoadingBlock } from "./LoadingBlock-CElIdb7F.js";
5
+ import { _ as applyCommentsGroupAttr, b as commentsLocaleNamespace, d as hasCommentMessageValue, o as CommentInput } from "./useComments-DWh1k0kS.js";
6
+ import { n as ThreadCard, t as CommentsListItem } from "./CommentsListItem-dvKmANi3.js";
7
7
  import { Fragment, memo, useRef, useState } from "react";
8
8
  import { c } from "react/compiler-runtime";
9
9
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -430,4 +430,4 @@ function useCommentsTelemetry() {
430
430
  }
431
431
  export { CommentsList as n, useCommentsTelemetry as t };
432
432
 
433
- //# sourceMappingURL=useCommentsTelemetry-BMkf6MTO.js.map
433
+ //# sourceMappingURL=useCommentsTelemetry-BbJ8lTKN.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useCommentsTelemetry-BMkf6MTO.js","names":["getEmptyStateMessages(t)","t('list-status.error')","<Flex alignItems=\"center\" justifyContent=\"center\" flexBasis=\"0%\" flexGrow={1} padding={4}>\n <Flex alignItems=\"center\">\n <Text size={1} muted as=\"div\" trim={true}>\n {t('list-status.error')}\n </Text>\n </Flex>\n </Flex>","t('list-status.loading')","<LoadingBlock showText title={t('list-status.loading')} />","<Text align=\"center\" size={1} muted weight=\"medium\" as=\"div\" trim={true}>\n {emptyStateMessages[status].title}\n </Text>","title","emptyStateMessages[status]","<Text align=\"center\" size={1} muted as=\"div\" trim={true}>\n {emptyStateMessages[status].message}\n </Text>","message","<Flex alignItems=\"center\" justifyContent=\"center\" flexBasis=\"0%\" flexGrow={1}>\n <Container size={0} padding={4}>\n <VStack gap={3}>\n <Text align=\"center\" size={1} muted weight=\"medium\" as=\"div\" trim={true}>\n {emptyStateMessages[status].title}\n </Text>\n\n <Text align=\"center\" size={1} muted as=\"div\" trim={true}>\n {emptyStateMessages[status].message}\n </Text>\n </VStack>\n </Container>\n </Flex>","useMemo(() => {\n const len = titlePath.length\n const beforeLength = Math.ceil(maxLength / 2)\n const afterLength = Math.floor(maxLength / 2)\n\n if (maxLength && len > maxLength) {\n return [\n ...titlePath.slice(0, beforeLength - 1),\n titlePath.slice(beforeLength - 1, len - afterLength),\n ...titlePath.slice(len - afterLength),\n ]\n }\n\n return titlePath\n }, [maxLength, titlePath])","[\n ...titlePath.slice(0, beforeLength - 1),\n titlePath.slice(beforeLength - 1, len - afterLength),\n ...titlePath.slice(len - afterLength),\n ]","items.map((item, index) => {\n const key = `${item}-${index}`\n const showSeparator = index < items.length - 1\n\n if (Array.isArray(item)) {\n return (\n <Fragment key={key}>\n <Tooltip\n content={\n <Flex gap={2} padding={2} flexDirection=\"column\">\n {item.map(renderItem)}\n </Flex>\n }\n >\n <Box>{renderItem('...', index)}</Box>\n </Tooltip>\n\n {showSeparator && separator}\n </Fragment>\n )\n }\n\n return (\n <Fragment key={key}>\n {renderItem(item, index)}\n\n {showSeparator && separator}\n </Fragment>\n )\n })","items.length","(item, index) => {\n const key = `${item}-${index}`\n const showSeparator = index < items.length - 1\n\n if (Array.isArray(item)) {\n return (\n <Fragment key={key}>\n <Tooltip\n content={\n <Flex gap={2} padding={2} flexDirection=\"column\">\n {item.map(renderItem)}\n </Flex>\n }\n >\n <Box>{renderItem('...', index)}</Box>\n </Tooltip>\n\n {showSeparator && separator}\n </Fragment>\n )\n }\n\n return (\n <Fragment key={key}>\n {renderItem(item, index)}\n\n {showSeparator && separator}\n </Fragment>\n )\n }","length","useMemo(() => {\n return items.map((item, index) => {\n const key = `${item}-${index}`\n const showSeparator = index < items.length - 1\n\n if (Array.isArray(item)) {\n return (\n <Fragment key={key}>\n <Tooltip\n content={\n <Flex gap={2} padding={2} flexDirection=\"column\">\n {item.map(renderItem)}\n </Flex>\n }\n >\n <Box>{renderItem('...', index)}</Box>\n </Tooltip>\n\n {showSeparator && separator}\n </Fragment>\n )\n }\n\n return (\n <Fragment key={key}>\n {renderItem(item, index)}\n\n {showSeparator && separator}\n </Fragment>\n )\n })\n }, [items])","<Flex alignItems=\"center\" as=\"ol\" gap={2}>\n {nodes}\n </Flex>","(nextValue: CommentMessage) => {\n onNewThreadCreate?.(nextValue)\n setValue(EMPTY_PT_ARRAY)\n }","useCallback(\n (nextValue: CommentMessage) => {\n onNewThreadCreate?.(nextValue)\n setValue(EMPTY_PT_ARRAY)\n },\n [onNewThreadCreate],\n )","hasCommentMessageValue(value)","useMemo(() => hasCommentMessageValue(value), [value])","() => {\n if (!hasValue) {\n return\n }\n commentInputHandle.current?.discardDialogController.open()\n }","useCallback(() => {\n if (!hasValue) {\n return\n }\n commentInputHandle.current?.discardDialogController.open()\n }, [hasValue])","(event: React.KeyboardEvent) => {\n // Don't act if the input already prevented this event\n if (event.isDefaultPrevented()) {\n return\n }\n // Discard the input text\n if (event.key === 'Escape') {\n event.preventDefault()\n event.stopPropagation()\n startDiscard()\n }\n // Call parent handler\n if (onKeyDown) onKeyDown(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 // Discard the input text\n if (event.key === 'Escape') {\n event.preventDefault()\n event.stopPropagation()\n startDiscard()\n }\n // Call parent handler\n if (onKeyDown) onKeyDown(event)\n },\n [onKeyDown, startDiscard],\n )","() => {\n setValue(EMPTY_PT_ARRAY)\n commentInputHandle.current?.discardDialogController.close()\n commentInputHandle.current?.focus()\n }","useCallback(() => {\n setValue(EMPTY_PT_ARRAY)\n commentInputHandle.current?.discardDialogController.close()\n commentInputHandle.current?.focus()\n }, [])","() => {\n commentInputHandle.current?.discardDialogController.close()\n }","useCallback(() => {\n commentInputHandle.current?.discardDialogController.close()\n }, [])","mode === 'upsell' ? (\n t('compose.add-comment-input-placeholder-upsell')\n ) : (\n <Translate\n t={t}\n i18nKey=\"compose.add-comment-input-placeholder\"\n values={{field: fieldTitle}}\n />\n )","<CommentInput\n currentUser={currentUser}\n expandOnFocus\n mentionOptions={mentionOptions}\n onBlur={onBlur}\n onChange={setValue}\n onDiscardCancel={cancelDiscard}\n onDiscardConfirm={confirmDiscard}\n onKeyDown={handleInputKeyDown}\n onFocus={onFocus}\n onSubmit={handleSubmit}\n placeholder={placeholder}\n readOnly={readOnly || mode === 'upsell'}\n ref={commentInputHandle}\n value={value}\n />","readOnly || mode === 'upsell'","(payload: CommentMessage) => {\n const nextComment: CommentBaseCreatePayload = {\n message: payload,\n parentCommentId: undefined,\n status: 'open',\n // Since this is a new comment, we generate a new thread ID\n threadId: uuid(),\n // New comments have no reactions\n reactions: [],\n\n payload: {\n fieldPath,\n },\n }\n\n onNewThreadCreate?.(nextComment)\n }","useCallback(\n (payload: CommentMessage) => {\n const nextComment: CommentBaseCreatePayload = {\n message: payload,\n parentCommentId: undefined,\n status: 'open',\n // Since this is a new comment, we generate a new thread ID\n threadId: uuid(),\n // New comments have no reactions\n reactions: [],\n\n payload: {\n fieldPath,\n },\n }\n\n onNewThreadCreate?.(nextComment)\n },\n [onNewThreadCreate, fieldPath],\n )","(e: MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation()\n\n onPathSelect?.({\n fieldPath,\n origin: 'inspector',\n threadId: null,\n })\n }","useCallback(\n (e: MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation()\n\n onPathSelect?.({\n fieldPath,\n origin: 'inspector',\n threadId: null,\n })\n },\n [fieldPath, onPathSelect],\n )","(e: MouseEvent<HTMLDivElement>) => {\n e.stopPropagation()\n // Skip if the click was triggered from \"Enter\" keydown.\n // This because we don't want to trigger `onPathSelect` when\n // submitting the new thread form.\n if (e.detail === 0) return\n\n onPathSelect?.({\n fieldPath,\n origin: 'inspector',\n threadId: null,\n })\n }","e","useCallback(\n (e: MouseEvent<HTMLDivElement>) => {\n e.stopPropagation()\n // Skip if the click was triggered from \"Enter\" keydown.\n // This because we don't want to trigger `onPathSelect` when\n // submitting the new thread form.\n if (e.detail === 0) return\n\n onPathSelect?.({\n fieldPath,\n origin: 'inspector',\n threadId: null,\n })\n },\n [fieldPath, onPathSelect],\n )","breadcrumbs?.map((p) => p.title) || []","(p) => p.title","breadcrumbs?.map","useMemo(() => breadcrumbs?.map((p) => p.title) || [], [breadcrumbs])","t('list-item.breadcrumb-button-go-to-field-aria-label', {\n field: lastCrumb,\n })","<CommentBreadcrumbs maxLength={3} titlePath={crumbsTitlePath} />","<HeaderFlex alignItems=\"center\" gap={2} paddingRight={1}>\n <Flex flexBasis=\"0%\" flexGrow={1} flexDirection=\"column\">\n <Flex alignItems=\"center\">\n <BreadcrumbsButton\n aria-label={t('list-item.breadcrumb-button-go-to-field-aria-label', {\n field: lastCrumb,\n })}\n mode=\"bleed\"\n onClick={handleBreadcrumbsClick}\n padding={2}\n gap={2}\n >\n <CommentBreadcrumbs maxLength={3} titlePath={crumbsTitlePath} />\n </BreadcrumbsButton>\n </Flex>\n </Flex>\n </HeaderFlex>","canCreateNewThread && (\n <ThreadCard onClick={handleNewThreadClick} data-active={isSelected}>\n <CreateNewThreadInput\n currentUser={currentUser}\n fieldTitle={lastCrumb}\n mentionOptions={mentionOptions}\n mode={mode}\n onNewThreadCreate={handleNewThreadCreate}\n readOnly={readOnly}\n />\n </ThreadCard>\n )","<VStack gap={2}>{children}</VStack>","<VStack gap={2}>\n <HeaderFlex alignItems=\"center\" gap={2} paddingRight={1}>\n <Flex flexBasis=\"0%\" flexGrow={1} flexDirection=\"column\">\n <Flex alignItems=\"center\">\n <BreadcrumbsButton\n aria-label={t('list-item.breadcrumb-button-go-to-field-aria-label', {\n field: lastCrumb,\n })}\n mode=\"bleed\"\n onClick={handleBreadcrumbsClick}\n padding={2}\n gap={2}\n >\n <CommentBreadcrumbs maxLength={3} titlePath={crumbsTitlePath} />\n </BreadcrumbsButton>\n </Flex>\n </Flex>\n </HeaderFlex>\n\n {canCreateNewThread && (\n <ThreadCard onClick={handleNewThreadClick} data-active={isSelected}>\n <CreateNewThreadInput\n currentUser={currentUser}\n fieldTitle={lastCrumb}\n mentionOptions={mentionOptions}\n mode={mode}\n onNewThreadCreate={handleNewThreadCreate}\n readOnly={readOnly}\n />\n </ThreadCard>\n )}\n\n <VStack gap={2}>{children}</VStack>\n </VStack>","Object.entries(groupThreads(comments))","useMemo(() => Object.entries(groupThreads(comments)), [comments])","mode !== 'upsell' && (\n <CommentsListStatus\n error={error}\n hasNoComments={groupedThreads.length === 0}\n loading={loading}\n status={status}\n />\n )","groupedThreads.length","(showComments || beforeListNode) && (\n <Flex\n as=\"ul\"\n flexBasis=\"0%\"\n flexGrow={1}\n overflow=\"auto\"\n padding={3}\n paddingTop={1}\n paddingBottom={6}\n gap={1}\n ref={ref}\n flexDirection=\"column\"\n >\n {beforeListNode}\n\n <BoundaryElementProvider element={boundaryElement}>\n {groupedThreads?.map(([fieldPath, group]) => {\n // Since all threads in the group point to the same field, the breadcrumbs will be\n // the same for all of them. Therefore, we can just pick the first one.\n const breadcrumbs = group[0].breadcrumbs\n\n // The thread ID is used to scroll to the thread.\n // We pick the first thread id in the group so that we scroll to the first thread\n // in the group.\n const firstThreadId = group[0].threadId\n\n // The new thread is selected if the field path matches the selected path and\n // there is no thread ID selected.\n const newThreadSelected =\n selectedPath?.fieldPath === fieldPath && !selectedPath.threadId\n\n return (\n <Flex\n key={fieldPath}\n as=\"li\"\n paddingTop={3}\n {...applyCommentsGroupAttr(firstThreadId)}\n flexDirection=\"column\"\n flexShrink={0}\n >\n <CommentThreadLayout\n key={fieldPath}\n breadcrumbs={breadcrumbs}\n canCreateNewThread={status === 'open'}\n currentUser={currentUser}\n fieldPath={fieldPath}\n isSelected={newThreadSelected}\n mentionOptions={mentionOptions}\n mode={mode}\n onNewThreadCreate={onNewThreadCreate}\n onPathSelect={onPathSelect}\n readOnly={readOnly}\n >\n {group.map((item) => {\n // The default sort order is by date, descending (newest first).\n // However, inside a thread, we want the order to be ascending (oldest first).\n // So we reverse the array here.\n // We use slice() to avoid mutating the original array.\n const replies = item.replies.slice().reverse()\n\n const canReply =\n status === 'open' &&\n item.parentComment._state?.type !== 'createError' &&\n item.parentComment._state?.type !== 'createRetrying'\n\n // The thread is selected if the thread ID and field path matches the\n // selected path.\n const threadIsSelected =\n selectedPath?.threadId === item.parentComment.threadId &&\n selectedPath?.fieldPath === item.parentComment.target.path?.field\n\n return (\n <CommentsListItem\n key={item.parentComment._id}\n canReply={canReply}\n currentUser={currentUser}\n hasReferencedValue={item.hasReferencedValue}\n isSelected={threadIsSelected}\n mentionOptions={mentionOptions}\n mode={mode}\n onCopyLink={onCopyLink}\n onCreateRetry={onCreateRetry}\n onDelete={onDelete}\n onEdit={onEdit}\n onPathSelect={onPathSelect}\n onReactionSelect={onReactionSelect}\n onReply={onReply}\n onStatusChange={onStatusChange}\n parentComment={item.parentComment}\n readOnly={readOnly}\n replies={replies}\n />\n )\n })}\n </CommentThreadLayout>\n </Flex>\n )\n })}\n </BoundaryElementProvider>\n </Flex>\n )","groupedThreads?.map","selectedPath?.fieldPath","[fieldPath, group]","<Flex\n data-testid=\"comments-list\"\n flexDirection=\"column\"\n flexBasis=\"0%\"\n flexGrow={1}\n height=\"100%\"\n overflow=\"hidden\"\n ref={setBoundaryElement}\n >\n {mode !== 'upsell' && (\n <CommentsListStatus\n error={error}\n hasNoComments={groupedThreads.length === 0}\n loading={loading}\n status={status}\n />\n )}\n\n {(showComments || beforeListNode) && (\n <Flex\n as=\"ul\"\n flexBasis=\"0%\"\n flexGrow={1}\n overflow=\"auto\"\n padding={3}\n paddingTop={1}\n paddingBottom={6}\n gap={1}\n ref={ref}\n flexDirection=\"column\"\n >\n {beforeListNode}\n\n <BoundaryElementProvider element={boundaryElement}>\n {groupedThreads?.map(([fieldPath, group]) => {\n // Since all threads in the group point to the same field, the breadcrumbs will be\n // the same for all of them. Therefore, we can just pick the first one.\n const breadcrumbs = group[0].breadcrumbs\n\n // The thread ID is used to scroll to the thread.\n // We pick the first thread id in the group so that we scroll to the first thread\n // in the group.\n const firstThreadId = group[0].threadId\n\n // The new thread is selected if the field path matches the selected path and\n // there is no thread ID selected.\n const newThreadSelected =\n selectedPath?.fieldPath === fieldPath && !selectedPath.threadId\n\n return (\n <Flex\n key={fieldPath}\n as=\"li\"\n paddingTop={3}\n {...applyCommentsGroupAttr(firstThreadId)}\n flexDirection=\"column\"\n flexShrink={0}\n >\n <CommentThreadLayout\n key={fieldPath}\n breadcrumbs={breadcrumbs}\n canCreateNewThread={status === 'open'}\n currentUser={currentUser}\n fieldPath={fieldPath}\n isSelected={newThreadSelected}\n mentionOptions={mentionOptions}\n mode={mode}\n onNewThreadCreate={onNewThreadCreate}\n onPathSelect={onPathSelect}\n readOnly={readOnly}\n >\n {group.map((item) => {\n // The default sort order is by date, descending (newest first).\n // However, inside a thread, we want the order to be ascending (oldest first).\n // So we reverse the array here.\n // We use slice() to avoid mutating the original array.\n const replies = item.replies.slice().reverse()\n\n const canReply =\n status === 'open' &&\n item.parentComment._state?.type !== 'createError' &&\n item.parentComment._state?.type !== 'createRetrying'\n\n // The thread is selected if the thread ID and field path matches the\n // selected path.\n const threadIsSelected =\n selectedPath?.threadId === item.parentComment.threadId &&\n selectedPath?.fieldPath === item.parentComment.target.path?.field\n\n return (\n <CommentsListItem\n key={item.parentComment._id}\n canReply={canReply}\n currentUser={currentUser}\n hasReferencedValue={item.hasReferencedValue}\n isSelected={threadIsSelected}\n mentionOptions={mentionOptions}\n mode={mode}\n onCopyLink={onCopyLink}\n onCreateRetry={onCreateRetry}\n onDelete={onDelete}\n onEdit={onEdit}\n onPathSelect={onPathSelect}\n onReactionSelect={onReactionSelect}\n onReply={onReply}\n onStatusChange={onStatusChange}\n parentComment={item.parentComment}\n readOnly={readOnly}\n replies={replies}\n />\n )\n })}\n </CommentThreadLayout>\n </Flex>\n )\n })}\n </BoundaryElementProvider>\n </Flex>\n )}\n </Flex>","() => {\n telemetry.log(CommentLinkCopied)\n }","useCallback(() => {\n telemetry.log(CommentLinkCopied)\n }, [telemetry])","() => {\n telemetry.log(CommentViewedFromLink)\n }","useCallback(() => {\n telemetry.log(CommentViewedFromLink)\n }, [telemetry])","(view: CommentStatus) => {\n telemetry.log(CommentListViewChanged, {view})\n }","useCallback(\n (view: CommentStatus) => {\n telemetry.log(CommentListViewChanged, {view})\n },\n [telemetry],\n )","{\n commentLinkCopied,\n commentListViewChanged,\n commentViewedFromLink,\n }","useMemo(\n (): CommentsTelemetryHookValue => ({\n commentLinkCopied,\n commentListViewChanged,\n commentViewedFromLink,\n }),\n [commentLinkCopied, commentListViewChanged, commentViewedFromLink],\n )"],"sources":["../src/core/comments/components/list/CommentsListStatus.tsx","../src/core/comments/components/CommentBreadcrumbs.tsx","../src/core/comments/components/list/CreateNewThreadInput.tsx","../src/core/comments/components/list/CommentThreadLayout.tsx","../src/core/comments/components/list/CommentsList.tsx","../src/core/comments/__telemetry__/comments.telemetry.ts","../src/core/comments/hooks/useCommentsTelemetry.ts"],"sourcesContent":["import {Text, Container, Flex, VStack} from 'ui5'\n\nimport {LoadingBlock} from '../../../components/loadingBlock/LoadingBlock'\nimport {useTranslation} from '../../../i18n/hooks/useTranslation'\nimport {type TFunction} from '../../../i18n/types'\nimport {commentsLocaleNamespace} from '../../i18n'\nimport {type CommentStatus} from '../../types'\n\ninterface EmptyStateMessage {\n title: string\n message: React.ReactNode\n}\n\nfunction getEmptyStateMessages(t: TFunction): Record<CommentStatus, EmptyStateMessage> {\n return {\n open: {\n title: t('list-status.empty-state-open-title'),\n message: t('list-status.empty-state-open-text'),\n },\n resolved: {\n title: t('list-status.empty-state-resolved-title'),\n message: t('list-status.empty-state-resolved-text'),\n },\n }\n}\n\ninterface CommentsListStatusProps {\n error: Error | null\n hasNoComments: boolean\n loading: boolean\n status: CommentStatus\n}\n\nexport function CommentsListStatus(props: CommentsListStatusProps) {\n const {status, error, loading, hasNoComments} = props\n const {t} = useTranslation(commentsLocaleNamespace)\n const emptyStateMessages = getEmptyStateMessages(t)\n\n if (error) {\n return (\n <Flex alignItems=\"center\" justifyContent=\"center\" flexBasis=\"0%\" flexGrow={1} padding={4}>\n <Flex alignItems=\"center\">\n <Text size={1} muted as=\"div\" trim={true}>\n {t('list-status.error')}\n </Text>\n </Flex>\n </Flex>\n )\n }\n\n if (loading) {\n return <LoadingBlock showText title={t('list-status.loading')} />\n }\n\n if (hasNoComments) {\n return (\n <Flex alignItems=\"center\" justifyContent=\"center\" flexBasis=\"0%\" flexGrow={1}>\n <Container size={0} padding={4}>\n <VStack gap={3}>\n <Text align=\"center\" size={1} muted weight=\"medium\" as=\"div\" trim={true}>\n {emptyStateMessages[status].title}\n </Text>\n\n <Text align=\"center\" size={1} muted as=\"div\" trim={true}>\n {emptyStateMessages[status].message}\n </Text>\n </VStack>\n </Container>\n </Flex>\n )\n }\n\n return null\n}\n","import {ChevronRightIcon} from '@sanity/icons/ChevronRight'\nimport {Fragment, useMemo} from 'react'\nimport {Text, Box, Flex, Icon} from 'ui5'\n\nimport {Tooltip} from '../../../ui-components/tooltip/Tooltip'\n\nexport interface CommentBreadcrumbsProps {\n titlePath: string[]\n maxLength: number\n}\n\ntype Item = string | string[]\n\nconst separator = <Icon muted icon={ChevronRightIcon} style={{margin: '-0.4375rem'}} />\n\nconst renderItem = (item: string, index: number) => {\n return (\n <Box key={`${item}-${index}`} as=\"li\">\n <Text truncate={1} size={1} weight=\"medium\" as=\"div\" trim={true}>\n {item}\n </Text>\n </Box>\n )\n}\n\nexport function CommentBreadcrumbs(props: CommentBreadcrumbsProps) {\n const {titlePath, maxLength} = props\n\n const items: Item[] = useMemo(() => {\n const len = titlePath.length\n const beforeLength = Math.ceil(maxLength / 2)\n const afterLength = Math.floor(maxLength / 2)\n\n if (maxLength && len > maxLength) {\n return [\n ...titlePath.slice(0, beforeLength - 1),\n titlePath.slice(beforeLength - 1, len - afterLength),\n ...titlePath.slice(len - afterLength),\n ]\n }\n\n return titlePath\n }, [maxLength, titlePath])\n\n const nodes = useMemo(() => {\n return items.map((item, index) => {\n const key = `${item}-${index}`\n const showSeparator = index < items.length - 1\n\n if (Array.isArray(item)) {\n return (\n <Fragment key={key}>\n <Tooltip\n content={\n <Flex gap={2} padding={2} flexDirection=\"column\">\n {item.map(renderItem)}\n </Flex>\n }\n >\n <Box>{renderItem('...', index)}</Box>\n </Tooltip>\n\n {showSeparator && separator}\n </Fragment>\n )\n }\n\n return (\n <Fragment key={key}>\n {renderItem(item, index)}\n\n {showSeparator && separator}\n </Fragment>\n )\n })\n }, [items])\n\n return (\n <Flex alignItems=\"center\" as=\"ol\" gap={2}>\n {nodes}\n </Flex>\n )\n}\n","import {type CurrentUser, type PortableTextBlock} from '@sanity/types'\nimport {useCallback, useMemo, useRef, useState} from 'react'\n\nimport {type UserListWithPermissionsHookValue} from '../../../hooks/useUserListWithPermissions'\nimport {useTranslation} from '../../../i18n/hooks/useTranslation'\nimport {Translate} from '../../../i18n/Translate'\nimport {hasCommentMessageValue} from '../../helpers'\nimport {commentsLocaleNamespace} from '../../i18n'\nimport {type CommentMessage, type CommentsUIMode} from '../../types'\nimport {\n CommentInput,\n type CommentInputHandle,\n type CommentInputProps,\n} from '../pte/comment-input/CommentInput'\n\nconst EMPTY_PT_ARRAY: PortableTextBlock[] = []\n\ninterface CreateNewThreadInputProps {\n currentUser: CurrentUser\n fieldTitle: string\n mentionOptions: UserListWithPermissionsHookValue\n mode: CommentsUIMode\n onBlur?: CommentInputProps['onBlur']\n onFocus?: CommentInputProps['onFocus']\n onKeyDown?: (event: React.KeyboardEvent) => void\n onNewThreadCreate: (payload: CommentMessage) => void\n readOnly?: boolean\n}\n\nexport function CreateNewThreadInput(props: CreateNewThreadInputProps) {\n const {\n currentUser,\n fieldTitle,\n mentionOptions,\n mode,\n onBlur,\n onFocus,\n onKeyDown,\n onNewThreadCreate,\n readOnly,\n } = props\n const {t} = useTranslation(commentsLocaleNamespace)\n\n const [value, setValue] = useState<CommentMessage>(EMPTY_PT_ARRAY)\n const commentInputHandle = useRef<CommentInputHandle | null>(null)\n\n const handleSubmit = useCallback(\n (nextValue: CommentMessage) => {\n onNewThreadCreate?.(nextValue)\n setValue(EMPTY_PT_ARRAY)\n },\n [onNewThreadCreate],\n )\n\n const hasValue = useMemo(() => hasCommentMessageValue(value), [value])\n\n const startDiscard = useCallback(() => {\n if (!hasValue) {\n return\n }\n commentInputHandle.current?.discardDialogController.open()\n }, [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 // Discard the input text\n if (event.key === 'Escape') {\n event.preventDefault()\n event.stopPropagation()\n startDiscard()\n }\n // Call parent handler\n if (onKeyDown) onKeyDown(event)\n },\n [onKeyDown, startDiscard],\n )\n\n const confirmDiscard = useCallback(() => {\n setValue(EMPTY_PT_ARRAY)\n commentInputHandle.current?.discardDialogController.close()\n commentInputHandle.current?.focus()\n }, [])\n\n const cancelDiscard = useCallback(() => {\n commentInputHandle.current?.discardDialogController.close()\n }, [])\n\n const placeholder =\n mode === 'upsell' ? (\n t('compose.add-comment-input-placeholder-upsell')\n ) : (\n <Translate\n t={t}\n i18nKey=\"compose.add-comment-input-placeholder\"\n values={{field: fieldTitle}}\n />\n )\n\n return (\n <CommentInput\n currentUser={currentUser}\n expandOnFocus\n mentionOptions={mentionOptions}\n onBlur={onBlur}\n onChange={setValue}\n onDiscardCancel={cancelDiscard}\n onDiscardConfirm={confirmDiscard}\n onKeyDown={handleInputKeyDown}\n onFocus={onFocus}\n onSubmit={handleSubmit}\n placeholder={placeholder}\n readOnly={readOnly || mode === 'upsell'}\n ref={commentInputHandle}\n value={value}\n />\n )\n}\n","import {type CurrentUser} from '@sanity/types'\nimport {\n // oxlint-disable-next-line no-restricted-imports\n Button, // Button with specific styling and children behavior.\n} from '@sanity/ui'\nimport {uuid} from '@sanity/uuid'\nimport {type MouseEvent, type ReactNode, useCallback, useMemo} from 'react'\nimport {css, styled} from 'styled-components'\nimport {Flex, VStack} from 'ui5'\n\nimport {type UserListWithPermissionsHookValue} from '../../../hooks/useUserListWithPermissions'\nimport {useTranslation} from '../../../i18n/hooks/useTranslation'\nimport {type CommentsSelectedPath} from '../../context/selected-path/types'\nimport {commentsLocaleNamespace} from '../../i18n'\nimport {\n type CommentBaseCreatePayload,\n type CommentListBreadcrumbs,\n type CommentMessage,\n type CommentsUIMode,\n} from '../../types'\nimport {CommentBreadcrumbs} from '../CommentBreadcrumbs'\nimport {CreateNewThreadInput} from './CreateNewThreadInput'\nimport {ThreadCard} from './styles'\n\nconst HeaderFlex = styled(Flex)`\n min-height: 25px;\n`\n\nconst BreadcrumbsButton = styled(Button)(({theme}) => {\n // oxlint-disable-next-line no-deprecated -- will fix in follow up PR\n const fg = theme.sanity.color.base.fg\n return css`\n --card-fg-color: ${fg};\n\n // The width is needed to make the text ellipsis work\n // in the breadcrumbs component\n max-width: 100%;\n `\n})\n\ninterface CommentThreadLayoutProps {\n breadcrumbs?: CommentListBreadcrumbs\n canCreateNewThread: boolean\n children: ReactNode\n currentUser: CurrentUser\n fieldPath: string\n isSelected: boolean\n mentionOptions: UserListWithPermissionsHookValue\n mode: CommentsUIMode\n onNewThreadCreate: (payload: CommentBaseCreatePayload) => void\n onPathSelect?: (nextPath: CommentsSelectedPath) => void\n readOnly?: boolean\n}\n\nexport function CommentThreadLayout(props: CommentThreadLayoutProps) {\n const {\n breadcrumbs,\n canCreateNewThread,\n children,\n currentUser,\n fieldPath,\n isSelected,\n mentionOptions,\n mode,\n onNewThreadCreate,\n onPathSelect,\n readOnly,\n } = props\n\n const {t} = useTranslation(commentsLocaleNamespace)\n\n const handleNewThreadCreate = useCallback(\n (payload: CommentMessage) => {\n const nextComment: CommentBaseCreatePayload = {\n message: payload,\n parentCommentId: undefined,\n status: 'open',\n // Since this is a new comment, we generate a new thread ID\n threadId: uuid(),\n // New comments have no reactions\n reactions: [],\n\n payload: {\n fieldPath,\n },\n }\n\n onNewThreadCreate?.(nextComment)\n },\n [onNewThreadCreate, fieldPath],\n )\n\n const handleBreadcrumbsClick = useCallback(\n (e: MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation()\n\n onPathSelect?.({\n fieldPath,\n origin: 'inspector',\n threadId: null,\n })\n },\n [fieldPath, onPathSelect],\n )\n\n const handleNewThreadClick = useCallback(\n (e: MouseEvent<HTMLDivElement>) => {\n e.stopPropagation()\n // Skip if the click was triggered from \"Enter\" keydown.\n // This because we don't want to trigger `onPathSelect` when\n // submitting the new thread form.\n if (e.detail === 0) return\n\n onPathSelect?.({\n fieldPath,\n origin: 'inspector',\n threadId: null,\n })\n },\n [fieldPath, onPathSelect],\n )\n\n const crumbsTitlePath = useMemo(() => breadcrumbs?.map((p) => p.title) || [], [breadcrumbs])\n const lastCrumb = crumbsTitlePath[crumbsTitlePath.length - 1]\n\n return (\n <VStack gap={2}>\n <HeaderFlex alignItems=\"center\" gap={2} paddingRight={1}>\n <Flex flexBasis=\"0%\" flexGrow={1} flexDirection=\"column\">\n <Flex alignItems=\"center\">\n <BreadcrumbsButton\n aria-label={t('list-item.breadcrumb-button-go-to-field-aria-label', {\n field: lastCrumb,\n })}\n mode=\"bleed\"\n onClick={handleBreadcrumbsClick}\n padding={2}\n gap={2}\n >\n <CommentBreadcrumbs maxLength={3} titlePath={crumbsTitlePath} />\n </BreadcrumbsButton>\n </Flex>\n </Flex>\n </HeaderFlex>\n\n {canCreateNewThread && (\n <ThreadCard onClick={handleNewThreadClick} data-active={isSelected}>\n <CreateNewThreadInput\n currentUser={currentUser}\n fieldTitle={lastCrumb}\n mentionOptions={mentionOptions}\n mode={mode}\n onNewThreadCreate={handleNewThreadCreate}\n readOnly={readOnly}\n />\n </ThreadCard>\n )}\n\n <VStack gap={2}>{children}</VStack>\n </VStack>\n )\n}\n","import {type CurrentUser} from '@sanity/types'\nimport {BoundaryElementProvider} from '@sanity/ui'\nimport {memo, useMemo, useState, type RefAttributes} from 'react'\nimport {Flex} from 'ui5'\n\nimport {type UserListWithPermissionsHookValue} from '../../../hooks/useUserListWithPermissions'\nimport {type CommentsSelectedPath} from '../../context/selected-path/types'\nimport {applyCommentsGroupAttr} from '../../hooks/useCommentsScroll'\nimport {\n type CommentBaseCreatePayload,\n type CommentReactionOption,\n type CommentStatus,\n type CommentsUIMode,\n type CommentThreadItem,\n type CommentUpdatePayload,\n} from '../../types'\nimport {CommentsListItem} from './CommentsListItem'\nimport {CommentsListStatus} from './CommentsListStatus'\nimport {CommentThreadLayout} from './CommentThreadLayout'\n\ninterface GroupedComments {\n [field: string]: CommentThreadItem[]\n}\n\nfunction groupThreads(comments: CommentThreadItem[]) {\n return comments.reduce((acc, comment) => {\n const field = comment.fieldPath\n\n if (!acc[field]) {\n acc[field] = []\n }\n\n acc[field].push(comment)\n\n return acc\n }, {} as GroupedComments)\n}\n\n/**\n * @beta\n * @hidden\n */\nexport interface CommentsListProps {\n beforeListNode?: React.ReactNode\n comments: CommentThreadItem[]\n currentUser: CurrentUser\n error: Error | null\n loading: boolean\n mentionOptions: UserListWithPermissionsHookValue\n mode: CommentsUIMode\n onCopyLink?: (id: string) => void\n onCreateRetry: (id: string) => void\n onDelete: (id: string) => void\n onEdit: (id: string, payload: CommentUpdatePayload) => void\n onNewThreadCreate: (payload: CommentBaseCreatePayload) => void\n /**\n * @internal\n */\n onPathSelect?: (nextPath: CommentsSelectedPath) => void\n onReactionSelect?: (id: string, reaction: CommentReactionOption) => void\n onReply: (payload: CommentBaseCreatePayload) => void\n onStatusChange?: (id: string, status: CommentStatus) => void\n readOnly?: boolean\n /**\n * @internal\n */\n selectedPath: CommentsSelectedPath | null\n status: CommentStatus\n}\n\n/**\n * @beta\n * @hidden\n */\nexport interface CommentsListHandle {\n scrollToComment: (id: string) => void\n}\n\nfunction CommentsListInner(props: CommentsListProps & RefAttributes<HTMLUListElement>) {\n const {\n ref,\n beforeListNode,\n comments,\n currentUser,\n error,\n loading,\n mentionOptions,\n mode,\n onCopyLink,\n onCreateRetry,\n onDelete,\n onEdit,\n onNewThreadCreate,\n onPathSelect,\n onReactionSelect,\n onReply,\n onStatusChange,\n readOnly,\n selectedPath,\n status,\n } = props\n const [boundaryElement, setBoundaryElement] = useState<HTMLDivElement | null>(null)\n\n const groupedThreads = useMemo(() => Object.entries(groupThreads(comments)), [comments])\n\n const showComments = !loading && !error && groupedThreads.length > 0\n\n return (\n <Flex\n data-testid=\"comments-list\"\n flexDirection=\"column\"\n flexBasis=\"0%\"\n flexGrow={1}\n height=\"100%\"\n overflow=\"hidden\"\n ref={setBoundaryElement}\n >\n {mode !== 'upsell' && (\n <CommentsListStatus\n error={error}\n hasNoComments={groupedThreads.length === 0}\n loading={loading}\n status={status}\n />\n )}\n\n {(showComments || beforeListNode) && (\n <Flex\n as=\"ul\"\n flexBasis=\"0%\"\n flexGrow={1}\n overflow=\"auto\"\n padding={3}\n paddingTop={1}\n paddingBottom={6}\n gap={1}\n ref={ref}\n flexDirection=\"column\"\n >\n {beforeListNode}\n\n <BoundaryElementProvider element={boundaryElement}>\n {groupedThreads?.map(([fieldPath, group]) => {\n // Since all threads in the group point to the same field, the breadcrumbs will be\n // the same for all of them. Therefore, we can just pick the first one.\n const breadcrumbs = group[0].breadcrumbs\n\n // The thread ID is used to scroll to the thread.\n // We pick the first thread id in the group so that we scroll to the first thread\n // in the group.\n const firstThreadId = group[0].threadId\n\n // The new thread is selected if the field path matches the selected path and\n // there is no thread ID selected.\n const newThreadSelected =\n selectedPath?.fieldPath === fieldPath && !selectedPath.threadId\n\n return (\n <Flex\n key={fieldPath}\n as=\"li\"\n paddingTop={3}\n {...applyCommentsGroupAttr(firstThreadId)}\n flexDirection=\"column\"\n flexShrink={0}\n >\n <CommentThreadLayout\n key={fieldPath}\n breadcrumbs={breadcrumbs}\n canCreateNewThread={status === 'open'}\n currentUser={currentUser}\n fieldPath={fieldPath}\n isSelected={newThreadSelected}\n mentionOptions={mentionOptions}\n mode={mode}\n onNewThreadCreate={onNewThreadCreate}\n onPathSelect={onPathSelect}\n readOnly={readOnly}\n >\n {group.map((item) => {\n // The default sort order is by date, descending (newest first).\n // However, inside a thread, we want the order to be ascending (oldest first).\n // So we reverse the array here.\n // We use slice() to avoid mutating the original array.\n const replies = item.replies.slice().reverse()\n\n const canReply =\n status === 'open' &&\n item.parentComment._state?.type !== 'createError' &&\n item.parentComment._state?.type !== 'createRetrying'\n\n // The thread is selected if the thread ID and field path matches the\n // selected path.\n const threadIsSelected =\n selectedPath?.threadId === item.parentComment.threadId &&\n selectedPath?.fieldPath === item.parentComment.target.path?.field\n\n return (\n <CommentsListItem\n key={item.parentComment._id}\n canReply={canReply}\n currentUser={currentUser}\n hasReferencedValue={item.hasReferencedValue}\n isSelected={threadIsSelected}\n mentionOptions={mentionOptions}\n mode={mode}\n onCopyLink={onCopyLink}\n onCreateRetry={onCreateRetry}\n onDelete={onDelete}\n onEdit={onEdit}\n onPathSelect={onPathSelect}\n onReactionSelect={onReactionSelect}\n onReply={onReply}\n onStatusChange={onStatusChange}\n parentComment={item.parentComment}\n readOnly={readOnly}\n replies={replies}\n />\n )\n })}\n </CommentThreadLayout>\n </Flex>\n )\n })}\n </BoundaryElementProvider>\n </Flex>\n )}\n </Flex>\n )\n}\n\n/**\n * @beta\n * @hidden\n */\nexport const CommentsList = memo(CommentsListInner)\n","import {defineEvent} from '@sanity/telemetry'\n\nimport {type CommentStatus} from '../types'\n\nexport const CommentLinkCopied = defineEvent({\n name: 'Comment Link Copied',\n version: 1,\n description: 'The link to a comment is copied',\n})\n\nexport const CommentViewedFromLink = defineEvent({\n name: 'Comment Viewed From Link',\n version: 1,\n description: 'A comment is viewed from a link',\n})\n\nexport const CommentListViewChanged = defineEvent<{view: CommentStatus}>({\n name: 'Comment List View Changed',\n version: 1,\n description: 'The view of the comment list is changed',\n})\n","import {useTelemetry} from '@sanity/telemetry/react'\nimport {useCallback, useMemo} from 'react'\n\nimport {\n CommentLinkCopied,\n CommentListViewChanged,\n CommentViewedFromLink,\n} from '../__telemetry__/comments.telemetry'\nimport {type CommentStatus} from '../types'\n\ninterface CommentsTelemetryHookValue {\n commentLinkCopied: () => void\n commentListViewChanged: (view: CommentStatus) => void\n commentViewedFromLink: () => void\n}\n\n/** @internal */\nexport function useCommentsTelemetry(): CommentsTelemetryHookValue {\n const telemetry = useTelemetry()\n\n const commentLinkCopied = useCallback(() => {\n telemetry.log(CommentLinkCopied)\n }, [telemetry])\n\n const commentViewedFromLink = useCallback(() => {\n telemetry.log(CommentViewedFromLink)\n }, [telemetry])\n\n const commentListViewChanged = useCallback(\n (view: CommentStatus) => {\n telemetry.log(CommentListViewChanged, {view})\n },\n [telemetry],\n )\n\n return useMemo(\n (): CommentsTelemetryHookValue => ({\n commentLinkCopied,\n commentListViewChanged,\n commentViewedFromLink,\n }),\n [commentLinkCopied, commentListViewChanged, commentViewedFromLink],\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"useCommentsTelemetry-BbJ8lTKN.js","names":["getEmptyStateMessages(t)","t('list-status.error')","<Flex alignItems=\"center\" justifyContent=\"center\" flexBasis=\"0%\" flexGrow={1} padding={4}>\n <Flex alignItems=\"center\">\n <Text size={1} muted as=\"div\" trim={true}>\n {t('list-status.error')}\n </Text>\n </Flex>\n </Flex>","t('list-status.loading')","<LoadingBlock showText title={t('list-status.loading')} />","<Text align=\"center\" size={1} muted weight=\"medium\" as=\"div\" trim={true}>\n {emptyStateMessages[status].title}\n </Text>","title","emptyStateMessages[status]","<Text align=\"center\" size={1} muted as=\"div\" trim={true}>\n {emptyStateMessages[status].message}\n </Text>","message","<Flex alignItems=\"center\" justifyContent=\"center\" flexBasis=\"0%\" flexGrow={1}>\n <Container size={0} padding={4}>\n <VStack gap={3}>\n <Text align=\"center\" size={1} muted weight=\"medium\" as=\"div\" trim={true}>\n {emptyStateMessages[status].title}\n </Text>\n\n <Text align=\"center\" size={1} muted as=\"div\" trim={true}>\n {emptyStateMessages[status].message}\n </Text>\n </VStack>\n </Container>\n </Flex>","useMemo(() => {\n const len = titlePath.length\n const beforeLength = Math.ceil(maxLength / 2)\n const afterLength = Math.floor(maxLength / 2)\n\n if (maxLength && len > maxLength) {\n return [\n ...titlePath.slice(0, beforeLength - 1),\n titlePath.slice(beforeLength - 1, len - afterLength),\n ...titlePath.slice(len - afterLength),\n ]\n }\n\n return titlePath\n }, [maxLength, titlePath])","[\n ...titlePath.slice(0, beforeLength - 1),\n titlePath.slice(beforeLength - 1, len - afterLength),\n ...titlePath.slice(len - afterLength),\n ]","items.map((item, index) => {\n const key = `${item}-${index}`\n const showSeparator = index < items.length - 1\n\n if (Array.isArray(item)) {\n return (\n <Fragment key={key}>\n <Tooltip\n content={\n <Flex gap={2} padding={2} flexDirection=\"column\">\n {item.map(renderItem)}\n </Flex>\n }\n >\n <Box>{renderItem('...', index)}</Box>\n </Tooltip>\n\n {showSeparator && separator}\n </Fragment>\n )\n }\n\n return (\n <Fragment key={key}>\n {renderItem(item, index)}\n\n {showSeparator && separator}\n </Fragment>\n )\n })","items.length","(item, index) => {\n const key = `${item}-${index}`\n const showSeparator = index < items.length - 1\n\n if (Array.isArray(item)) {\n return (\n <Fragment key={key}>\n <Tooltip\n content={\n <Flex gap={2} padding={2} flexDirection=\"column\">\n {item.map(renderItem)}\n </Flex>\n }\n >\n <Box>{renderItem('...', index)}</Box>\n </Tooltip>\n\n {showSeparator && separator}\n </Fragment>\n )\n }\n\n return (\n <Fragment key={key}>\n {renderItem(item, index)}\n\n {showSeparator && separator}\n </Fragment>\n )\n }","length","useMemo(() => {\n return items.map((item, index) => {\n const key = `${item}-${index}`\n const showSeparator = index < items.length - 1\n\n if (Array.isArray(item)) {\n return (\n <Fragment key={key}>\n <Tooltip\n content={\n <Flex gap={2} padding={2} flexDirection=\"column\">\n {item.map(renderItem)}\n </Flex>\n }\n >\n <Box>{renderItem('...', index)}</Box>\n </Tooltip>\n\n {showSeparator && separator}\n </Fragment>\n )\n }\n\n return (\n <Fragment key={key}>\n {renderItem(item, index)}\n\n {showSeparator && separator}\n </Fragment>\n )\n })\n }, [items])","<Flex alignItems=\"center\" as=\"ol\" gap={2}>\n {nodes}\n </Flex>","(nextValue: CommentMessage) => {\n onNewThreadCreate?.(nextValue)\n setValue(EMPTY_PT_ARRAY)\n }","useCallback(\n (nextValue: CommentMessage) => {\n onNewThreadCreate?.(nextValue)\n setValue(EMPTY_PT_ARRAY)\n },\n [onNewThreadCreate],\n )","hasCommentMessageValue(value)","useMemo(() => hasCommentMessageValue(value), [value])","() => {\n if (!hasValue) {\n return\n }\n commentInputHandle.current?.discardDialogController.open()\n }","useCallback(() => {\n if (!hasValue) {\n return\n }\n commentInputHandle.current?.discardDialogController.open()\n }, [hasValue])","(event: React.KeyboardEvent) => {\n // Don't act if the input already prevented this event\n if (event.isDefaultPrevented()) {\n return\n }\n // Discard the input text\n if (event.key === 'Escape') {\n event.preventDefault()\n event.stopPropagation()\n startDiscard()\n }\n // Call parent handler\n if (onKeyDown) onKeyDown(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 // Discard the input text\n if (event.key === 'Escape') {\n event.preventDefault()\n event.stopPropagation()\n startDiscard()\n }\n // Call parent handler\n if (onKeyDown) onKeyDown(event)\n },\n [onKeyDown, startDiscard],\n )","() => {\n setValue(EMPTY_PT_ARRAY)\n commentInputHandle.current?.discardDialogController.close()\n commentInputHandle.current?.focus()\n }","useCallback(() => {\n setValue(EMPTY_PT_ARRAY)\n commentInputHandle.current?.discardDialogController.close()\n commentInputHandle.current?.focus()\n }, [])","() => {\n commentInputHandle.current?.discardDialogController.close()\n }","useCallback(() => {\n commentInputHandle.current?.discardDialogController.close()\n }, [])","mode === 'upsell' ? (\n t('compose.add-comment-input-placeholder-upsell')\n ) : (\n <Translate\n t={t}\n i18nKey=\"compose.add-comment-input-placeholder\"\n values={{field: fieldTitle}}\n />\n )","<CommentInput\n currentUser={currentUser}\n expandOnFocus\n mentionOptions={mentionOptions}\n onBlur={onBlur}\n onChange={setValue}\n onDiscardCancel={cancelDiscard}\n onDiscardConfirm={confirmDiscard}\n onKeyDown={handleInputKeyDown}\n onFocus={onFocus}\n onSubmit={handleSubmit}\n placeholder={placeholder}\n readOnly={readOnly || mode === 'upsell'}\n ref={commentInputHandle}\n value={value}\n />","readOnly || mode === 'upsell'","(payload: CommentMessage) => {\n const nextComment: CommentBaseCreatePayload = {\n message: payload,\n parentCommentId: undefined,\n status: 'open',\n // Since this is a new comment, we generate a new thread ID\n threadId: uuid(),\n // New comments have no reactions\n reactions: [],\n\n payload: {\n fieldPath,\n },\n }\n\n onNewThreadCreate?.(nextComment)\n }","useCallback(\n (payload: CommentMessage) => {\n const nextComment: CommentBaseCreatePayload = {\n message: payload,\n parentCommentId: undefined,\n status: 'open',\n // Since this is a new comment, we generate a new thread ID\n threadId: uuid(),\n // New comments have no reactions\n reactions: [],\n\n payload: {\n fieldPath,\n },\n }\n\n onNewThreadCreate?.(nextComment)\n },\n [onNewThreadCreate, fieldPath],\n )","(e: MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation()\n\n onPathSelect?.({\n fieldPath,\n origin: 'inspector',\n threadId: null,\n })\n }","useCallback(\n (e: MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation()\n\n onPathSelect?.({\n fieldPath,\n origin: 'inspector',\n threadId: null,\n })\n },\n [fieldPath, onPathSelect],\n )","(e: MouseEvent<HTMLDivElement>) => {\n e.stopPropagation()\n // Skip if the click was triggered from \"Enter\" keydown.\n // This because we don't want to trigger `onPathSelect` when\n // submitting the new thread form.\n if (e.detail === 0) return\n\n onPathSelect?.({\n fieldPath,\n origin: 'inspector',\n threadId: null,\n })\n }","e","useCallback(\n (e: MouseEvent<HTMLDivElement>) => {\n e.stopPropagation()\n // Skip if the click was triggered from \"Enter\" keydown.\n // This because we don't want to trigger `onPathSelect` when\n // submitting the new thread form.\n if (e.detail === 0) return\n\n onPathSelect?.({\n fieldPath,\n origin: 'inspector',\n threadId: null,\n })\n },\n [fieldPath, onPathSelect],\n )","breadcrumbs?.map((p) => p.title) || []","(p) => p.title","breadcrumbs?.map","useMemo(() => breadcrumbs?.map((p) => p.title) || [], [breadcrumbs])","t('list-item.breadcrumb-button-go-to-field-aria-label', {\n field: lastCrumb,\n })","<CommentBreadcrumbs maxLength={3} titlePath={crumbsTitlePath} />","<HeaderFlex alignItems=\"center\" gap={2} paddingRight={1}>\n <Flex flexBasis=\"0%\" flexGrow={1} flexDirection=\"column\">\n <Flex alignItems=\"center\">\n <BreadcrumbsButton\n aria-label={t('list-item.breadcrumb-button-go-to-field-aria-label', {\n field: lastCrumb,\n })}\n mode=\"bleed\"\n onClick={handleBreadcrumbsClick}\n padding={2}\n gap={2}\n >\n <CommentBreadcrumbs maxLength={3} titlePath={crumbsTitlePath} />\n </BreadcrumbsButton>\n </Flex>\n </Flex>\n </HeaderFlex>","canCreateNewThread && (\n <ThreadCard onClick={handleNewThreadClick} data-active={isSelected}>\n <CreateNewThreadInput\n currentUser={currentUser}\n fieldTitle={lastCrumb}\n mentionOptions={mentionOptions}\n mode={mode}\n onNewThreadCreate={handleNewThreadCreate}\n readOnly={readOnly}\n />\n </ThreadCard>\n )","<VStack gap={2}>{children}</VStack>","<VStack gap={2}>\n <HeaderFlex alignItems=\"center\" gap={2} paddingRight={1}>\n <Flex flexBasis=\"0%\" flexGrow={1} flexDirection=\"column\">\n <Flex alignItems=\"center\">\n <BreadcrumbsButton\n aria-label={t('list-item.breadcrumb-button-go-to-field-aria-label', {\n field: lastCrumb,\n })}\n mode=\"bleed\"\n onClick={handleBreadcrumbsClick}\n padding={2}\n gap={2}\n >\n <CommentBreadcrumbs maxLength={3} titlePath={crumbsTitlePath} />\n </BreadcrumbsButton>\n </Flex>\n </Flex>\n </HeaderFlex>\n\n {canCreateNewThread && (\n <ThreadCard onClick={handleNewThreadClick} data-active={isSelected}>\n <CreateNewThreadInput\n currentUser={currentUser}\n fieldTitle={lastCrumb}\n mentionOptions={mentionOptions}\n mode={mode}\n onNewThreadCreate={handleNewThreadCreate}\n readOnly={readOnly}\n />\n </ThreadCard>\n )}\n\n <VStack gap={2}>{children}</VStack>\n </VStack>","Object.entries(groupThreads(comments))","useMemo(() => Object.entries(groupThreads(comments)), [comments])","mode !== 'upsell' && (\n <CommentsListStatus\n error={error}\n hasNoComments={groupedThreads.length === 0}\n loading={loading}\n status={status}\n />\n )","groupedThreads.length","(showComments || beforeListNode) && (\n <Flex\n as=\"ul\"\n flexBasis=\"0%\"\n flexGrow={1}\n overflow=\"auto\"\n padding={3}\n paddingTop={1}\n paddingBottom={6}\n gap={1}\n ref={ref}\n flexDirection=\"column\"\n >\n {beforeListNode}\n\n <BoundaryElementProvider element={boundaryElement}>\n {groupedThreads?.map(([fieldPath, group]) => {\n // Since all threads in the group point to the same field, the breadcrumbs will be\n // the same for all of them. Therefore, we can just pick the first one.\n const breadcrumbs = group[0].breadcrumbs\n\n // The thread ID is used to scroll to the thread.\n // We pick the first thread id in the group so that we scroll to the first thread\n // in the group.\n const firstThreadId = group[0].threadId\n\n // The new thread is selected if the field path matches the selected path and\n // there is no thread ID selected.\n const newThreadSelected =\n selectedPath?.fieldPath === fieldPath && !selectedPath.threadId\n\n return (\n <Flex\n key={fieldPath}\n as=\"li\"\n paddingTop={3}\n {...applyCommentsGroupAttr(firstThreadId)}\n flexDirection=\"column\"\n flexShrink={0}\n >\n <CommentThreadLayout\n key={fieldPath}\n breadcrumbs={breadcrumbs}\n canCreateNewThread={status === 'open'}\n currentUser={currentUser}\n fieldPath={fieldPath}\n isSelected={newThreadSelected}\n mentionOptions={mentionOptions}\n mode={mode}\n onNewThreadCreate={onNewThreadCreate}\n onPathSelect={onPathSelect}\n readOnly={readOnly}\n >\n {group.map((item) => {\n // The default sort order is by date, descending (newest first).\n // However, inside a thread, we want the order to be ascending (oldest first).\n // So we reverse the array here.\n // We use slice() to avoid mutating the original array.\n const replies = item.replies.slice().reverse()\n\n const canReply =\n status === 'open' &&\n item.parentComment._state?.type !== 'createError' &&\n item.parentComment._state?.type !== 'createRetrying'\n\n // The thread is selected if the thread ID and field path matches the\n // selected path.\n const threadIsSelected =\n selectedPath?.threadId === item.parentComment.threadId &&\n selectedPath?.fieldPath === item.parentComment.target.path?.field\n\n return (\n <CommentsListItem\n key={item.parentComment._id}\n canReply={canReply}\n currentUser={currentUser}\n hasReferencedValue={item.hasReferencedValue}\n isSelected={threadIsSelected}\n mentionOptions={mentionOptions}\n mode={mode}\n onCopyLink={onCopyLink}\n onCreateRetry={onCreateRetry}\n onDelete={onDelete}\n onEdit={onEdit}\n onPathSelect={onPathSelect}\n onReactionSelect={onReactionSelect}\n onReply={onReply}\n onStatusChange={onStatusChange}\n parentComment={item.parentComment}\n readOnly={readOnly}\n replies={replies}\n />\n )\n })}\n </CommentThreadLayout>\n </Flex>\n )\n })}\n </BoundaryElementProvider>\n </Flex>\n )","groupedThreads?.map","selectedPath?.fieldPath","[fieldPath, group]","<Flex\n data-testid=\"comments-list\"\n flexDirection=\"column\"\n flexBasis=\"0%\"\n flexGrow={1}\n height=\"100%\"\n overflow=\"hidden\"\n ref={setBoundaryElement}\n >\n {mode !== 'upsell' && (\n <CommentsListStatus\n error={error}\n hasNoComments={groupedThreads.length === 0}\n loading={loading}\n status={status}\n />\n )}\n\n {(showComments || beforeListNode) && (\n <Flex\n as=\"ul\"\n flexBasis=\"0%\"\n flexGrow={1}\n overflow=\"auto\"\n padding={3}\n paddingTop={1}\n paddingBottom={6}\n gap={1}\n ref={ref}\n flexDirection=\"column\"\n >\n {beforeListNode}\n\n <BoundaryElementProvider element={boundaryElement}>\n {groupedThreads?.map(([fieldPath, group]) => {\n // Since all threads in the group point to the same field, the breadcrumbs will be\n // the same for all of them. Therefore, we can just pick the first one.\n const breadcrumbs = group[0].breadcrumbs\n\n // The thread ID is used to scroll to the thread.\n // We pick the first thread id in the group so that we scroll to the first thread\n // in the group.\n const firstThreadId = group[0].threadId\n\n // The new thread is selected if the field path matches the selected path and\n // there is no thread ID selected.\n const newThreadSelected =\n selectedPath?.fieldPath === fieldPath && !selectedPath.threadId\n\n return (\n <Flex\n key={fieldPath}\n as=\"li\"\n paddingTop={3}\n {...applyCommentsGroupAttr(firstThreadId)}\n flexDirection=\"column\"\n flexShrink={0}\n >\n <CommentThreadLayout\n key={fieldPath}\n breadcrumbs={breadcrumbs}\n canCreateNewThread={status === 'open'}\n currentUser={currentUser}\n fieldPath={fieldPath}\n isSelected={newThreadSelected}\n mentionOptions={mentionOptions}\n mode={mode}\n onNewThreadCreate={onNewThreadCreate}\n onPathSelect={onPathSelect}\n readOnly={readOnly}\n >\n {group.map((item) => {\n // The default sort order is by date, descending (newest first).\n // However, inside a thread, we want the order to be ascending (oldest first).\n // So we reverse the array here.\n // We use slice() to avoid mutating the original array.\n const replies = item.replies.slice().reverse()\n\n const canReply =\n status === 'open' &&\n item.parentComment._state?.type !== 'createError' &&\n item.parentComment._state?.type !== 'createRetrying'\n\n // The thread is selected if the thread ID and field path matches the\n // selected path.\n const threadIsSelected =\n selectedPath?.threadId === item.parentComment.threadId &&\n selectedPath?.fieldPath === item.parentComment.target.path?.field\n\n return (\n <CommentsListItem\n key={item.parentComment._id}\n canReply={canReply}\n currentUser={currentUser}\n hasReferencedValue={item.hasReferencedValue}\n isSelected={threadIsSelected}\n mentionOptions={mentionOptions}\n mode={mode}\n onCopyLink={onCopyLink}\n onCreateRetry={onCreateRetry}\n onDelete={onDelete}\n onEdit={onEdit}\n onPathSelect={onPathSelect}\n onReactionSelect={onReactionSelect}\n onReply={onReply}\n onStatusChange={onStatusChange}\n parentComment={item.parentComment}\n readOnly={readOnly}\n replies={replies}\n />\n )\n })}\n </CommentThreadLayout>\n </Flex>\n )\n })}\n </BoundaryElementProvider>\n </Flex>\n )}\n </Flex>","() => {\n telemetry.log(CommentLinkCopied)\n }","useCallback(() => {\n telemetry.log(CommentLinkCopied)\n }, [telemetry])","() => {\n telemetry.log(CommentViewedFromLink)\n }","useCallback(() => {\n telemetry.log(CommentViewedFromLink)\n }, [telemetry])","(view: CommentStatus) => {\n telemetry.log(CommentListViewChanged, {view})\n }","useCallback(\n (view: CommentStatus) => {\n telemetry.log(CommentListViewChanged, {view})\n },\n [telemetry],\n )","{\n commentLinkCopied,\n commentListViewChanged,\n commentViewedFromLink,\n }","useMemo(\n (): CommentsTelemetryHookValue => ({\n commentLinkCopied,\n commentListViewChanged,\n commentViewedFromLink,\n }),\n [commentLinkCopied, commentListViewChanged, commentViewedFromLink],\n )"],"sources":["../src/core/comments/components/list/CommentsListStatus.tsx","../src/core/comments/components/CommentBreadcrumbs.tsx","../src/core/comments/components/list/CreateNewThreadInput.tsx","../src/core/comments/components/list/CommentThreadLayout.tsx","../src/core/comments/components/list/CommentsList.tsx","../src/core/comments/__telemetry__/comments.telemetry.ts","../src/core/comments/hooks/useCommentsTelemetry.ts"],"sourcesContent":["import {Text, Container, Flex, VStack} from 'ui5'\n\nimport {LoadingBlock} from '../../../components/loadingBlock/LoadingBlock'\nimport {useTranslation} from '../../../i18n/hooks/useTranslation'\nimport {type TFunction} from '../../../i18n/types'\nimport {commentsLocaleNamespace} from '../../i18n'\nimport {type CommentStatus} from '../../types'\n\ninterface EmptyStateMessage {\n title: string\n message: React.ReactNode\n}\n\nfunction getEmptyStateMessages(t: TFunction): Record<CommentStatus, EmptyStateMessage> {\n return {\n open: {\n title: t('list-status.empty-state-open-title'),\n message: t('list-status.empty-state-open-text'),\n },\n resolved: {\n title: t('list-status.empty-state-resolved-title'),\n message: t('list-status.empty-state-resolved-text'),\n },\n }\n}\n\ninterface CommentsListStatusProps {\n error: Error | null\n hasNoComments: boolean\n loading: boolean\n status: CommentStatus\n}\n\nexport function CommentsListStatus(props: CommentsListStatusProps) {\n const {status, error, loading, hasNoComments} = props\n const {t} = useTranslation(commentsLocaleNamespace)\n const emptyStateMessages = getEmptyStateMessages(t)\n\n if (error) {\n return (\n <Flex alignItems=\"center\" justifyContent=\"center\" flexBasis=\"0%\" flexGrow={1} padding={4}>\n <Flex alignItems=\"center\">\n <Text size={1} muted as=\"div\" trim={true}>\n {t('list-status.error')}\n </Text>\n </Flex>\n </Flex>\n )\n }\n\n if (loading) {\n return <LoadingBlock showText title={t('list-status.loading')} />\n }\n\n if (hasNoComments) {\n return (\n <Flex alignItems=\"center\" justifyContent=\"center\" flexBasis=\"0%\" flexGrow={1}>\n <Container size={0} padding={4}>\n <VStack gap={3}>\n <Text align=\"center\" size={1} muted weight=\"medium\" as=\"div\" trim={true}>\n {emptyStateMessages[status].title}\n </Text>\n\n <Text align=\"center\" size={1} muted as=\"div\" trim={true}>\n {emptyStateMessages[status].message}\n </Text>\n </VStack>\n </Container>\n </Flex>\n )\n }\n\n return null\n}\n","import {ChevronRightIcon} from '@sanity/icons/ChevronRight'\nimport {Fragment, useMemo} from 'react'\nimport {Text, Box, Flex, Icon} from 'ui5'\n\nimport {Tooltip} from '../../../ui-components/tooltip/Tooltip'\n\nexport interface CommentBreadcrumbsProps {\n titlePath: string[]\n maxLength: number\n}\n\ntype Item = string | string[]\n\nconst separator = <Icon muted icon={ChevronRightIcon} style={{margin: '-0.4375rem'}} />\n\nconst renderItem = (item: string, index: number) => {\n return (\n <Box key={`${item}-${index}`} as=\"li\">\n <Text truncate={1} size={1} weight=\"medium\" as=\"div\" trim={true}>\n {item}\n </Text>\n </Box>\n )\n}\n\nexport function CommentBreadcrumbs(props: CommentBreadcrumbsProps) {\n const {titlePath, maxLength} = props\n\n const items: Item[] = useMemo(() => {\n const len = titlePath.length\n const beforeLength = Math.ceil(maxLength / 2)\n const afterLength = Math.floor(maxLength / 2)\n\n if (maxLength && len > maxLength) {\n return [\n ...titlePath.slice(0, beforeLength - 1),\n titlePath.slice(beforeLength - 1, len - afterLength),\n ...titlePath.slice(len - afterLength),\n ]\n }\n\n return titlePath\n }, [maxLength, titlePath])\n\n const nodes = useMemo(() => {\n return items.map((item, index) => {\n const key = `${item}-${index}`\n const showSeparator = index < items.length - 1\n\n if (Array.isArray(item)) {\n return (\n <Fragment key={key}>\n <Tooltip\n content={\n <Flex gap={2} padding={2} flexDirection=\"column\">\n {item.map(renderItem)}\n </Flex>\n }\n >\n <Box>{renderItem('...', index)}</Box>\n </Tooltip>\n\n {showSeparator && separator}\n </Fragment>\n )\n }\n\n return (\n <Fragment key={key}>\n {renderItem(item, index)}\n\n {showSeparator && separator}\n </Fragment>\n )\n })\n }, [items])\n\n return (\n <Flex alignItems=\"center\" as=\"ol\" gap={2}>\n {nodes}\n </Flex>\n )\n}\n","import {type CurrentUser, type PortableTextBlock} from '@sanity/types'\nimport {useCallback, useMemo, useRef, useState} from 'react'\n\nimport {type UserListWithPermissionsHookValue} from '../../../hooks/useUserListWithPermissions'\nimport {useTranslation} from '../../../i18n/hooks/useTranslation'\nimport {Translate} from '../../../i18n/Translate'\nimport {hasCommentMessageValue} from '../../helpers'\nimport {commentsLocaleNamespace} from '../../i18n'\nimport {type CommentMessage, type CommentsUIMode} from '../../types'\nimport {\n CommentInput,\n type CommentInputHandle,\n type CommentInputProps,\n} from '../pte/comment-input/CommentInput'\n\nconst EMPTY_PT_ARRAY: PortableTextBlock[] = []\n\ninterface CreateNewThreadInputProps {\n currentUser: CurrentUser\n fieldTitle: string\n mentionOptions: UserListWithPermissionsHookValue\n mode: CommentsUIMode\n onBlur?: CommentInputProps['onBlur']\n onFocus?: CommentInputProps['onFocus']\n onKeyDown?: (event: React.KeyboardEvent) => void\n onNewThreadCreate: (payload: CommentMessage) => void\n readOnly?: boolean\n}\n\nexport function CreateNewThreadInput(props: CreateNewThreadInputProps) {\n const {\n currentUser,\n fieldTitle,\n mentionOptions,\n mode,\n onBlur,\n onFocus,\n onKeyDown,\n onNewThreadCreate,\n readOnly,\n } = props\n const {t} = useTranslation(commentsLocaleNamespace)\n\n const [value, setValue] = useState<CommentMessage>(EMPTY_PT_ARRAY)\n const commentInputHandle = useRef<CommentInputHandle | null>(null)\n\n const handleSubmit = useCallback(\n (nextValue: CommentMessage) => {\n onNewThreadCreate?.(nextValue)\n setValue(EMPTY_PT_ARRAY)\n },\n [onNewThreadCreate],\n )\n\n const hasValue = useMemo(() => hasCommentMessageValue(value), [value])\n\n const startDiscard = useCallback(() => {\n if (!hasValue) {\n return\n }\n commentInputHandle.current?.discardDialogController.open()\n }, [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 // Discard the input text\n if (event.key === 'Escape') {\n event.preventDefault()\n event.stopPropagation()\n startDiscard()\n }\n // Call parent handler\n if (onKeyDown) onKeyDown(event)\n },\n [onKeyDown, startDiscard],\n )\n\n const confirmDiscard = useCallback(() => {\n setValue(EMPTY_PT_ARRAY)\n commentInputHandle.current?.discardDialogController.close()\n commentInputHandle.current?.focus()\n }, [])\n\n const cancelDiscard = useCallback(() => {\n commentInputHandle.current?.discardDialogController.close()\n }, [])\n\n const placeholder =\n mode === 'upsell' ? (\n t('compose.add-comment-input-placeholder-upsell')\n ) : (\n <Translate\n t={t}\n i18nKey=\"compose.add-comment-input-placeholder\"\n values={{field: fieldTitle}}\n />\n )\n\n return (\n <CommentInput\n currentUser={currentUser}\n expandOnFocus\n mentionOptions={mentionOptions}\n onBlur={onBlur}\n onChange={setValue}\n onDiscardCancel={cancelDiscard}\n onDiscardConfirm={confirmDiscard}\n onKeyDown={handleInputKeyDown}\n onFocus={onFocus}\n onSubmit={handleSubmit}\n placeholder={placeholder}\n readOnly={readOnly || mode === 'upsell'}\n ref={commentInputHandle}\n value={value}\n />\n )\n}\n","import {type CurrentUser} from '@sanity/types'\nimport {\n // oxlint-disable-next-line no-restricted-imports\n Button, // Button with specific styling and children behavior.\n} from '@sanity/ui'\nimport {uuid} from '@sanity/uuid'\nimport {type MouseEvent, type ReactNode, useCallback, useMemo} from 'react'\nimport {css, styled} from 'styled-components'\nimport {Flex, VStack} from 'ui5'\n\nimport {type UserListWithPermissionsHookValue} from '../../../hooks/useUserListWithPermissions'\nimport {useTranslation} from '../../../i18n/hooks/useTranslation'\nimport {type CommentsSelectedPath} from '../../context/selected-path/types'\nimport {commentsLocaleNamespace} from '../../i18n'\nimport {\n type CommentBaseCreatePayload,\n type CommentListBreadcrumbs,\n type CommentMessage,\n type CommentsUIMode,\n} from '../../types'\nimport {CommentBreadcrumbs} from '../CommentBreadcrumbs'\nimport {CreateNewThreadInput} from './CreateNewThreadInput'\nimport {ThreadCard} from './styles'\n\nconst HeaderFlex = styled(Flex)`\n min-height: 25px;\n`\n\nconst BreadcrumbsButton = styled(Button)(({theme}) => {\n // oxlint-disable-next-line no-deprecated -- will fix in follow up PR\n const fg = theme.sanity.color.base.fg\n return css`\n --card-fg-color: ${fg};\n\n // The width is needed to make the text ellipsis work\n // in the breadcrumbs component\n max-width: 100%;\n `\n})\n\ninterface CommentThreadLayoutProps {\n breadcrumbs?: CommentListBreadcrumbs\n canCreateNewThread: boolean\n children: ReactNode\n currentUser: CurrentUser\n fieldPath: string\n isSelected: boolean\n mentionOptions: UserListWithPermissionsHookValue\n mode: CommentsUIMode\n onNewThreadCreate: (payload: CommentBaseCreatePayload) => void\n onPathSelect?: (nextPath: CommentsSelectedPath) => void\n readOnly?: boolean\n}\n\nexport function CommentThreadLayout(props: CommentThreadLayoutProps) {\n const {\n breadcrumbs,\n canCreateNewThread,\n children,\n currentUser,\n fieldPath,\n isSelected,\n mentionOptions,\n mode,\n onNewThreadCreate,\n onPathSelect,\n readOnly,\n } = props\n\n const {t} = useTranslation(commentsLocaleNamespace)\n\n const handleNewThreadCreate = useCallback(\n (payload: CommentMessage) => {\n const nextComment: CommentBaseCreatePayload = {\n message: payload,\n parentCommentId: undefined,\n status: 'open',\n // Since this is a new comment, we generate a new thread ID\n threadId: uuid(),\n // New comments have no reactions\n reactions: [],\n\n payload: {\n fieldPath,\n },\n }\n\n onNewThreadCreate?.(nextComment)\n },\n [onNewThreadCreate, fieldPath],\n )\n\n const handleBreadcrumbsClick = useCallback(\n (e: MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation()\n\n onPathSelect?.({\n fieldPath,\n origin: 'inspector',\n threadId: null,\n })\n },\n [fieldPath, onPathSelect],\n )\n\n const handleNewThreadClick = useCallback(\n (e: MouseEvent<HTMLDivElement>) => {\n e.stopPropagation()\n // Skip if the click was triggered from \"Enter\" keydown.\n // This because we don't want to trigger `onPathSelect` when\n // submitting the new thread form.\n if (e.detail === 0) return\n\n onPathSelect?.({\n fieldPath,\n origin: 'inspector',\n threadId: null,\n })\n },\n [fieldPath, onPathSelect],\n )\n\n const crumbsTitlePath = useMemo(() => breadcrumbs?.map((p) => p.title) || [], [breadcrumbs])\n const lastCrumb = crumbsTitlePath[crumbsTitlePath.length - 1]\n\n return (\n <VStack gap={2}>\n <HeaderFlex alignItems=\"center\" gap={2} paddingRight={1}>\n <Flex flexBasis=\"0%\" flexGrow={1} flexDirection=\"column\">\n <Flex alignItems=\"center\">\n <BreadcrumbsButton\n aria-label={t('list-item.breadcrumb-button-go-to-field-aria-label', {\n field: lastCrumb,\n })}\n mode=\"bleed\"\n onClick={handleBreadcrumbsClick}\n padding={2}\n gap={2}\n >\n <CommentBreadcrumbs maxLength={3} titlePath={crumbsTitlePath} />\n </BreadcrumbsButton>\n </Flex>\n </Flex>\n </HeaderFlex>\n\n {canCreateNewThread && (\n <ThreadCard onClick={handleNewThreadClick} data-active={isSelected}>\n <CreateNewThreadInput\n currentUser={currentUser}\n fieldTitle={lastCrumb}\n mentionOptions={mentionOptions}\n mode={mode}\n onNewThreadCreate={handleNewThreadCreate}\n readOnly={readOnly}\n />\n </ThreadCard>\n )}\n\n <VStack gap={2}>{children}</VStack>\n </VStack>\n )\n}\n","import {type CurrentUser} from '@sanity/types'\nimport {BoundaryElementProvider} from '@sanity/ui'\nimport {memo, useMemo, useState, type RefAttributes} from 'react'\nimport {Flex} from 'ui5'\n\nimport {type UserListWithPermissionsHookValue} from '../../../hooks/useUserListWithPermissions'\nimport {type CommentsSelectedPath} from '../../context/selected-path/types'\nimport {applyCommentsGroupAttr} from '../../hooks/useCommentsScroll'\nimport {\n type CommentBaseCreatePayload,\n type CommentReactionOption,\n type CommentStatus,\n type CommentsUIMode,\n type CommentThreadItem,\n type CommentUpdatePayload,\n} from '../../types'\nimport {CommentsListItem} from './CommentsListItem'\nimport {CommentsListStatus} from './CommentsListStatus'\nimport {CommentThreadLayout} from './CommentThreadLayout'\n\ninterface GroupedComments {\n [field: string]: CommentThreadItem[]\n}\n\nfunction groupThreads(comments: CommentThreadItem[]) {\n return comments.reduce((acc, comment) => {\n const field = comment.fieldPath\n\n if (!acc[field]) {\n acc[field] = []\n }\n\n acc[field].push(comment)\n\n return acc\n }, {} as GroupedComments)\n}\n\n/**\n * @beta\n * @hidden\n */\nexport interface CommentsListProps {\n beforeListNode?: React.ReactNode\n comments: CommentThreadItem[]\n currentUser: CurrentUser\n error: Error | null\n loading: boolean\n mentionOptions: UserListWithPermissionsHookValue\n mode: CommentsUIMode\n onCopyLink?: (id: string) => void\n onCreateRetry: (id: string) => void\n onDelete: (id: string) => void\n onEdit: (id: string, payload: CommentUpdatePayload) => void\n onNewThreadCreate: (payload: CommentBaseCreatePayload) => void\n /**\n * @internal\n */\n onPathSelect?: (nextPath: CommentsSelectedPath) => void\n onReactionSelect?: (id: string, reaction: CommentReactionOption) => void\n onReply: (payload: CommentBaseCreatePayload) => void\n onStatusChange?: (id: string, status: CommentStatus) => void\n readOnly?: boolean\n /**\n * @internal\n */\n selectedPath: CommentsSelectedPath | null\n status: CommentStatus\n}\n\n/**\n * @beta\n * @hidden\n */\nexport interface CommentsListHandle {\n scrollToComment: (id: string) => void\n}\n\nfunction CommentsListInner(props: CommentsListProps & RefAttributes<HTMLUListElement>) {\n const {\n ref,\n beforeListNode,\n comments,\n currentUser,\n error,\n loading,\n mentionOptions,\n mode,\n onCopyLink,\n onCreateRetry,\n onDelete,\n onEdit,\n onNewThreadCreate,\n onPathSelect,\n onReactionSelect,\n onReply,\n onStatusChange,\n readOnly,\n selectedPath,\n status,\n } = props\n const [boundaryElement, setBoundaryElement] = useState<HTMLDivElement | null>(null)\n\n const groupedThreads = useMemo(() => Object.entries(groupThreads(comments)), [comments])\n\n const showComments = !loading && !error && groupedThreads.length > 0\n\n return (\n <Flex\n data-testid=\"comments-list\"\n flexDirection=\"column\"\n flexBasis=\"0%\"\n flexGrow={1}\n height=\"100%\"\n overflow=\"hidden\"\n ref={setBoundaryElement}\n >\n {mode !== 'upsell' && (\n <CommentsListStatus\n error={error}\n hasNoComments={groupedThreads.length === 0}\n loading={loading}\n status={status}\n />\n )}\n\n {(showComments || beforeListNode) && (\n <Flex\n as=\"ul\"\n flexBasis=\"0%\"\n flexGrow={1}\n overflow=\"auto\"\n padding={3}\n paddingTop={1}\n paddingBottom={6}\n gap={1}\n ref={ref}\n flexDirection=\"column\"\n >\n {beforeListNode}\n\n <BoundaryElementProvider element={boundaryElement}>\n {groupedThreads?.map(([fieldPath, group]) => {\n // Since all threads in the group point to the same field, the breadcrumbs will be\n // the same for all of them. Therefore, we can just pick the first one.\n const breadcrumbs = group[0].breadcrumbs\n\n // The thread ID is used to scroll to the thread.\n // We pick the first thread id in the group so that we scroll to the first thread\n // in the group.\n const firstThreadId = group[0].threadId\n\n // The new thread is selected if the field path matches the selected path and\n // there is no thread ID selected.\n const newThreadSelected =\n selectedPath?.fieldPath === fieldPath && !selectedPath.threadId\n\n return (\n <Flex\n key={fieldPath}\n as=\"li\"\n paddingTop={3}\n {...applyCommentsGroupAttr(firstThreadId)}\n flexDirection=\"column\"\n flexShrink={0}\n >\n <CommentThreadLayout\n key={fieldPath}\n breadcrumbs={breadcrumbs}\n canCreateNewThread={status === 'open'}\n currentUser={currentUser}\n fieldPath={fieldPath}\n isSelected={newThreadSelected}\n mentionOptions={mentionOptions}\n mode={mode}\n onNewThreadCreate={onNewThreadCreate}\n onPathSelect={onPathSelect}\n readOnly={readOnly}\n >\n {group.map((item) => {\n // The default sort order is by date, descending (newest first).\n // However, inside a thread, we want the order to be ascending (oldest first).\n // So we reverse the array here.\n // We use slice() to avoid mutating the original array.\n const replies = item.replies.slice().reverse()\n\n const canReply =\n status === 'open' &&\n item.parentComment._state?.type !== 'createError' &&\n item.parentComment._state?.type !== 'createRetrying'\n\n // The thread is selected if the thread ID and field path matches the\n // selected path.\n const threadIsSelected =\n selectedPath?.threadId === item.parentComment.threadId &&\n selectedPath?.fieldPath === item.parentComment.target.path?.field\n\n return (\n <CommentsListItem\n key={item.parentComment._id}\n canReply={canReply}\n currentUser={currentUser}\n hasReferencedValue={item.hasReferencedValue}\n isSelected={threadIsSelected}\n mentionOptions={mentionOptions}\n mode={mode}\n onCopyLink={onCopyLink}\n onCreateRetry={onCreateRetry}\n onDelete={onDelete}\n onEdit={onEdit}\n onPathSelect={onPathSelect}\n onReactionSelect={onReactionSelect}\n onReply={onReply}\n onStatusChange={onStatusChange}\n parentComment={item.parentComment}\n readOnly={readOnly}\n replies={replies}\n />\n )\n })}\n </CommentThreadLayout>\n </Flex>\n )\n })}\n </BoundaryElementProvider>\n </Flex>\n )}\n </Flex>\n )\n}\n\n/**\n * @beta\n * @hidden\n */\nexport const CommentsList = memo(CommentsListInner)\n","import {defineEvent} from '@sanity/telemetry'\n\nimport {type CommentStatus} from '../types'\n\nexport const CommentLinkCopied = defineEvent({\n name: 'Comment Link Copied',\n version: 1,\n description: 'The link to a comment is copied',\n})\n\nexport const CommentViewedFromLink = defineEvent({\n name: 'Comment Viewed From Link',\n version: 1,\n description: 'A comment is viewed from a link',\n})\n\nexport const CommentListViewChanged = defineEvent<{view: CommentStatus}>({\n name: 'Comment List View Changed',\n version: 1,\n description: 'The view of the comment list is changed',\n})\n","import {useTelemetry} from '@sanity/telemetry/react'\nimport {useCallback, useMemo} from 'react'\n\nimport {\n CommentLinkCopied,\n CommentListViewChanged,\n CommentViewedFromLink,\n} from '../__telemetry__/comments.telemetry'\nimport {type CommentStatus} from '../types'\n\ninterface CommentsTelemetryHookValue {\n commentLinkCopied: () => void\n commentListViewChanged: (view: CommentStatus) => void\n commentViewedFromLink: () => void\n}\n\n/** @internal */\nexport function useCommentsTelemetry(): CommentsTelemetryHookValue {\n const telemetry = useTelemetry()\n\n const commentLinkCopied = useCallback(() => {\n telemetry.log(CommentLinkCopied)\n }, [telemetry])\n\n const commentViewedFromLink = useCallback(() => {\n telemetry.log(CommentViewedFromLink)\n }, [telemetry])\n\n const commentListViewChanged = useCallback(\n (view: CommentStatus) => {\n telemetry.log(CommentListViewChanged, {view})\n },\n [telemetry],\n )\n\n return useMemo(\n (): CommentsTelemetryHookValue => ({\n commentLinkCopied,\n commentListViewChanged,\n commentViewedFromLink,\n }),\n [commentLinkCopied, commentListViewChanged, commentViewedFromLink],\n )\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import { vn as getPreviewStateObservable } from "./PerspectiveProvider-Yk7lgugx.js";
2
- import { Zt as useSchema, r as useDocumentPreviewStore } from "./datastores-D1tF4HQA.js";
3
- import { nt as usePerspective } from "./useActiveReleases-Bh_Q6f7G.js";
1
+ import { vn as getPreviewStateObservable } from "./PerspectiveProvider-D-6sweQH.js";
2
+ import { Zt as useSchema, r as useDocumentPreviewStore } from "./datastores-DNOJm1LF.js";
3
+ import { nt as usePerspective } from "./useActiveReleases-DxYjyTB1.js";
4
4
  import { of } from "rxjs";
5
5
  import { c } from "react/compiler-runtime";
6
6
  import { useObservable } from "react-rx";
@@ -37,4 +37,4 @@ function useDocumentPreviewValues(options) {
37
37
  }
38
38
  export { useDocumentPreviewValues as t };
39
39
 
40
- //# sourceMappingURL=useDocumentPreviewValues-CryTvfKc.js.map
40
+ //# sourceMappingURL=useDocumentPreviewValues-CK5VteK3.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useDocumentPreviewValues-CryTvfKc.js","names":["options || {}","useSchema().get(documentType)","useSchema()","useMemo(() => {\n if (!documentId || !schemaType) return of(null)\n return getPreviewStateObservable(\n documentPreviewStore,\n schemaType,\n documentId,\n perspectiveStackFromOptions ?? perspectiveStack,\n undefined,\n variant,\n )\n }, [\n documentId,\n documentPreviewStore,\n schemaType,\n perspectiveStackFromOptions,\n perspectiveStack,\n variant,\n ])","of(null)","getPreviewStateObservable(\n documentPreviewStore,\n schemaType,\n documentId,\n perspectiveStackFromOptions ?? perspectiveStack,\n undefined,\n variant,\n )","perspectiveStackFromOptions ?? perspectiveStack","previewState || {}","{\n title: documentTitle,\n subtitle,\n media,\n description,\n }","{\n isLoading,\n value: {\n title: documentTitle,\n subtitle,\n media,\n description,\n },\n }"],"sources":["../src/core/tasks/hooks/useDocumentPreviewValues.ts"],"sourcesContent":["import {type PreviewValue} from '@sanity/types'\nimport {type ElementType, type ReactNode, useMemo} from 'react'\nimport {useObservable} from 'react-rx'\nimport {of} from 'rxjs'\n\nimport {useSchema} from '../../hooks/useSchema'\nimport {usePerspective} from '../../perspective/usePerspective'\nimport {getPreviewStateObservable} from '../../preview/utils/getPreviewStateObservable'\nimport {useDocumentPreviewStore} from '../../store/datastores'\n\ninterface PreviewHookOptions {\n documentId: string\n documentType: string\n // to make sure that you can get the preview values for a document in a specific perspective stack\n perspectiveStack: string[]\n /**\n * The variant to resolve the preview values in, as a bare variant id. Like `perspectiveStack`,\n * this is explicit: callers that want the variant currently selected in the studio pass\n * `usePerspective().selectedVariantName`.\n */\n variant?: string\n}\n\ninterface PreviewHookValue {\n isLoading: boolean\n value: Partial<PreviewValue> | null\n}\n\n/** @internal */\nexport function useDocumentPreviewValues(options: PreviewHookOptions): PreviewHookValue {\n const {\n documentId,\n documentType,\n perspectiveStack: perspectiveStackFromOptions,\n variant,\n } = options || {}\n const schemaType = useSchema().get(documentType)\n\n const documentPreviewStore = useDocumentPreviewStore()\n // keeping it for now as to make sure that we can safely remove it later\n // the reason to not remove it now is that it would cause a breaking change\n // during run time and we want to avoid that for now (so we left the perspectiveStack in the props as mandatory)\n // @TODO remove\n const {perspectiveStack} = usePerspective()\n const previewStateObservable = useMemo(() => {\n if (!documentId || !schemaType) return of(null)\n return getPreviewStateObservable(\n documentPreviewStore,\n schemaType,\n documentId,\n perspectiveStackFromOptions ?? perspectiveStack,\n undefined,\n variant,\n )\n }, [\n documentId,\n documentPreviewStore,\n schemaType,\n perspectiveStackFromOptions,\n perspectiveStack,\n variant,\n ])\n const previewState = useObservable(previewStateObservable, undefined)\n\n const isLoading = previewState?.isLoading ?? true\n\n const {snapshot} = previewState || {}\n const documentTitle = snapshot?.title as string | undefined\n const subtitle = snapshot?.subtitle as string | undefined\n const description = snapshot?.description as string | undefined\n const media = snapshot?.media as ReactNode | ElementType | undefined\n\n return {\n isLoading,\n value: {\n title: documentTitle,\n subtitle,\n media,\n description,\n },\n }\n}\n"],"mappings":";;;;;;;AA6BA,SAAgB,yBAAyB,SAA+C;gBAMlFA;iCAAW,KAAA,WAAA,CAAC,GAAZ,EAAA,KAAA;CALJ,IAAM,EACJ,YACA,cACA,kBAAkB,6BAClB,YACEA,IACe,KAAA,UAAU,GAAVC;CAAgB,AAAA,EAAA,OAAA,gBAAA,EAAA,OAAhBC,MAAY,KAAA,GAAA,IAAI,YAAY,GAAZ,EAAA,KAAA,cAAhBA,EAAAA,KAAAA;CAAnB,IAAM,aAAaD,IAEb,uBAAuB,wBAAwB,GAK/C,EAAC,qBAAoB,eAAe,GACXE;;EAC7B,IAAI,CAAC,cAAc,CAAC,YAAA;GAAmBC,IAAAA;GAAP,oDAAU,KAAA,GAAA,IAAI,2BAAd,KAAOA;GAAP,MAAA;;EAK9B,IAAA,KAAA,+BAA+B,kBAJ1BC;EAAP,AAGE,EAAA,OAAA,cAAA,EAAA,OAFA,wBAAA,EAAA,OACA,cAAA,EAAA,OAEAC,MAAAA,EAAAA,QAEA,WANK,KAAA,0BACL,sBACA,YACA,YACAA,IACA,KAAA,GACA,OACF,GAJE,EAAA,KAAA,YAFA,EAAA,KAAA,sBACA,EAAA,KAAA,YAEAA,EAAAA,KAAAA,IAEA,EAAA,MAAA,mCANF,KAAOD;;CAgBT,IAAM,eAAe,cAAc,IAAwB,KAAA,CAAS,GAE9D,YAAY,cAAc,aAAa,IAE1BE;wCAAgB,KAAA,gBAAA,CAAC,GAAjB,EAAA,MAAA;CAAnB,IAAM,EAAC,aAAYA,IACb,gBAAgB,UAAU,OAC1B,WAAW,UAAU,UACrB,cAAc,UAAU,aACxB,QAAQ,UAAU,OAIfC;CAIL,AAAA,EAAA,QAAA,eAAA,EAAA,QAHO,iBAAA,EAAA,QAEP,SAAA,EAAA,QADA,YAFK,KAAA;EACL,OAAO;EACP;EACA;EACA;CACF,GADE,EAAA,MAAA,aAHO,EAAA,MAAA,eAEP,EAAA,MAAA,OADA,EAAA,MAAA;CAJGC,IAAAA;CAAP,OACE,EAAA,QAAA,aAAA,EAAA,QACOD,MAFF,KAAA;EACL;EACA,OAAOA;CAMT,GAPE,EAAA,MAAA,WACOA,EAAAA,MAAAA,8BAFFC;AAST"}
1
+ {"version":3,"file":"useDocumentPreviewValues-CK5VteK3.js","names":["options || {}","useSchema().get(documentType)","useSchema()","useMemo(() => {\n if (!documentId || !schemaType) return of(null)\n return getPreviewStateObservable(\n documentPreviewStore,\n schemaType,\n documentId,\n perspectiveStackFromOptions ?? perspectiveStack,\n undefined,\n variant,\n )\n }, [\n documentId,\n documentPreviewStore,\n schemaType,\n perspectiveStackFromOptions,\n perspectiveStack,\n variant,\n ])","of(null)","getPreviewStateObservable(\n documentPreviewStore,\n schemaType,\n documentId,\n perspectiveStackFromOptions ?? perspectiveStack,\n undefined,\n variant,\n )","perspectiveStackFromOptions ?? perspectiveStack","previewState || {}","{\n title: documentTitle,\n subtitle,\n media,\n description,\n }","{\n isLoading,\n value: {\n title: documentTitle,\n subtitle,\n media,\n description,\n },\n }"],"sources":["../src/core/tasks/hooks/useDocumentPreviewValues.ts"],"sourcesContent":["import {type PreviewValue} from '@sanity/types'\nimport {type ElementType, type ReactNode, useMemo} from 'react'\nimport {useObservable} from 'react-rx'\nimport {of} from 'rxjs'\n\nimport {useSchema} from '../../hooks/useSchema'\nimport {usePerspective} from '../../perspective/usePerspective'\nimport {getPreviewStateObservable} from '../../preview/utils/getPreviewStateObservable'\nimport {useDocumentPreviewStore} from '../../store/datastores'\n\ninterface PreviewHookOptions {\n documentId: string\n documentType: string\n // to make sure that you can get the preview values for a document in a specific perspective stack\n perspectiveStack: string[]\n /**\n * The variant to resolve the preview values in, as a bare variant id. Like `perspectiveStack`,\n * this is explicit: callers that want the variant currently selected in the studio pass\n * `usePerspective().selectedVariantName`.\n */\n variant?: string\n}\n\ninterface PreviewHookValue {\n isLoading: boolean\n value: Partial<PreviewValue> | null\n}\n\n/** @internal */\nexport function useDocumentPreviewValues(options: PreviewHookOptions): PreviewHookValue {\n const {\n documentId,\n documentType,\n perspectiveStack: perspectiveStackFromOptions,\n variant,\n } = options || {}\n const schemaType = useSchema().get(documentType)\n\n const documentPreviewStore = useDocumentPreviewStore()\n // keeping it for now as to make sure that we can safely remove it later\n // the reason to not remove it now is that it would cause a breaking change\n // during run time and we want to avoid that for now (so we left the perspectiveStack in the props as mandatory)\n // @TODO remove\n const {perspectiveStack} = usePerspective()\n const previewStateObservable = useMemo(() => {\n if (!documentId || !schemaType) return of(null)\n return getPreviewStateObservable(\n documentPreviewStore,\n schemaType,\n documentId,\n perspectiveStackFromOptions ?? perspectiveStack,\n undefined,\n variant,\n )\n }, [\n documentId,\n documentPreviewStore,\n schemaType,\n perspectiveStackFromOptions,\n perspectiveStack,\n variant,\n ])\n const previewState = useObservable(previewStateObservable, undefined)\n\n const isLoading = previewState?.isLoading ?? true\n\n const {snapshot} = previewState || {}\n const documentTitle = snapshot?.title as string | undefined\n const subtitle = snapshot?.subtitle as string | undefined\n const description = snapshot?.description as string | undefined\n const media = snapshot?.media as ReactNode | ElementType | undefined\n\n return {\n isLoading,\n value: {\n title: documentTitle,\n subtitle,\n media,\n description,\n },\n }\n}\n"],"mappings":";;;;;;;AA6BA,SAAgB,yBAAyB,SAA+C;gBAMlFA;iCAAW,KAAA,WAAA,CAAC,GAAZ,EAAA,KAAA;CALJ,IAAM,EACJ,YACA,cACA,kBAAkB,6BAClB,YACEA,IACe,KAAA,UAAU,GAAVC;CAAgB,AAAA,EAAA,OAAA,gBAAA,EAAA,OAAhBC,MAAY,KAAA,GAAA,IAAI,YAAY,GAAZ,EAAA,KAAA,cAAhBA,EAAAA,KAAAA;CAAnB,IAAM,aAAaD,IAEb,uBAAuB,wBAAwB,GAK/C,EAAC,qBAAoB,eAAe,GACXE;;EAC7B,IAAI,CAAC,cAAc,CAAC,YAAA;GAAmBC,IAAAA;GAAP,oDAAU,KAAA,GAAA,IAAI,2BAAd,KAAOA;GAAP,MAAA;;EAK9B,IAAA,KAAA,+BAA+B,kBAJ1BC;EAAP,AAGE,EAAA,OAAA,cAAA,EAAA,OAFA,wBAAA,EAAA,OACA,cAAA,EAAA,OAEAC,MAAAA,EAAAA,QAEA,WANK,KAAA,0BACL,sBACA,YACA,YACAA,IACA,KAAA,GACA,OACF,GAJE,EAAA,KAAA,YAFA,EAAA,KAAA,sBACA,EAAA,KAAA,YAEAA,EAAAA,KAAAA,IAEA,EAAA,MAAA,mCANF,KAAOD;;CAgBT,IAAM,eAAe,cAAc,IAAwB,KAAA,CAAS,GAE9D,YAAY,cAAc,aAAa,IAE1BE;wCAAgB,KAAA,gBAAA,CAAC,GAAjB,EAAA,MAAA;CAAnB,IAAM,EAAC,aAAYA,IACb,gBAAgB,UAAU,OAC1B,WAAW,UAAU,UACrB,cAAc,UAAU,aACxB,QAAQ,UAAU,OAIfC;CAIL,AAAA,EAAA,QAAA,eAAA,EAAA,QAHO,iBAAA,EAAA,QAEP,SAAA,EAAA,QADA,YAFK,KAAA;EACL,OAAO;EACP;EACA;EACA;CACF,GADE,EAAA,MAAA,aAHO,EAAA,MAAA,eAEP,EAAA,MAAA,OADA,EAAA,MAAA;CAJGC,IAAAA;CAAP,OACE,EAAA,QAAA,aAAA,EAAA,QACOD,MAFF,KAAA;EACL;EACA,OAAOA;CAMT,GAPE,EAAA,MAAA,WACOA,EAAAA,MAAAA,8BAFFC;AAST"}
@@ -1,4 +1,4 @@
1
- import { on as isRecord } from "./datastores-D1tF4HQA.js";
1
+ import { on as isRecord } from "./datastores-DNOJm1LF.js";
2
2
  import { useContext } from "react";
3
3
  import { FieldActionsContext } from "sanity/_singletons";
4
4
  import { isIndexSegment, isIndexTuple, isKeySegment, isKeyedObject } from "@sanity/types";
@@ -82,4 +82,4 @@ function useFieldActions() {
82
82
  }
83
83
  export { getValueAtPath as a, normalizeIndexTupleSegment as c, pathToString as d, pathsAreEqual as f, getItemKeySegment as i, normalizeKeySegment as l, findIndex as n, isEmptyObject as o, stringToPath as p, getItemKey as r, normalizeIndexSegment as s, useFieldActions as t, normalizePathSegment as u };
84
84
 
85
- //# sourceMappingURL=useFieldActions-BTj7VsW5.js.map
85
+ //# sourceMappingURL=useFieldActions-BmY1Kh3s.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useFieldActions-BTj7VsW5.js","names":[],"sources":["../src/core/field/paths/helpers.ts","../src/core/form/field/actions/useFieldActions.ts"],"sourcesContent":["import {\n type IndexTuple,\n isIndexSegment,\n isIndexTuple,\n isKeyedObject,\n isKeySegment,\n type KeyedSegment,\n type Path,\n type PathSegment,\n} from '@sanity/types'\n\nimport {isRecord} from '../../util/isRecord'\n\nconst rePropName =\n /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g\nconst reKeySegment = /_key\\s*==\\s*['\"](.*)['\"]/\n\n/** @internal */\nexport function pathToString(path: Path): string {\n if (!Array.isArray(path)) {\n throw new Error('Path is not an array')\n }\n\n return path.reduce<string>((target, segment, i) => {\n if (isIndexSegment(segment)) {\n return `${target}[${segment}]`\n }\n\n if (isKeySegment(segment) && segment._key) {\n return `${target}[_key==\"${segment._key}\"]`\n }\n\n if (isIndexTuple(segment)) {\n const [from, to] = segment\n return `${target}[${from}:${to}]`\n }\n\n if (typeof segment === 'string') {\n const separator = i === 0 ? '' : '.'\n return `${target}${separator}${segment}`\n }\n\n throw new Error(`Unsupported path segment \\`${JSON.stringify(segment)}\\``)\n }, '')\n}\n\n/** @internal */\nexport function getValueAtPath(rootValue: unknown, path: Path): unknown {\n const segment = path[0]\n if (typeof segment === 'undefined') {\n return rootValue\n }\n\n const tail = path.slice(1)\n if (isIndexSegment(segment)) {\n return getValueAtPath(Array.isArray(rootValue) ? rootValue[segment] : undefined, tail)\n }\n\n if (isKeySegment(segment)) {\n return getValueAtPath(\n Array.isArray(rootValue) ? rootValue.find((item) => item._key === segment._key) : undefined,\n tail,\n )\n }\n\n if (typeof segment === 'string') {\n return getValueAtPath(isRecord(rootValue) ? rootValue[segment] : undefined, tail)\n }\n\n throw new Error(`Unknown segment type ${JSON.stringify(segment)}`)\n}\n\n/** @internal */\nexport function findIndex(array: unknown[], segment: PathSegment): number {\n if (typeof segment !== 'number' && !isKeySegment(segment)) {\n return -1\n }\n\n return typeof segment === 'number'\n ? segment\n : array.findIndex((item) => isKeyedObject(item) && item._key === segment._key)\n}\n\n/** @internal */\nexport function stringToPath(path: string): Path {\n const segments = path.match(rePropName)\n if (!segments) {\n throw new Error('Invalid path string')\n }\n\n return segments.map(normalizePathSegment)\n}\n\n/** @internal */\nexport function normalizePathSegment(segment: string): PathSegment {\n if (isIndexSegment(segment)) {\n return normalizeIndexSegment(segment)\n }\n\n if (isKeySegment(segment)) {\n return normalizeKeySegment(segment)\n }\n\n if (isIndexTuple(segment)) {\n return normalizeIndexTupleSegment(segment)\n }\n\n return segment\n}\n\n/** @internal */\nexport function normalizeIndexSegment(segment: string): PathSegment {\n return Number(segment.replace(/[^\\d]/g, ''))\n}\n\n/** @internal */\nexport function normalizeKeySegment(segment: string): KeyedSegment {\n const segments = segment.match(reKeySegment)\n if (!segments) {\n throw new Error('Invalid key segment')\n }\n\n return {_key: segments[1]}\n}\n\n/** @internal */\nexport function normalizeIndexTupleSegment(segment: string): IndexTuple {\n const [from, to] = segment.split(':').map((seg) => (seg === '' ? seg : Number(seg)))\n return [from, to]\n}\n\n/** @internal */\nexport function pathsAreEqual(pathA: Path, pathB: Path): boolean {\n if (pathA.length !== pathB.length) {\n return false\n }\n\n return pathA.every((segmentA, index) => {\n const segmentB = pathB[index]\n if (isKeySegment(segmentA) && isKeySegment(segmentB)) {\n return segmentA._key === segmentB._key\n }\n\n if (isIndexSegment(segmentA)) {\n return Number(segmentA) === Number(segmentB)\n }\n\n if (isIndexTuple(segmentA) && isIndexTuple(segmentB)) {\n return segmentA[0] === segmentB[0] && segmentA[1] === segmentB[1]\n }\n\n return segmentA === segmentB\n })\n}\n\n/** @internal */\nexport function getItemKey(arrayItem: unknown): string | undefined {\n return isKeyedObject(arrayItem) ? arrayItem._key : undefined\n}\n\n/** @internal */\nexport function getItemKeySegment(arrayItem: unknown): KeyedSegment | undefined {\n const key = getItemKey(arrayItem)\n return key ? {_key: key} : undefined\n}\n\n/** @internal */\nexport function isEmptyObject(item: unknown): boolean {\n return typeof item === 'object' && item !== null && Object.keys(item).length <= 0\n}\n","import {useContext} from 'react'\nimport {FieldActionsContext, type FieldActionsContextValue} from 'sanity/_singletons'\n\n/** @internal */\nexport function useFieldActions(): FieldActionsContextValue {\n return useContext(FieldActionsContext)\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"useFieldActions-BmY1Kh3s.js","names":[],"sources":["../src/core/field/paths/helpers.ts","../src/core/form/field/actions/useFieldActions.ts"],"sourcesContent":["import {\n type IndexTuple,\n isIndexSegment,\n isIndexTuple,\n isKeyedObject,\n isKeySegment,\n type KeyedSegment,\n type Path,\n type PathSegment,\n} from '@sanity/types'\n\nimport {isRecord} from '../../util/isRecord'\n\nconst rePropName =\n /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g\nconst reKeySegment = /_key\\s*==\\s*['\"](.*)['\"]/\n\n/** @internal */\nexport function pathToString(path: Path): string {\n if (!Array.isArray(path)) {\n throw new Error('Path is not an array')\n }\n\n return path.reduce<string>((target, segment, i) => {\n if (isIndexSegment(segment)) {\n return `${target}[${segment}]`\n }\n\n if (isKeySegment(segment) && segment._key) {\n return `${target}[_key==\"${segment._key}\"]`\n }\n\n if (isIndexTuple(segment)) {\n const [from, to] = segment\n return `${target}[${from}:${to}]`\n }\n\n if (typeof segment === 'string') {\n const separator = i === 0 ? '' : '.'\n return `${target}${separator}${segment}`\n }\n\n throw new Error(`Unsupported path segment \\`${JSON.stringify(segment)}\\``)\n }, '')\n}\n\n/** @internal */\nexport function getValueAtPath(rootValue: unknown, path: Path): unknown {\n const segment = path[0]\n if (typeof segment === 'undefined') {\n return rootValue\n }\n\n const tail = path.slice(1)\n if (isIndexSegment(segment)) {\n return getValueAtPath(Array.isArray(rootValue) ? rootValue[segment] : undefined, tail)\n }\n\n if (isKeySegment(segment)) {\n return getValueAtPath(\n Array.isArray(rootValue) ? rootValue.find((item) => item._key === segment._key) : undefined,\n tail,\n )\n }\n\n if (typeof segment === 'string') {\n return getValueAtPath(isRecord(rootValue) ? rootValue[segment] : undefined, tail)\n }\n\n throw new Error(`Unknown segment type ${JSON.stringify(segment)}`)\n}\n\n/** @internal */\nexport function findIndex(array: unknown[], segment: PathSegment): number {\n if (typeof segment !== 'number' && !isKeySegment(segment)) {\n return -1\n }\n\n return typeof segment === 'number'\n ? segment\n : array.findIndex((item) => isKeyedObject(item) && item._key === segment._key)\n}\n\n/** @internal */\nexport function stringToPath(path: string): Path {\n const segments = path.match(rePropName)\n if (!segments) {\n throw new Error('Invalid path string')\n }\n\n return segments.map(normalizePathSegment)\n}\n\n/** @internal */\nexport function normalizePathSegment(segment: string): PathSegment {\n if (isIndexSegment(segment)) {\n return normalizeIndexSegment(segment)\n }\n\n if (isKeySegment(segment)) {\n return normalizeKeySegment(segment)\n }\n\n if (isIndexTuple(segment)) {\n return normalizeIndexTupleSegment(segment)\n }\n\n return segment\n}\n\n/** @internal */\nexport function normalizeIndexSegment(segment: string): PathSegment {\n return Number(segment.replace(/[^\\d]/g, ''))\n}\n\n/** @internal */\nexport function normalizeKeySegment(segment: string): KeyedSegment {\n const segments = segment.match(reKeySegment)\n if (!segments) {\n throw new Error('Invalid key segment')\n }\n\n return {_key: segments[1]}\n}\n\n/** @internal */\nexport function normalizeIndexTupleSegment(segment: string): IndexTuple {\n const [from, to] = segment.split(':').map((seg) => (seg === '' ? seg : Number(seg)))\n return [from, to]\n}\n\n/** @internal */\nexport function pathsAreEqual(pathA: Path, pathB: Path): boolean {\n if (pathA.length !== pathB.length) {\n return false\n }\n\n return pathA.every((segmentA, index) => {\n const segmentB = pathB[index]\n if (isKeySegment(segmentA) && isKeySegment(segmentB)) {\n return segmentA._key === segmentB._key\n }\n\n if (isIndexSegment(segmentA)) {\n return Number(segmentA) === Number(segmentB)\n }\n\n if (isIndexTuple(segmentA) && isIndexTuple(segmentB)) {\n return segmentA[0] === segmentB[0] && segmentA[1] === segmentB[1]\n }\n\n return segmentA === segmentB\n })\n}\n\n/** @internal */\nexport function getItemKey(arrayItem: unknown): string | undefined {\n return isKeyedObject(arrayItem) ? arrayItem._key : undefined\n}\n\n/** @internal */\nexport function getItemKeySegment(arrayItem: unknown): KeyedSegment | undefined {\n const key = getItemKey(arrayItem)\n return key ? {_key: key} : undefined\n}\n\n/** @internal */\nexport function isEmptyObject(item: unknown): boolean {\n return typeof item === 'object' && item !== null && Object.keys(item).length <= 0\n}\n","import {useContext} from 'react'\nimport {FieldActionsContext, type FieldActionsContextValue} from 'sanity/_singletons'\n\n/** @internal */\nexport function useFieldActions(): FieldActionsContextValue {\n return useContext(FieldActionsContext)\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { o as useSource } from "./studioClient-EJDu6kOb.js";
1
+ import { o as useSource } from "./studioClient-C7B6Aobi.js";
2
2
  /**
3
3
  * React hook that returns the current project id
4
4
  *
@@ -17,4 +17,4 @@ function useProjectId() {
17
17
  }
18
18
  export { useProjectId as t };
19
19
 
20
- //# sourceMappingURL=useProjectId-BN6GCdwS.js.map
20
+ //# sourceMappingURL=useProjectId-C8pZxybz.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useProjectId-BN6GCdwS.js","names":[],"sources":["../src/core/hooks/useProjectId.ts"],"sourcesContent":["import {useSource} from '../studio/source'\n\n/**\n * React hook that returns the current project id\n *\n * @public\n * @returns The current project id\n * @example Using the `useProjectId` hook\n * ```ts\n * function MyComponent() {\n * const projectId = useProjectId()\n * // ... do something with the project id ...\n * }\n * ```\n */\nexport function useProjectId(): string {\n // oxlint-disable-next-line no-deprecated -- will fix in follow up PR\n return useSource().projectId\n}\n"],"mappings":";;;;;;;;;;;;;;AAeA,SAAgB,eAAuB;CAErC,OAAO,UAAU,CAAC,CAAC;AACrB"}
1
+ {"version":3,"file":"useProjectId-C8pZxybz.js","names":[],"sources":["../src/core/hooks/useProjectId.ts"],"sourcesContent":["import {useSource} from '../studio/source'\n\n/**\n * React hook that returns the current project id\n *\n * @public\n * @returns The current project id\n * @example Using the `useProjectId` hook\n * ```ts\n * function MyComponent() {\n * const projectId = useProjectId()\n * // ... do something with the project id ...\n * }\n * ```\n */\nexport function useProjectId(): string {\n // oxlint-disable-next-line no-deprecated -- will fix in follow up PR\n return useSource().projectId\n}\n"],"mappings":";;;;;;;;;;;;;;AAeA,SAAgB,eAAuB;CAErC,OAAO,UAAU,CAAC,CAAC;AACrB"}
@@ -1,5 +1,5 @@
1
- import { c as useWorkspace } from "./studioClient-EJDu6kOb.js";
2
- import { n as SCHEDULES_TOOL_NAME } from "./plugin-Daxe5hwG.js";
1
+ import { c as useWorkspace } from "./studioClient-C7B6Aobi.js";
2
+ import { n as SCHEDULES_TOOL_NAME } from "./plugin-Cv6TLYbE.js";
3
3
  import { c } from "react/compiler-runtime";
4
4
  /**
5
5
  * Determine whether the releases tool is available in the current workspace.
@@ -20,4 +20,4 @@ function _temp(t0) {
20
20
  }
21
21
  export { useReleasesToolAvailable as t };
22
22
 
23
- //# sourceMappingURL=useReleasesToolAvailable-CQ9-I8Tt.js.map
23
+ //# sourceMappingURL=useReleasesToolAvailable-DjaSujLo.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useReleasesToolAvailable-CQ9-I8Tt.js","names":["workspace.tools.some(({name}) => name === SCHEDULES_TOOL_NAME)","tools","({name}) => name === SCHEDULES_TOOL_NAME","useMemo(() => workspace.tools.some(({name}) => name === SCHEDULES_TOOL_NAME), [workspace])","{name}"],"sources":["../src/core/schedules/hooks/useReleasesToolAvailable.ts"],"sourcesContent":["import {useMemo} from 'react'\n\nimport {useWorkspace} from '../../studio/workspace'\nimport {SCHEDULES_TOOL_NAME} from '../plugin'\n\n/**\n * Determine whether the releases tool is available in the current workspace.\n *\n * This check is performed on the available tools, rather than the enabled status of the releases\n * feature itself. This caters to scenarios in which releases are enabled for the workspace, but the\n * release tool was later removed (e.g. using a workspace tool filter).\n *\n * @internal\n */\nexport function useReleasesToolAvailable(): boolean {\n const workspace = useWorkspace()\n return useMemo(() => workspace.tools.some(({name}) => name === SCHEDULES_TOOL_NAME), [workspace])\n}\n"],"mappings":";;;;;;;;;;;;AAcA,SAAgB,2BAAoC;eAC5C,YAAY,aAAa,GACVA;CAArB,OAA+BC,EAAAA,OAAAA,UAAAA,qBAAV,KAAA,UAAU,MAAM,KAAKC,KAAwC,GAAnDD,EAAAA,KAAAA,UAAAA,mBAAxBE;AACT;AAD4C,SAAA,MAAA,IAAC;CAAC,IAAA,EAAA,SAADC;CAAW,OAAA,SAAS;AAAf"}
1
+ {"version":3,"file":"useReleasesToolAvailable-DjaSujLo.js","names":["workspace.tools.some(({name}) => name === SCHEDULES_TOOL_NAME)","tools","({name}) => name === SCHEDULES_TOOL_NAME","useMemo(() => workspace.tools.some(({name}) => name === SCHEDULES_TOOL_NAME), [workspace])","{name}"],"sources":["../src/core/schedules/hooks/useReleasesToolAvailable.ts"],"sourcesContent":["import {useMemo} from 'react'\n\nimport {useWorkspace} from '../../studio/workspace'\nimport {SCHEDULES_TOOL_NAME} from '../plugin'\n\n/**\n * Determine whether the releases tool is available in the current workspace.\n *\n * This check is performed on the available tools, rather than the enabled status of the releases\n * feature itself. This caters to scenarios in which releases are enabled for the workspace, but the\n * release tool was later removed (e.g. using a workspace tool filter).\n *\n * @internal\n */\nexport function useReleasesToolAvailable(): boolean {\n const workspace = useWorkspace()\n return useMemo(() => workspace.tools.some(({name}) => name === SCHEDULES_TOOL_NAME), [workspace])\n}\n"],"mappings":";;;;;;;;;;;;AAcA,SAAgB,2BAAoC;eAC5C,YAAY,aAAa,GACVA;CAArB,OAA+BC,EAAAA,OAAAA,UAAAA,qBAAV,KAAA,UAAU,MAAM,KAAKC,KAAwC,GAAnDD,EAAAA,KAAAA,UAAAA,mBAAxBE;AACT;AAD4C,SAAA,MAAA,IAAC;CAAC,IAAA,EAAA,SAADC;CAAW,OAAA,SAAS;AAAf"}
@@ -1,14 +1,14 @@
1
- import { Ot as RELEASES_STUDIO_CLIENT_OPTIONS, U as getReleaseIdFromReleaseDocumentId, X as isGoingToUnpublish, Zt as useSchema, r as useDocumentPreviewStore } from "./datastores-D1tF4HQA.js";
1
+ import { Ot as RELEASES_STUDIO_CLIENT_OPTIONS, U as getReleaseIdFromReleaseDocumentId, X as isGoingToUnpublish, Zt as useSchema, r as useDocumentPreviewStore } from "./datastores-DNOJm1LF.js";
2
2
  import { t as useTranslation } from "./useTranslation-Cqs6Itwv.js";
3
3
  import { t as Translate } from "./Translate-YUHPpk6j.js";
4
- import { i as useClient, n as DEFAULT_STUDIO_CLIENT_OPTIONS, o as useSource } from "./studioClient-EJDu6kOb.js";
5
- import { Mt as getReleaseDocumentIdFromReleaseId, Nt as useReleasesStore, _t as createReleaseId, et as useDocumentVersions, ht as isReleaseScheduledOrScheduling, i as unstable_useValuePreview, n as Preview, rt as useAllReleases, xt as isPausedCardinalityOneRelease } from "./useActiveReleases-Bh_Q6f7G.js";
4
+ import { i as useClient, n as DEFAULT_STUDIO_CLIENT_OPTIONS, o as useSource } from "./studioClient-C7B6Aobi.js";
5
+ import { Mt as getReleaseDocumentIdFromReleaseId, Nt as useReleasesStore, _t as createReleaseId, et as useDocumentVersions, ht as isReleaseScheduledOrScheduling, i as unstable_useValuePreview, n as Preview, rt as useAllReleases, xt as isPausedCardinalityOneRelease } from "./useActiveReleases-DxYjyTB1.js";
6
6
  import { d as getVersionId, l as getPublishedId, s as getDraftId } from "./draftUtils-D3HJGQaW.js";
7
- import { t as LoadingBlock } from "./LoadingBlock-Ch_dBXfn.js";
7
+ import { t as LoadingBlock } from "./LoadingBlock-CElIdb7F.js";
8
8
  import { n as Dialog$1 } from "./MenuGroup-DwiYr9LF.js";
9
- import { a as MONTH_PICKER_VARIANT, f as isDraftVersion, h as isVariantVersion, p as isPublishedVersion, r as DateTimeInput, t as getCalendarLabels } from "./utils-D-4rueJZ.js";
10
- import { t as useTimeZone } from "./useTimeZone-DM8ZmUO2.js";
11
- import { r as useReleaseOperations, t as getBundleDocumentsObservable } from "./useBundleDocuments-zP6JiTzz.js";
9
+ import { a as MONTH_PICKER_VARIANT, f as isDraftVersion, h as isVariantVersion, p as isPublishedVersion, r as DateTimeInput, t as getCalendarLabels } from "./utils-CT034e4q.js";
10
+ import { t as useTimeZone } from "./useTimeZone-Dj7C8tfZ.js";
11
+ import { r as useReleaseOperations, t as getBundleDocumentsObservable } from "./useBundleDocuments-2YaaN-2l.js";
12
12
  import { useState } from "react";
13
13
  import { EMPTY, of } from "rxjs";
14
14
  import { c } from "react/compiler-runtime";
@@ -38,7 +38,7 @@ import { startOfMinute } from "date-fns/startOfMinute";
38
38
  const singleDocReleaseNamespace = "singleDocRelease", singleDocReleaseUsEnglishLocaleBundle = {
39
39
  locale: "en-US",
40
40
  namespace: singleDocReleaseNamespace,
41
- resources: () => import("./resources-B7mfG9Km.js")
41
+ resources: () => import("./resources-D7XsFe7y.js")
42
42
  };
43
43
  /**
44
44
  * Safely extracts an error message from an unknown value that was thrown.
@@ -885,4 +885,4 @@ function useScheduledDraftMenuActions(options) {
885
885
  }
886
886
  export { Z_OFFSET as a, useReleaseDocuments as c, singleDocReleaseNamespace as d, singleDocReleaseUsEnglishLocaleBundle as f, SCHEDULED_PUBLISHING_TIME_ZONE_SCOPE as i, getDocumentVersionInfoFromVersions as l, ScheduleDraftDialog as n, useScheduleDraftOperations as o, CONTENT_RELEASES_TIME_ZONE_SCOPE as r, useScheduledDraftDocument as s, useScheduledDraftMenuActions as t, getErrorMessage as u };
887
887
 
888
- //# sourceMappingURL=useScheduledDraftMenuActions-OSkdxONo.js.map
888
+ //# sourceMappingURL=useScheduledDraftMenuActions-DSJU6xQa.js.map