sanity 6.4.0-next.33 → 6.4.0-next.35

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 (50) hide show
  1. package/lib/_chunks-es/CommentsInspector.js +1 -0
  2. package/lib/_chunks-es/CommentsInspector.js.map +1 -1
  3. package/lib/_chunks-es/ReleasesStudioLayout.js +1 -0
  4. package/lib/_chunks-es/ReleasesStudioLayout.js.map +1 -1
  5. package/lib/_chunks-es/ReleasesTool.js +1 -0
  6. package/lib/_chunks-es/ReleasesTool.js.map +1 -1
  7. package/lib/_chunks-es/Table.js +2 -0
  8. package/lib/_chunks-es/Table.js.map +1 -1
  9. package/lib/_chunks-es/TasksDocumentInputLayout.js +1 -0
  10. package/lib/_chunks-es/TasksDocumentInputLayout.js.map +1 -1
  11. package/lib/_chunks-es/TasksFooterOpenTasks.js +1 -0
  12. package/lib/_chunks-es/TasksFooterOpenTasks.js.map +1 -1
  13. package/lib/_chunks-es/TasksStudioActiveToolLayout.js +1 -0
  14. package/lib/_chunks-es/TasksStudioActiveToolLayout.js.map +1 -1
  15. package/lib/_chunks-es/TasksStudioLayout.js +1 -0
  16. package/lib/_chunks-es/TasksStudioLayout.js.map +1 -1
  17. package/lib/_chunks-es/TasksStudioNavbar.js +1 -0
  18. package/lib/_chunks-es/TasksStudioNavbar.js.map +1 -1
  19. package/lib/_chunks-es/VariantsStudioNavbar.js +1 -0
  20. package/lib/_chunks-es/VariantsStudioNavbar.js.map +1 -1
  21. package/lib/_chunks-es/VariantsTool.js +1 -0
  22. package/lib/_chunks-es/VariantsTool.js.map +1 -1
  23. package/lib/_chunks-es/index2.js +650 -673
  24. package/lib/_chunks-es/index2.js.map +1 -1
  25. package/lib/_chunks-es/index3.js +1 -0
  26. package/lib/_chunks-es/index3.js.map +1 -1
  27. package/lib/_chunks-es/index6.js +1 -0
  28. package/lib/_chunks-es/index6.js.map +1 -1
  29. package/lib/_chunks-es/index7.js +1 -0
  30. package/lib/_chunks-es/index7.js.map +1 -1
  31. package/lib/_chunks-es/index8.js +1 -0
  32. package/lib/_chunks-es/index8.js.map +1 -1
  33. package/lib/_chunks-es/resources2.js +1 -0
  34. package/lib/_chunks-es/resources2.js.map +1 -1
  35. package/lib/_chunks-es/resources3.js +1 -0
  36. package/lib/_chunks-es/resources3.js.map +1 -1
  37. package/lib/_chunks-es/resources4.js +1 -0
  38. package/lib/_chunks-es/resources4.js.map +1 -1
  39. package/lib/_chunks-es/resources5.js +1 -0
  40. package/lib/_chunks-es/resources5.js.map +1 -1
  41. package/lib/_chunks-es/resources6.js +1 -0
  42. package/lib/_chunks-es/resources6.js.map +1 -1
  43. package/lib/_chunks-es/resources7.js +1 -0
  44. package/lib/_chunks-es/resources7.js.map +1 -1
  45. package/lib/_chunks-es/structureTool.js +15 -4
  46. package/lib/_chunks-es/structureTool.js.map +1 -1
  47. package/lib/_chunks-es/version.js +2 -2
  48. package/lib/bundle.css +1 -1
  49. package/lib/bundle.css.map +1 -1
  50. package/package.json +11 -10
@@ -192,6 +192,7 @@ import "date-fns/addWeeks";
192
192
  import "date-fns/isAfter";
193
193
  import "date-fns/isBefore";
194
194
  import "lodash-es/debounce.js";
195
+ import "clsx";
195
196
  import "@sanity/icons/LinkRemoved";
196
197
  import "lodash-es/findIndex.js";
197
198
  import "@sanity/diff-match-patch";
@@ -1 +1 @@
1
- {"version":3,"file":"CommentsInspector.js","sources":["../../src/core/comments/components/upsell/CommentsUpsellPanel.tsx","../../src/core/comments/hooks/useCommentsOnboarding.ts","../../src/core/comments/plugin/inspector/CommentsInspectorError.tsx","../../src/core/comments/plugin/inspector/CommentsInspectorHeader.tsx","../../src/core/comments/plugin/inspector/CommentsInspector.tsx"],"sourcesContent":["import {Box, Container} from '@sanity/ui'\n\nimport {type UpsellData} from '../../../studio/upsell/types'\nimport {UpsellPanel} from '../../../studio/upsell/UpsellPanel'\n\ninterface CommentsUpsellPanelProps {\n data: UpsellData\n onPrimaryClick: () => void\n onSecondaryClick: () => void\n}\n\nexport function CommentsUpsellPanel(props: CommentsUpsellPanelProps) {\n const {data, onPrimaryClick, onSecondaryClick} = props\n return (\n <Container width={1}>\n <Box marginBottom={6}>\n <UpsellPanel\n data={data}\n onPrimaryClick={onPrimaryClick}\n onSecondaryClick={onSecondaryClick}\n />\n </Box>\n </Container>\n )\n}\n","import {useContext} from 'react'\nimport {CommentsOnboardingContext} from 'sanity/_singletons'\n\nimport {type CommentsOnboardingContextValue} from '../context/onboarding/types'\n\nexport function useCommentsOnboarding(): CommentsOnboardingContextValue {\n const ctx = useContext(CommentsOnboardingContext)\n\n if (!ctx) {\n throw new Error('useCommentsOnboarding: missing context value')\n }\n\n return ctx\n}\n","import {Box, Card, Stack, Text} from '@sanity/ui'\n\nimport {useTranslation} from '../../../i18n'\nimport {commentsLocaleNamespace} from '../../i18n'\n\nexport function CommentsInspectorError({error}: {error: Error}) {\n const {t} = useTranslation(commentsLocaleNamespace)\n\n return (\n <Box padding={2}>\n <Card paddingX={2} paddingY={3} tone=\"critical\" border radius={3}>\n <Stack space={3}>\n <Text size={1} weight=\"medium\">\n {t('inspector-error.title')}\n </Text>\n <Text size={1} muted>\n {error.message}\n </Text>\n </Stack>\n </Card>\n </Box>\n )\n}\n","import {CheckmarkIcon} from '@sanity/icons/Checkmark'\nimport {ChevronDownIcon} from '@sanity/icons/ChevronDown'\nimport {CloseIcon} from '@sanity/icons/Close'\nimport {Card, Flex, Menu, Text} from '@sanity/ui'\nimport {forwardRef, useCallback} from 'react'\nimport {styled} from 'styled-components'\n\nimport {Button, MenuButton, MenuItem} from '../../../../ui-components'\nimport {useTranslation} from '../../../i18n'\nimport {commentsLocaleNamespace} from '../../i18n'\nimport {type CommentStatus, type CommentsUIMode} from '../../types'\n\nconst Root = styled(Card)({\n position: 'relative',\n zIndex: '1',\n lineHeight: '0',\n})\n\ninterface CommentsInspectorHeaderProps {\n onClose: () => void\n onViewChange: (view: CommentStatus) => void\n view: CommentStatus\n mode: CommentsUIMode\n}\n\nexport const CommentsInspectorHeader = forwardRef(function CommentsInspectorHeader(\n props: CommentsInspectorHeaderProps,\n ref: React.ForwardedRef<HTMLDivElement>,\n) {\n const {t} = useTranslation(commentsLocaleNamespace)\n const {onClose, onViewChange, view, mode} = props\n\n const handleSetOpenView = useCallback(() => onViewChange('open'), [onViewChange])\n const handleSetResolvedView = useCallback(() => onViewChange('resolved'), [onViewChange])\n\n return (\n <Root ref={ref}>\n <Flex padding={2}>\n <Flex align=\"center\" flex={1} gap={2} paddingY={2} padding={3}>\n <Text as=\"h1\" size={1} weight=\"medium\">\n {t('feature-name')}\n </Text>\n </Flex>\n\n <Flex flex=\"none\" padding={1} gap={2}>\n <MenuButton\n id=\"comment-status-menu-button\"\n button={\n <Button\n text={\n view === 'open'\n ? t('status-filter.status-open')\n : t('status-filter.status-resolved')\n }\n mode=\"bleed\"\n iconRight={ChevronDownIcon}\n />\n }\n menu={\n <Menu style={{width: '180px'}}>\n <MenuItem\n iconRight={view === 'open' ? CheckmarkIcon : undefined}\n onClick={handleSetOpenView}\n text={t('status-filter.status-open-full')}\n />\n <MenuItem\n iconRight={view === 'resolved' ? CheckmarkIcon : undefined}\n onClick={handleSetResolvedView}\n text={t('status-filter.status-resolved-full')}\n tooltipProps={\n mode === 'upsell'\n ? {content: t('status-filter.status-resolved-full-upsell')}\n : undefined\n }\n disabled={mode === 'upsell'}\n />\n </Menu>\n }\n popover={{placement: 'bottom-end'}}\n />\n\n <Button\n aria-label={t('close-pane-button-text-aria-label')}\n icon={CloseIcon}\n mode=\"bleed\"\n onClick={onClose}\n tooltipProps={{content: t('close-pane-button-text')}}\n />\n </Flex>\n </Flex>\n </Root>\n )\n})\n","import {Flex, Layer, useClickOutsideEvent, useLayer, useToast} from '@sanity/ui'\nimport * as PathUtils from '@sanity/util/paths'\nimport {Fragment, useCallback, useEffect, useMemo, useRef, useState} from 'react'\nimport {styled} from 'styled-components'\n\nimport {type DocumentInspectorProps} from '../../../config'\nimport {useTranslation} from '../../../i18n'\nimport {useCurrentUser} from '../../../store'\nimport {useAddonDataset} from '../../../studio/addonDataset'\nimport {\n CommentDeleteDialog,\n CommentsList,\n CommentsOnboardingPopover,\n CommentsUpsellPanel,\n} from '../../components'\nimport {type CommentsSelectedPath} from '../../context'\nimport {isTextSelectionComment} from '../../helpers'\nimport {\n useComments,\n useCommentsEnabled,\n useCommentsOnboarding,\n useCommentsScroll,\n useCommentsSelectedPath,\n useCommentsTelemetry,\n useCommentsUpsell,\n} from '../../hooks'\nimport {commentsLocaleNamespace} from '../../i18n'\nimport {\n type CommentBaseCreatePayload,\n type CommentReactionOption,\n type CommentStatus,\n type CommentsUIMode,\n type CommentUpdatePayload,\n} from '../../types'\nimport {CommentsInspectorError} from './CommentsInspectorError'\nimport {CommentsInspectorHeader} from './CommentsInspectorHeader'\n\ninterface CommentToDelete {\n commentId: string\n isParent: boolean\n}\n\nconst RootLayer = styled(Layer)`\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n`\n\nexport function CommentsInspector(props: DocumentInspectorProps) {\n const {enabled, mode} = useCommentsEnabled()\n\n if (!enabled) return null\n\n // We wrap the comments inspector in a Layer in order to know when the comments inspector\n // is the top layer (that is, if there is e.g. a popover open). This is used to determine\n // if we should deselect the selected path when clicking outside the comments inspector.\n return (\n <RootLayer>\n <CommentsInspectorInner {...props} mode={mode} />\n </RootLayer>\n )\n}\n\nfunction CommentsInspectorInner(\n props: DocumentInspectorProps & {\n mode: CommentsUIMode\n },\n) {\n const {t} = useTranslation(commentsLocaleNamespace)\n const {onClose, mode} = props\n const [showDeleteDialog, setShowDeleteDialog] = useState<boolean>(false)\n const [commentToDelete, setCommentToDelete] = useState<CommentToDelete | null>(null)\n const [deleteLoading, setDeleteLoading] = useState<boolean>(false)\n const [deleteError, setDeleteError] = useState<Error | null>(null)\n\n const rootRef = useRef<HTMLDivElement | null>(null)\n const [rootElement, setRootElement] = useState<HTMLDivElement | null>(null)\n\n const currentUser = useCurrentUser()\n const {\n comments,\n getComment,\n isCreatingDataset,\n mentionOptions,\n setStatus,\n status,\n operation,\n selectedCommentId,\n getCommentLink,\n onClearSelectedComment,\n onPathOpen,\n } = useComments()\n const commentIdParamRef = useRef<string | undefined>(selectedCommentId)\n const {error: addonDatasetError} = useAddonDataset()\n const didScrollToCommentFromParam = useRef<boolean>(false)\n\n const pushToast = useToast().push\n const {isTopLayer} = useLayer()\n\n const {scrollToComment, scrollToField, scrollToInlineComment} = useCommentsScroll({\n boundaryElement: rootElement,\n })\n const {selectedPath, setSelectedPath} = useCommentsSelectedPath()\n const {isDismissed, setDismissed} = useCommentsOnboarding()\n const telemetry = useCommentsTelemetry()\n\n const {upsellData, telemetryLogs: upsellTelemetryLogs} = useCommentsUpsell()\n\n const currentComments = useMemo(() => comments.data[status], [comments, status])\n\n const {loading} = comments\n\n const handleChangeView = useCallback(\n (nextView: CommentStatus) => {\n setStatus(nextView)\n setSelectedPath(null)\n\n telemetry.commentListViewChanged(nextView)\n },\n [setSelectedPath, setStatus, telemetry],\n )\n\n const handleCloseInspector = useCallback(() => {\n onClose()\n setSelectedPath(null)\n }, [onClose, setSelectedPath])\n\n const handleCopyLink = useMemo(() => {\n if (!getCommentLink) return undefined\n\n const copyLink = (id: string) => {\n navigator.clipboard.writeText(getCommentLink(id)).catch(() => {\n pushToast({\n closable: true,\n status: 'error',\n title: t('copy-link-error-message'),\n })\n })\n\n telemetry.commentLinkCopied()\n }\n\n return copyLink\n }, [getCommentLink, pushToast, t, telemetry])\n\n const handleCreateRetry = useCallback(\n (id: string) => {\n const comment = getComment(id)\n if (!comment) return\n\n void operation.create({\n type: 'field',\n fieldPath: comment.target.path?.field || '',\n id: comment._id,\n message: comment.message,\n parentCommentId: comment.parentCommentId,\n reactions: comment.reactions || [],\n status: comment.status,\n threadId: comment.threadId,\n })\n },\n [getComment, operation],\n )\n\n const closeDeleteDialog = useCallback(() => {\n if (deleteLoading) return\n setShowDeleteDialog(false)\n setCommentToDelete(null)\n }, [deleteLoading])\n\n const handlePathSelect = useCallback(\n (nextPath: CommentsSelectedPath) => {\n setSelectedPath(nextPath)\n\n if (nextPath?.fieldPath) {\n const path = PathUtils.fromString(nextPath.fieldPath)\n onPathOpen?.(path)\n\n scrollToField(nextPath.fieldPath)\n\n const isInlineComment = comments.data.open\n .filter((c) => c.threadId === nextPath?.threadId)\n .some((x) => isTextSelectionComment(x.parentComment))\n\n if (isInlineComment && nextPath.threadId) {\n scrollToInlineComment(nextPath.threadId)\n }\n }\n },\n [comments.data.open, onPathOpen, scrollToField, scrollToInlineComment, setSelectedPath],\n )\n\n const handleNewThreadCreate = useCallback(\n (nextComment: CommentBaseCreatePayload) => {\n const fieldPath = nextComment?.payload?.fieldPath || ''\n\n void operation.create({\n type: 'field',\n fieldPath,\n message: nextComment.message,\n parentCommentId: nextComment.parentCommentId,\n reactions: nextComment.reactions,\n status: nextComment.status,\n threadId: nextComment.threadId,\n })\n\n setSelectedPath({\n fieldPath,\n origin: 'inspector',\n threadId: nextComment.threadId,\n })\n },\n [operation, setSelectedPath],\n )\n\n const handleReply = useCallback(\n (nextComment: CommentBaseCreatePayload) => {\n void operation.create({\n ...nextComment,\n type: 'field',\n fieldPath: nextComment?.payload?.fieldPath || '',\n })\n },\n [operation],\n )\n\n const handleEdit = useCallback(\n (id: string, nextComment: CommentUpdatePayload) => {\n void operation.update(id, nextComment)\n },\n [operation],\n )\n\n const onDeleteStart = useCallback(\n (id: string) => {\n const parent = currentComments.find((c) => c.parentComment?._id === id)\n const isParent = Boolean(parent && parent?.replies?.length > 0)\n\n setShowDeleteDialog(true)\n setCommentToDelete({\n commentId: id,\n isParent,\n })\n },\n\n [currentComments],\n )\n\n const handleDeleteConfirm = useCallback(\n async (id: string) => {\n try {\n setDeleteLoading(true)\n await operation.remove(id)\n closeDeleteDialog()\n } catch (err) {\n setDeleteError(err)\n }\n setDeleteLoading(false)\n },\n [closeDeleteDialog, operation],\n )\n\n const handleStatusChange = useCallback(\n (id: string, nextStatus: CommentStatus) => {\n void operation.update(id, {\n status: nextStatus,\n })\n\n // If the comment is being opened, we want to change to the \"open\" view\n // and scroll to the comment\n if (nextStatus === 'open') {\n setStatus('open')\n\n const comment = getComment(id)\n\n if (!comment) return\n\n setSelectedPath({\n fieldPath: comment.target.path?.field || null,\n origin: 'inspector',\n threadId: comment.threadId || null,\n })\n\n scrollToComment(id)\n }\n },\n [getComment, operation, scrollToComment, setSelectedPath, setStatus],\n )\n\n const handleReactionSelect = useCallback(\n (id: string, reaction: CommentReactionOption) => {\n void operation.react(id, reaction)\n },\n [operation],\n )\n\n const handleDeselectPath = useCallback(() => {\n // Clear the selected path when:\n // - Clicking outside the inspector when it's the top layer\n // - The target is not a slate editor string. This is needed because we do not want to\n // frequently deselect the selected path when clicking inside the editor.\n if (selectedPath && isTopLayer) {\n setSelectedPath(null)\n }\n }, [isTopLayer, selectedPath, setSelectedPath])\n\n const setRootRef = useCallback((element: HTMLDivElement | null) => {\n rootRef.current = element\n setRootElement(element)\n }, [])\n\n useClickOutsideEvent(\n (event) => {\n // Clear the selected path when clicking outside the comments inspector.\n // We do this only when the comments inspector is the top layer.\n const isPTETarget =\n event.target instanceof HTMLElement && event.target?.hasAttribute('data-pt-text')\n\n if (!isPTETarget) {\n handleDeselectPath()\n }\n },\n () => [rootRef.current],\n )\n\n const [loggedTelemetry, setLoggedTelemetry] = useState(false)\n useEffect(() => {\n if (loggedTelemetry || mode !== 'upsell') return undefined\n // oxlint-disable-next-line react/react-compiler\n setLoggedTelemetry(true)\n if (selectedPath?.origin === 'form') {\n upsellTelemetryLogs.panelViewed('field_action')\n } else if (commentIdParamRef.current) {\n upsellTelemetryLogs.panelViewed('link')\n } else {\n upsellTelemetryLogs.panelViewed('document_action')\n }\n return () => {\n upsellTelemetryLogs.panelDismissed()\n }\n }, [loggedTelemetry, mode, selectedPath?.origin, upsellTelemetryLogs])\n\n // Handle scroll to comment from URL param\n useEffect(() => {\n // Make sure that the comment exists before we try to scroll to it.\n // We can't solely rely on the comment id from the url since the comment might not be loaded yet.\n const commentToScrollTo = getComment(commentIdParamRef.current || '')\n\n if (!loading && commentToScrollTo && !didScrollToCommentFromParam.current) {\n // Make sure we have the correct status set before we scroll to the comment\n setStatus(commentToScrollTo.status || 'open')\n\n handlePathSelect({\n fieldPath: commentToScrollTo.target.path?.field || null,\n origin: 'url',\n threadId: commentToScrollTo.threadId || null,\n })\n\n // Defer the comment scroll to prevent React batching from overwriting the field scroll\n requestAnimationFrame(() => {\n scrollToComment(commentToScrollTo._id)\n })\n\n didScrollToCommentFromParam.current = true\n commentIdParamRef.current = undefined\n\n onClearSelectedComment?.()\n\n telemetry.commentViewedFromLink()\n }\n }, [\n getComment,\n handlePathSelect,\n loading,\n onClearSelectedComment,\n scrollToComment,\n setStatus,\n telemetry,\n ])\n\n const beforeListNode = useMemo(() => {\n if (mode === 'upsell' && upsellData) {\n return (\n <CommentsUpsellPanel\n data={upsellData}\n onPrimaryClick={upsellTelemetryLogs.panelPrimaryClicked}\n onSecondaryClick={upsellTelemetryLogs.panelSecondaryClicked}\n />\n )\n }\n\n return null\n }, [\n mode,\n upsellTelemetryLogs.panelPrimaryClicked,\n upsellTelemetryLogs.panelSecondaryClicked,\n upsellData,\n ])\n\n return (\n <Fragment>\n {commentToDelete && showDeleteDialog && (\n <CommentDeleteDialog\n {...commentToDelete}\n error={deleteError}\n loading={deleteLoading}\n onClose={closeDeleteDialog}\n onConfirm={handleDeleteConfirm}\n />\n )}\n\n <Flex\n direction=\"column\"\n flex={1}\n height=\"fill\"\n onClick={handleDeselectPath}\n overflow=\"hidden\"\n ref={setRootRef}\n >\n <CommentsOnboardingPopover\n onDismiss={setDismissed}\n open={!isDismissed}\n placement=\"left-start\"\n >\n <CommentsInspectorHeader\n onClose={handleCloseInspector}\n onViewChange={handleChangeView}\n view={status}\n mode={mode}\n />\n </CommentsOnboardingPopover>\n {addonDatasetError && <CommentsInspectorError error={addonDatasetError} />}\n {currentUser && (\n <CommentsList\n beforeListNode={beforeListNode}\n comments={currentComments}\n currentUser={currentUser}\n error={comments.error}\n loading={loading}\n mentionOptions={mentionOptions}\n mode={mode}\n onCopyLink={handleCopyLink}\n onCreateRetry={handleCreateRetry}\n onDelete={onDeleteStart}\n onEdit={handleEdit}\n onNewThreadCreate={handleNewThreadCreate}\n onPathSelect={handlePathSelect}\n onReactionSelect={handleReactionSelect}\n onReply={handleReply}\n onStatusChange={handleStatusChange}\n readOnly={isCreatingDataset}\n selectedPath={selectedPath}\n status={status}\n />\n )}\n </Flex>\n </Fragment>\n )\n}\n"],"names":["CommentsUpsellPanel","props","$","_c","data","onPrimaryClick","onSecondaryClick","t0","useCommentsOnboarding","ctx","useContext","CommentsOnboardingContext","Error","CommentsInspectorError","error","t","useTranslation","commentsLocaleNamespace","t1","t2","t3","message","t4","Root","styled","Card","withConfig","displayName","componentId","position","zIndex","lineHeight","CommentsInspectorHeader","forwardRef","ref","onClose","onViewChange","view","mode","handleSetOpenView","handleSetResolvedView","t5","ChevronDownIcon","t6","for","width","t7","CheckmarkIcon","undefined","t8","t9","t10","t11","t12","content","t13","t14","t15","t16","placement","t17","t18","t19","t20","t21","CloseIcon","t22","t23","t24","RootLayer","Layer","CommentsInspector","enabled","useCommentsEnabled","CommentsInspectorInner","showDeleteDialog","setShowDeleteDialog","useState","commentToDelete","setCommentToDelete","deleteLoading","setDeleteLoading","deleteError","setDeleteError","rootRef","useRef","rootElement","setRootElement","currentUser","useCurrentUser","comments","getComment","isCreatingDataset","mentionOptions","setStatus","status","operation","selectedCommentId","getCommentLink","onClearSelectedComment","onPathOpen","useComments","commentIdParamRef","addonDatasetError","useAddonDataset","didScrollToCommentFromParam","pushToast","useToast","push","isTopLayer","useLayer","boundaryElement","scrollToComment","scrollToField","scrollToInlineComment","useCommentsScroll","selectedPath","setSelectedPath","useCommentsSelectedPath","isDismissed","setDismissed","telemetry","useCommentsTelemetry","upsellData","telemetryLogs","upsellTelemetryLogs","useCommentsUpsell","currentComments","loading","nextView","commentListViewChanged","handleChangeView","handleCloseInspector","bb0","id","navigator","clipboard","writeText","catch","closable","title","commentLinkCopied","handleCopyLink","id_0","comment","create","type","fieldPath","target","path","field","_id","parentCommentId","reactions","threadId","handleCreateRetry","closeDeleteDialog","open","nextPath","PathUtils","fromString","filter","c","some","_temp","handlePathSelect","nextComment","payload","origin","handleNewThreadCreate","nextComment_0","handleReply","id_1","nextComment_1","update","handleEdit","id_2","parent","find","c_0","parentComment","isParent","Boolean","replies","length","commentId","onDeleteStart","id_3","remove","err","handleDeleteConfirm","id_4","nextStatus","comment_0","handleStatusChange","id_5","reaction","react","handleReactionSelect","handleDeselectPath","Symbol","element","current","setRootRef","event","HTMLElement","hasAttribute","useClickOutsideEvent","loggedTelemetry","setLoggedTelemetry","panelViewed","panelDismissed","useEffect","commentToScrollTo","requestAnimationFrame","commentViewedFromLink","bb1","panelPrimaryClicked","panelSecondaryClicked","beforeListNode","t25","t26","t27","t28","t29","t30","t31","x","isTextSelectionComment"],"mappings":"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"}
1
+ {"version":3,"file":"CommentsInspector.js","sources":["../../src/core/comments/components/upsell/CommentsUpsellPanel.tsx","../../src/core/comments/hooks/useCommentsOnboarding.ts","../../src/core/comments/plugin/inspector/CommentsInspectorError.tsx","../../src/core/comments/plugin/inspector/CommentsInspectorHeader.tsx","../../src/core/comments/plugin/inspector/CommentsInspector.tsx"],"sourcesContent":["import {Box, Container} from '@sanity/ui'\n\nimport {type UpsellData} from '../../../studio/upsell/types'\nimport {UpsellPanel} from '../../../studio/upsell/UpsellPanel'\n\ninterface CommentsUpsellPanelProps {\n data: UpsellData\n onPrimaryClick: () => void\n onSecondaryClick: () => void\n}\n\nexport function CommentsUpsellPanel(props: CommentsUpsellPanelProps) {\n const {data, onPrimaryClick, onSecondaryClick} = props\n return (\n <Container width={1}>\n <Box marginBottom={6}>\n <UpsellPanel\n data={data}\n onPrimaryClick={onPrimaryClick}\n onSecondaryClick={onSecondaryClick}\n />\n </Box>\n </Container>\n )\n}\n","import {useContext} from 'react'\nimport {CommentsOnboardingContext} from 'sanity/_singletons'\n\nimport {type CommentsOnboardingContextValue} from '../context/onboarding/types'\n\nexport function useCommentsOnboarding(): CommentsOnboardingContextValue {\n const ctx = useContext(CommentsOnboardingContext)\n\n if (!ctx) {\n throw new Error('useCommentsOnboarding: missing context value')\n }\n\n return ctx\n}\n","import {Box, Card, Stack, Text} from '@sanity/ui'\n\nimport {useTranslation} from '../../../i18n'\nimport {commentsLocaleNamespace} from '../../i18n'\n\nexport function CommentsInspectorError({error}: {error: Error}) {\n const {t} = useTranslation(commentsLocaleNamespace)\n\n return (\n <Box padding={2}>\n <Card paddingX={2} paddingY={3} tone=\"critical\" border radius={3}>\n <Stack space={3}>\n <Text size={1} weight=\"medium\">\n {t('inspector-error.title')}\n </Text>\n <Text size={1} muted>\n {error.message}\n </Text>\n </Stack>\n </Card>\n </Box>\n )\n}\n","import {CheckmarkIcon} from '@sanity/icons/Checkmark'\nimport {ChevronDownIcon} from '@sanity/icons/ChevronDown'\nimport {CloseIcon} from '@sanity/icons/Close'\nimport {Card, Flex, Menu, Text} from '@sanity/ui'\nimport {forwardRef, useCallback} from 'react'\nimport {styled} from 'styled-components'\n\nimport {Button, MenuButton, MenuItem} from '../../../../ui-components'\nimport {useTranslation} from '../../../i18n'\nimport {commentsLocaleNamespace} from '../../i18n'\nimport {type CommentStatus, type CommentsUIMode} from '../../types'\n\nconst Root = styled(Card)({\n position: 'relative',\n zIndex: '1',\n lineHeight: '0',\n})\n\ninterface CommentsInspectorHeaderProps {\n onClose: () => void\n onViewChange: (view: CommentStatus) => void\n view: CommentStatus\n mode: CommentsUIMode\n}\n\nexport const CommentsInspectorHeader = forwardRef(function CommentsInspectorHeader(\n props: CommentsInspectorHeaderProps,\n ref: React.ForwardedRef<HTMLDivElement>,\n) {\n const {t} = useTranslation(commentsLocaleNamespace)\n const {onClose, onViewChange, view, mode} = props\n\n const handleSetOpenView = useCallback(() => onViewChange('open'), [onViewChange])\n const handleSetResolvedView = useCallback(() => onViewChange('resolved'), [onViewChange])\n\n return (\n <Root ref={ref}>\n <Flex padding={2}>\n <Flex align=\"center\" flex={1} gap={2} paddingY={2} padding={3}>\n <Text as=\"h1\" size={1} weight=\"medium\">\n {t('feature-name')}\n </Text>\n </Flex>\n\n <Flex flex=\"none\" padding={1} gap={2}>\n <MenuButton\n id=\"comment-status-menu-button\"\n button={\n <Button\n text={\n view === 'open'\n ? t('status-filter.status-open')\n : t('status-filter.status-resolved')\n }\n mode=\"bleed\"\n iconRight={ChevronDownIcon}\n />\n }\n menu={\n <Menu style={{width: '180px'}}>\n <MenuItem\n iconRight={view === 'open' ? CheckmarkIcon : undefined}\n onClick={handleSetOpenView}\n text={t('status-filter.status-open-full')}\n />\n <MenuItem\n iconRight={view === 'resolved' ? CheckmarkIcon : undefined}\n onClick={handleSetResolvedView}\n text={t('status-filter.status-resolved-full')}\n tooltipProps={\n mode === 'upsell'\n ? {content: t('status-filter.status-resolved-full-upsell')}\n : undefined\n }\n disabled={mode === 'upsell'}\n />\n </Menu>\n }\n popover={{placement: 'bottom-end'}}\n />\n\n <Button\n aria-label={t('close-pane-button-text-aria-label')}\n icon={CloseIcon}\n mode=\"bleed\"\n onClick={onClose}\n tooltipProps={{content: t('close-pane-button-text')}}\n />\n </Flex>\n </Flex>\n </Root>\n )\n})\n","import {Flex, Layer, useClickOutsideEvent, useLayer, useToast} from '@sanity/ui'\nimport * as PathUtils from '@sanity/util/paths'\nimport {Fragment, useCallback, useEffect, useMemo, useRef, useState} from 'react'\nimport {styled} from 'styled-components'\n\nimport {type DocumentInspectorProps} from '../../../config'\nimport {useTranslation} from '../../../i18n'\nimport {useCurrentUser} from '../../../store'\nimport {useAddonDataset} from '../../../studio/addonDataset'\nimport {\n CommentDeleteDialog,\n CommentsList,\n CommentsOnboardingPopover,\n CommentsUpsellPanel,\n} from '../../components'\nimport {type CommentsSelectedPath} from '../../context'\nimport {isTextSelectionComment} from '../../helpers'\nimport {\n useComments,\n useCommentsEnabled,\n useCommentsOnboarding,\n useCommentsScroll,\n useCommentsSelectedPath,\n useCommentsTelemetry,\n useCommentsUpsell,\n} from '../../hooks'\nimport {commentsLocaleNamespace} from '../../i18n'\nimport {\n type CommentBaseCreatePayload,\n type CommentReactionOption,\n type CommentStatus,\n type CommentsUIMode,\n type CommentUpdatePayload,\n} from '../../types'\nimport {CommentsInspectorError} from './CommentsInspectorError'\nimport {CommentsInspectorHeader} from './CommentsInspectorHeader'\n\ninterface CommentToDelete {\n commentId: string\n isParent: boolean\n}\n\nconst RootLayer = styled(Layer)`\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n`\n\nexport function CommentsInspector(props: DocumentInspectorProps) {\n const {enabled, mode} = useCommentsEnabled()\n\n if (!enabled) return null\n\n // We wrap the comments inspector in a Layer in order to know when the comments inspector\n // is the top layer (that is, if there is e.g. a popover open). This is used to determine\n // if we should deselect the selected path when clicking outside the comments inspector.\n return (\n <RootLayer>\n <CommentsInspectorInner {...props} mode={mode} />\n </RootLayer>\n )\n}\n\nfunction CommentsInspectorInner(\n props: DocumentInspectorProps & {\n mode: CommentsUIMode\n },\n) {\n const {t} = useTranslation(commentsLocaleNamespace)\n const {onClose, mode} = props\n const [showDeleteDialog, setShowDeleteDialog] = useState<boolean>(false)\n const [commentToDelete, setCommentToDelete] = useState<CommentToDelete | null>(null)\n const [deleteLoading, setDeleteLoading] = useState<boolean>(false)\n const [deleteError, setDeleteError] = useState<Error | null>(null)\n\n const rootRef = useRef<HTMLDivElement | null>(null)\n const [rootElement, setRootElement] = useState<HTMLDivElement | null>(null)\n\n const currentUser = useCurrentUser()\n const {\n comments,\n getComment,\n isCreatingDataset,\n mentionOptions,\n setStatus,\n status,\n operation,\n selectedCommentId,\n getCommentLink,\n onClearSelectedComment,\n onPathOpen,\n } = useComments()\n const commentIdParamRef = useRef<string | undefined>(selectedCommentId)\n const {error: addonDatasetError} = useAddonDataset()\n const didScrollToCommentFromParam = useRef<boolean>(false)\n\n const pushToast = useToast().push\n const {isTopLayer} = useLayer()\n\n const {scrollToComment, scrollToField, scrollToInlineComment} = useCommentsScroll({\n boundaryElement: rootElement,\n })\n const {selectedPath, setSelectedPath} = useCommentsSelectedPath()\n const {isDismissed, setDismissed} = useCommentsOnboarding()\n const telemetry = useCommentsTelemetry()\n\n const {upsellData, telemetryLogs: upsellTelemetryLogs} = useCommentsUpsell()\n\n const currentComments = useMemo(() => comments.data[status], [comments, status])\n\n const {loading} = comments\n\n const handleChangeView = useCallback(\n (nextView: CommentStatus) => {\n setStatus(nextView)\n setSelectedPath(null)\n\n telemetry.commentListViewChanged(nextView)\n },\n [setSelectedPath, setStatus, telemetry],\n )\n\n const handleCloseInspector = useCallback(() => {\n onClose()\n setSelectedPath(null)\n }, [onClose, setSelectedPath])\n\n const handleCopyLink = useMemo(() => {\n if (!getCommentLink) return undefined\n\n const copyLink = (id: string) => {\n navigator.clipboard.writeText(getCommentLink(id)).catch(() => {\n pushToast({\n closable: true,\n status: 'error',\n title: t('copy-link-error-message'),\n })\n })\n\n telemetry.commentLinkCopied()\n }\n\n return copyLink\n }, [getCommentLink, pushToast, t, telemetry])\n\n const handleCreateRetry = useCallback(\n (id: string) => {\n const comment = getComment(id)\n if (!comment) return\n\n void operation.create({\n type: 'field',\n fieldPath: comment.target.path?.field || '',\n id: comment._id,\n message: comment.message,\n parentCommentId: comment.parentCommentId,\n reactions: comment.reactions || [],\n status: comment.status,\n threadId: comment.threadId,\n })\n },\n [getComment, operation],\n )\n\n const closeDeleteDialog = useCallback(() => {\n if (deleteLoading) return\n setShowDeleteDialog(false)\n setCommentToDelete(null)\n }, [deleteLoading])\n\n const handlePathSelect = useCallback(\n (nextPath: CommentsSelectedPath) => {\n setSelectedPath(nextPath)\n\n if (nextPath?.fieldPath) {\n const path = PathUtils.fromString(nextPath.fieldPath)\n onPathOpen?.(path)\n\n scrollToField(nextPath.fieldPath)\n\n const isInlineComment = comments.data.open\n .filter((c) => c.threadId === nextPath?.threadId)\n .some((x) => isTextSelectionComment(x.parentComment))\n\n if (isInlineComment && nextPath.threadId) {\n scrollToInlineComment(nextPath.threadId)\n }\n }\n },\n [comments.data.open, onPathOpen, scrollToField, scrollToInlineComment, setSelectedPath],\n )\n\n const handleNewThreadCreate = useCallback(\n (nextComment: CommentBaseCreatePayload) => {\n const fieldPath = nextComment?.payload?.fieldPath || ''\n\n void operation.create({\n type: 'field',\n fieldPath,\n message: nextComment.message,\n parentCommentId: nextComment.parentCommentId,\n reactions: nextComment.reactions,\n status: nextComment.status,\n threadId: nextComment.threadId,\n })\n\n setSelectedPath({\n fieldPath,\n origin: 'inspector',\n threadId: nextComment.threadId,\n })\n },\n [operation, setSelectedPath],\n )\n\n const handleReply = useCallback(\n (nextComment: CommentBaseCreatePayload) => {\n void operation.create({\n ...nextComment,\n type: 'field',\n fieldPath: nextComment?.payload?.fieldPath || '',\n })\n },\n [operation],\n )\n\n const handleEdit = useCallback(\n (id: string, nextComment: CommentUpdatePayload) => {\n void operation.update(id, nextComment)\n },\n [operation],\n )\n\n const onDeleteStart = useCallback(\n (id: string) => {\n const parent = currentComments.find((c) => c.parentComment?._id === id)\n const isParent = Boolean(parent && parent?.replies?.length > 0)\n\n setShowDeleteDialog(true)\n setCommentToDelete({\n commentId: id,\n isParent,\n })\n },\n\n [currentComments],\n )\n\n const handleDeleteConfirm = useCallback(\n async (id: string) => {\n try {\n setDeleteLoading(true)\n await operation.remove(id)\n closeDeleteDialog()\n } catch (err) {\n setDeleteError(err)\n }\n setDeleteLoading(false)\n },\n [closeDeleteDialog, operation],\n )\n\n const handleStatusChange = useCallback(\n (id: string, nextStatus: CommentStatus) => {\n void operation.update(id, {\n status: nextStatus,\n })\n\n // If the comment is being opened, we want to change to the \"open\" view\n // and scroll to the comment\n if (nextStatus === 'open') {\n setStatus('open')\n\n const comment = getComment(id)\n\n if (!comment) return\n\n setSelectedPath({\n fieldPath: comment.target.path?.field || null,\n origin: 'inspector',\n threadId: comment.threadId || null,\n })\n\n scrollToComment(id)\n }\n },\n [getComment, operation, scrollToComment, setSelectedPath, setStatus],\n )\n\n const handleReactionSelect = useCallback(\n (id: string, reaction: CommentReactionOption) => {\n void operation.react(id, reaction)\n },\n [operation],\n )\n\n const handleDeselectPath = useCallback(() => {\n // Clear the selected path when:\n // - Clicking outside the inspector when it's the top layer\n // - The target is not a slate editor string. This is needed because we do not want to\n // frequently deselect the selected path when clicking inside the editor.\n if (selectedPath && isTopLayer) {\n setSelectedPath(null)\n }\n }, [isTopLayer, selectedPath, setSelectedPath])\n\n const setRootRef = useCallback((element: HTMLDivElement | null) => {\n rootRef.current = element\n setRootElement(element)\n }, [])\n\n useClickOutsideEvent(\n (event) => {\n // Clear the selected path when clicking outside the comments inspector.\n // We do this only when the comments inspector is the top layer.\n const isPTETarget =\n event.target instanceof HTMLElement && event.target?.hasAttribute('data-pt-text')\n\n if (!isPTETarget) {\n handleDeselectPath()\n }\n },\n () => [rootRef.current],\n )\n\n const [loggedTelemetry, setLoggedTelemetry] = useState(false)\n useEffect(() => {\n if (loggedTelemetry || mode !== 'upsell') return undefined\n // oxlint-disable-next-line react/react-compiler\n setLoggedTelemetry(true)\n if (selectedPath?.origin === 'form') {\n upsellTelemetryLogs.panelViewed('field_action')\n } else if (commentIdParamRef.current) {\n upsellTelemetryLogs.panelViewed('link')\n } else {\n upsellTelemetryLogs.panelViewed('document_action')\n }\n return () => {\n upsellTelemetryLogs.panelDismissed()\n }\n }, [loggedTelemetry, mode, selectedPath?.origin, upsellTelemetryLogs])\n\n // Handle scroll to comment from URL param\n useEffect(() => {\n // Make sure that the comment exists before we try to scroll to it.\n // We can't solely rely on the comment id from the url since the comment might not be loaded yet.\n const commentToScrollTo = getComment(commentIdParamRef.current || '')\n\n if (!loading && commentToScrollTo && !didScrollToCommentFromParam.current) {\n // Make sure we have the correct status set before we scroll to the comment\n setStatus(commentToScrollTo.status || 'open')\n\n handlePathSelect({\n fieldPath: commentToScrollTo.target.path?.field || null,\n origin: 'url',\n threadId: commentToScrollTo.threadId || null,\n })\n\n // Defer the comment scroll to prevent React batching from overwriting the field scroll\n requestAnimationFrame(() => {\n scrollToComment(commentToScrollTo._id)\n })\n\n didScrollToCommentFromParam.current = true\n commentIdParamRef.current = undefined\n\n onClearSelectedComment?.()\n\n telemetry.commentViewedFromLink()\n }\n }, [\n getComment,\n handlePathSelect,\n loading,\n onClearSelectedComment,\n scrollToComment,\n setStatus,\n telemetry,\n ])\n\n const beforeListNode = useMemo(() => {\n if (mode === 'upsell' && upsellData) {\n return (\n <CommentsUpsellPanel\n data={upsellData}\n onPrimaryClick={upsellTelemetryLogs.panelPrimaryClicked}\n onSecondaryClick={upsellTelemetryLogs.panelSecondaryClicked}\n />\n )\n }\n\n return null\n }, [\n mode,\n upsellTelemetryLogs.panelPrimaryClicked,\n upsellTelemetryLogs.panelSecondaryClicked,\n upsellData,\n ])\n\n return (\n <Fragment>\n {commentToDelete && showDeleteDialog && (\n <CommentDeleteDialog\n {...commentToDelete}\n error={deleteError}\n loading={deleteLoading}\n onClose={closeDeleteDialog}\n onConfirm={handleDeleteConfirm}\n />\n )}\n\n <Flex\n direction=\"column\"\n flex={1}\n height=\"fill\"\n onClick={handleDeselectPath}\n overflow=\"hidden\"\n ref={setRootRef}\n >\n <CommentsOnboardingPopover\n onDismiss={setDismissed}\n open={!isDismissed}\n placement=\"left-start\"\n >\n <CommentsInspectorHeader\n onClose={handleCloseInspector}\n onViewChange={handleChangeView}\n view={status}\n mode={mode}\n />\n </CommentsOnboardingPopover>\n {addonDatasetError && <CommentsInspectorError error={addonDatasetError} />}\n {currentUser && (\n <CommentsList\n beforeListNode={beforeListNode}\n comments={currentComments}\n currentUser={currentUser}\n error={comments.error}\n loading={loading}\n mentionOptions={mentionOptions}\n mode={mode}\n onCopyLink={handleCopyLink}\n onCreateRetry={handleCreateRetry}\n onDelete={onDeleteStart}\n onEdit={handleEdit}\n onNewThreadCreate={handleNewThreadCreate}\n onPathSelect={handlePathSelect}\n onReactionSelect={handleReactionSelect}\n onReply={handleReply}\n onStatusChange={handleStatusChange}\n readOnly={isCreatingDataset}\n selectedPath={selectedPath}\n status={status}\n />\n )}\n </Flex>\n </Fragment>\n )\n}\n"],"names":["CommentsUpsellPanel","props","$","_c","data","onPrimaryClick","onSecondaryClick","t0","useCommentsOnboarding","ctx","useContext","CommentsOnboardingContext","Error","CommentsInspectorError","error","t","useTranslation","commentsLocaleNamespace","t1","t2","t3","message","t4","Root","styled","Card","withConfig","displayName","componentId","position","zIndex","lineHeight","CommentsInspectorHeader","forwardRef","ref","onClose","onViewChange","view","mode","handleSetOpenView","handleSetResolvedView","t5","ChevronDownIcon","t6","for","width","t7","CheckmarkIcon","undefined","t8","t9","t10","t11","t12","content","t13","t14","t15","t16","placement","t17","t18","t19","t20","t21","CloseIcon","t22","t23","t24","RootLayer","Layer","CommentsInspector","enabled","useCommentsEnabled","CommentsInspectorInner","showDeleteDialog","setShowDeleteDialog","useState","commentToDelete","setCommentToDelete","deleteLoading","setDeleteLoading","deleteError","setDeleteError","rootRef","useRef","rootElement","setRootElement","currentUser","useCurrentUser","comments","getComment","isCreatingDataset","mentionOptions","setStatus","status","operation","selectedCommentId","getCommentLink","onClearSelectedComment","onPathOpen","useComments","commentIdParamRef","addonDatasetError","useAddonDataset","didScrollToCommentFromParam","pushToast","useToast","push","isTopLayer","useLayer","boundaryElement","scrollToComment","scrollToField","scrollToInlineComment","useCommentsScroll","selectedPath","setSelectedPath","useCommentsSelectedPath","isDismissed","setDismissed","telemetry","useCommentsTelemetry","upsellData","telemetryLogs","upsellTelemetryLogs","useCommentsUpsell","currentComments","loading","nextView","commentListViewChanged","handleChangeView","handleCloseInspector","bb0","id","navigator","clipboard","writeText","catch","closable","title","commentLinkCopied","handleCopyLink","id_0","comment","create","type","fieldPath","target","path","field","_id","parentCommentId","reactions","threadId","handleCreateRetry","closeDeleteDialog","open","nextPath","PathUtils","fromString","filter","c","some","_temp","handlePathSelect","nextComment","payload","origin","handleNewThreadCreate","nextComment_0","handleReply","id_1","nextComment_1","update","handleEdit","id_2","parent","find","c_0","parentComment","isParent","Boolean","replies","length","commentId","onDeleteStart","id_3","remove","err","handleDeleteConfirm","id_4","nextStatus","comment_0","handleStatusChange","id_5","reaction","react","handleReactionSelect","handleDeselectPath","Symbol","element","current","setRootRef","event","HTMLElement","hasAttribute","useClickOutsideEvent","loggedTelemetry","setLoggedTelemetry","panelViewed","panelDismissed","useEffect","commentToScrollTo","requestAnimationFrame","commentViewedFromLink","bb1","panelPrimaryClicked","panelSecondaryClicked","beforeListNode","t25","t26","t27","t28","t29","t30","t31","x","isTextSelectionComment"],"mappings":"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"}
@@ -158,6 +158,7 @@ import "date-fns/format";
158
158
  import "date-fns/isValid";
159
159
  import "date-fns/parse";
160
160
  import "lodash-es/debounce.js";
161
+ import "clsx";
161
162
  import "@portabletext/react";
162
163
  import "@sanity/icons/LinkRemoved";
163
164
  import "lodash-es/findIndex.js";
@@ -1 +1 @@
1
- {"version":3,"file":"ReleasesStudioLayout.js","sources":["../../src/core/releases/components/dialog/ReleaseLimitsMisconfigurationDialog.tsx","../../src/core/releases/contexts/upsell/fetchReleaseLimits.ts","../../src/core/releases/store/useOrgActiveReleaseCount.ts","../../src/core/releases/store/useReleaseLimits.ts","../../src/core/releases/contexts/upsell/ReleasesUpsellProvider.tsx","../../src/core/releases/plugin/ReleasesStudioLayout.tsx"],"sourcesContent":["import {Stack, Text} from '@sanity/ui'\nimport {useCallback} from 'react'\n\nimport {Dialog} from '../../../../ui-components'\nimport {useTranslation} from '../../../i18n'\n\ninterface ReleaseLimitsMisconfigurationDialogProps {\n onClose: () => void\n}\n\nexport function ReleaseLimitsMisconfigurationDialog(\n props: ReleaseLimitsMisconfigurationDialogProps,\n) {\n const {onClose} = props\n const {t} = useTranslation()\n\n const handleContactSupport = useCallback(() => {\n window.open('https://www.sanity.io/contact/support', '_blank', 'noopener,noreferrer')\n onClose()\n }, [onClose])\n\n return (\n <Dialog\n id=\"releases-misconfiguration-dialog\"\n header={t('releases.upsell.misconfiguration.header')}\n width={1}\n onClose={onClose}\n footer={{\n confirmButton: {\n text: t('releases.upsell.misconfiguration.contact-support'),\n onClick: handleContactSupport,\n tone: 'primary',\n },\n }}\n >\n <Stack space={4}>\n <Text>{t('releases.upsell.misconfiguration.message')}</Text>\n </Stack>\n </Dialog>\n )\n}\n","import {type ClientError, type SanityClient} from '@sanity/client'\nimport {catchError, map, type Observable, of} from 'rxjs'\n\nexport interface ReleaseLimits {\n // count of all active releases (including content releases and scheduled drafts)\n orgActiveReleaseCount: number\n // counts all content releases that contribute towards reaching the org active release limit\n // excludes scheduled drafts (cardinality `one` releases)\n orgMeteredActiveReleaseCount: number\n datasetReleaseLimit: number\n // internal server error has no fallback number - it uses null\n orgActiveReleaseLimit: number | null\n}\n\ninterface ReleaseLimitsResponse {\n data: ReleaseLimits\n}\n\nfunction isErrorAtLimits(error: ClientError) {\n return (\n error.statusCode === 403 &&\n typeof error.response.body !== 'string' &&\n 'data' in error.response.body\n )\n}\n\n/**\n * @internal\n * fetches subscriptions for this project\n */\nexport function fetchReleaseLimits(\n client: SanityClient,\n storeOrigin: string,\n): Observable<ReleaseLimits> {\n const {projectId} = client.config()\n\n // This endpoint is prone to optimisation and further work\n // it will never live within a versions API and will always be on vX\n // until it goes away - there is graceful handling in `catchError`\n // for when this endpoint is no longer available and limits are fetched\n // some other way\n const clientX = client.withConfig({apiVersion: 'vX'})\n\n return clientX.observable\n .request<ReleaseLimitsResponse>({\n uri: `projects/${projectId}/new-content-release-allowed`,\n /**\n * In a particular case when both releaseLimits\n * and orgActiveReleaseCount stores are empty, 2 fetch calls are made\n * to guard the create/archive/revert actions - browsers behave differently.\n *\n * Chromium based browsers will stall the second network request until the first\n * resolves by attaching the store name to the tag, this spoofs 2 unique requests\n * allowing both the fire in parallel.\n */\n tag: `new-content-release-allowed-${storeOrigin}`,\n })\n .pipe(\n catchError((error: ClientError) => {\n console.error(error)\n\n if (isErrorAtLimits(error)) {\n // body will still contain the limits and current count (if available)\n // so still want to return these and just silently log the error\n return of(error.response.body as ReleaseLimitsResponse)\n }\n\n // for internal server errors, or as a fallback\n // propagate up the error\n throw error\n }),\n map(({data}) => data),\n )\n}\n","import {type SanityClient} from '@sanity/client'\nimport {useMemo} from 'react'\nimport {BehaviorSubject, catchError, map, type Observable, of, switchMap, tap, timer} from 'rxjs'\n\nimport {useClient} from '../../hooks/useClient'\nimport {useResourceCache} from '../../store/ResourceCacheProvider'\nimport {fetchReleaseLimits, type ReleaseLimits} from '../contexts/upsell/fetchReleaseLimits'\nimport {useActiveReleases} from './useActiveReleases'\n\ninterface OrgActiveReleaseCountStore {\n orgActiveReleaseCount$: Observable<ReleaseLimits['orgActiveReleaseCount']>\n}\n\nconst STATE_TTL_MS = 60_000\nconst ORG_ACTIVE_RELEASE_COUNT_RESOURCE_CACHE_NAMESPACE = 'orgActiveReleaseCount'\n\nfunction createOrgActiveReleaseCountStore(\n client: SanityClient,\n activeReleasesCount: number,\n): OrgActiveReleaseCountStore {\n const latestFetchState = new BehaviorSubject<number | null>(null)\n const staleFlag$ = new BehaviorSubject<boolean>(false)\n const activeReleaseCountAtFetch = new BehaviorSubject<number | null>(null)\n\n const orgActiveReleaseCount$ = latestFetchState.pipe(\n switchMap((state) => {\n if (\n state === null ||\n // oxlint-disable-next-line no-unnecessary-boolean-literal-compare\n staleFlag$.getValue() === true ||\n activeReleaseCountAtFetch.getValue() !== activeReleasesCount\n ) {\n staleFlag$.next(false)\n\n return fetchReleaseLimits(client, 'orgActiveReleaseCount').pipe(\n tap(() => activeReleaseCountAtFetch.next(activeReleasesCount)),\n map((data) => data.orgMeteredActiveReleaseCount),\n catchError((error) => {\n console.error('Failed to fetch org release count', error)\n\n if (!state) throw error\n\n // return the last state if it exists\n return of(state)\n }),\n switchMap((nextState) => {\n latestFetchState.next(nextState)\n\n timer(STATE_TTL_MS).subscribe(() => {\n staleFlag$.next(true)\n activeReleaseCountAtFetch.next(null)\n })\n\n return of(nextState)\n }),\n )\n }\n\n return of(state)\n }),\n )\n\n return {\n orgActiveReleaseCount$,\n }\n}\n\n/**\n * @internal\n *\n * Returns a shared observable to a cache of the org's active release count.\n *\n * This cache expires after a TTL or whenever the active releases in the\n * count of active releases in the dataset changes.\n *\n * @returns An Observable of the cached value for org's active release count.\n */\nexport const useOrgActiveReleaseCount = () => {\n const resourceCache = useResourceCache()\n const {data: activeReleases} = useActiveReleases()\n const client = useClient({apiVersion: 'v2025-02-19'})\n\n const activeReleasesCount = activeReleases?.length || 0\n\n // dependencies must be objects not primitives, so nesting activeReleasesCount in an object\n const count = useMemo(() => ({activeReleasesCount}), [activeReleasesCount])\n\n return useMemo(() => {\n const releaseLimitsStore =\n resourceCache.get<OrgActiveReleaseCountStore>({\n dependencies: [client, count],\n namespace: ORG_ACTIVE_RELEASE_COUNT_RESOURCE_CACHE_NAMESPACE,\n }) || createOrgActiveReleaseCountStore(client, count.activeReleasesCount)\n\n resourceCache.set({\n namespace: ORG_ACTIVE_RELEASE_COUNT_RESOURCE_CACHE_NAMESPACE,\n value: releaseLimitsStore,\n dependencies: [client, count],\n })\n\n return releaseLimitsStore\n }, [client, count, resourceCache])\n}\n","import {type SanityClient} from '@sanity/client'\nimport {useMemo} from 'react'\nimport {catchError, map, type Observable, of, shareReplay} from 'rxjs'\n\nimport {useClient} from '../../hooks/useClient'\nimport {useResourceCache} from '../../store/ResourceCacheProvider'\nimport {fetchReleaseLimits, type ReleaseLimits} from '../contexts/upsell/fetchReleaseLimits'\n\ninterface ReleaseLimitsStore {\n releaseLimits$: Observable<Omit<\n ReleaseLimits,\n 'orgActiveReleaseCount' | 'orgMeteredActiveReleaseCount'\n > | null>\n}\n\nconst RELEASE_LIMITS_RESOURCE_CACHE_NAMESPACE = 'ReleaseLimits'\n\nfunction createReleaseLimitsStore(client: SanityClient): ReleaseLimitsStore {\n const releaseLimits$ = fetchReleaseLimits(client, 'releaseLimits').pipe(\n map((data) => ({\n datasetReleaseLimit: data.datasetReleaseLimit,\n orgActiveReleaseLimit: data.orgActiveReleaseLimit,\n })),\n shareReplay(1),\n catchError((error) => {\n console.error('Failed to fetch release limits', error)\n\n return of(null)\n }),\n )\n\n return {\n releaseLimits$,\n }\n}\n\n/**\n * @internal\n *\n * Returns a shared observable to a cache of the release limits for the current project.\n *\n * This cache is shared across all instances of this hook, and will only be fetched once.\n * It will never expire as the limits are not expected to change during the lifetime of the render cycle.\n *\n * @returns An Observable of the cached value for the release limits\n */\nexport const useReleaseLimits: () => ReleaseLimitsStore = () => {\n const resourceCache = useResourceCache()\n const client = useClient({apiVersion: 'v2025-02-19'})\n\n return useMemo(() => {\n const releaseLimitsStore =\n resourceCache.get<ReleaseLimitsStore>({\n dependencies: [client],\n namespace: RELEASE_LIMITS_RESOURCE_CACHE_NAMESPACE,\n }) || createReleaseLimitsStore(client)\n\n resourceCache.set({\n namespace: RELEASE_LIMITS_RESOURCE_CACHE_NAMESPACE,\n value: releaseLimitsStore,\n dependencies: [client],\n })\n\n return releaseLimitsStore\n }, [client, resourceCache])\n}\n","import {useToast} from '@sanity/ui'\nimport {useCallback, useMemo, useState} from 'react'\nimport {firstValueFrom, tap} from 'rxjs'\nimport {ReleasesUpsellContext} from 'sanity/_singletons'\n\nimport {useFeatureEnabled} from '../../../hooks'\nimport {FEATURES} from '../../../hooks/useFeatureEnabled'\nimport {useUpsellData} from '../../../hooks/useUpsellData'\nimport {useTranslation} from '../../../i18n'\nimport {type UpsellDialogViewedInfo} from '../../../studio/upsell/__telemetry__/upsell.telemetry'\nimport {UpsellDialog} from '../../../studio/upsell/UpsellDialog'\nimport {isCardinalityOneRelease} from '../../../util/releaseUtils'\nimport {ReleaseLimitsMisconfigurationDialog} from '../../components/dialog/ReleaseLimitsMisconfigurationDialog'\nimport {useActiveReleases} from '../../store/useActiveReleases'\nimport {useOrgActiveReleaseCount} from '../../store/useOrgActiveReleaseCount'\nimport {useReleaseLimits} from '../../store/useReleaseLimits'\nimport {type ReleasesUpsellContextValue} from './types'\n\nclass StudioReleaseLimitExceededError extends Error {\n details: {type: 'releaseLimitExceededError'}\n\n constructor() {\n super('StudioReleaseLimitExceeded')\n this.name = 'StudioReleaseLimitExceededError'\n this.details = {\n type: 'releaseLimitExceededError',\n }\n }\n}\n\n/**\n * @beta\n * @hidden\n */\nexport function ReleasesUpsellProvider(props: {children: React.ReactNode}) {\n const [upsellDialogOpen, setUpsellDialogOpen] = useState(false)\n const {data: allActiveReleases} = useActiveReleases()\n const {enabled: isReleasesFeatureEnabled} = useFeatureEnabled(FEATURES.contentReleases)\n const {upsellData, telemetryLogs, hasError} = useUpsellData({\n dataUri: '/journey/content-releases',\n feature: 'content-releases',\n })\n const toast = useToast()\n const {t} = useTranslation()\n\n const meteredActiveReleases = useMemo(\n () => allActiveReleases.filter((release) => !isCardinalityOneRelease(release)),\n [allActiveReleases],\n )\n\n const mode = useMemo(() => {\n /**\n * upsell if:\n * plan is free, ie releases is not feature enabled\n */\n if (!isReleasesFeatureEnabled) {\n return 'upsell'\n }\n return 'default'\n }, [isReleasesFeatureEnabled])\n\n const handlePrimaryButtonClick = useCallback(() => {\n telemetryLogs.dialogPrimaryClicked()\n }, [telemetryLogs])\n\n const handleSecondaryButtonClick = useCallback(() => {\n telemetryLogs.dialogSecondaryClicked()\n }, [telemetryLogs])\n\n const handleClose = useCallback(() => {\n setUpsellDialogOpen(false)\n telemetryLogs.dialogDismissed()\n }, [telemetryLogs])\n\n const [releaseLimit, setReleaseLimit] = useState<number | null>(null)\n const [showMisconfigurationDialog, setShowMisconfigurationDialog] = useState(false)\n\n const handleOpenDialog = useCallback(\n (source: UpsellDialogViewedInfo['source'] = 'navbar') => {\n if (hasError) {\n toast.push({\n status: 'error',\n title: t('errors.unable-to-perform-action'),\n closable: true,\n })\n return\n }\n\n setUpsellDialogOpen(true)\n\n telemetryLogs.dialogViewed(source)\n },\n [hasError, toast, t, telemetryLogs],\n )\n\n const {releaseLimits$} = useReleaseLimits()\n const {orgActiveReleaseCount$} = useOrgActiveReleaseCount()\n\n const guardWithReleaseLimitUpsell = useCallback(\n async (\n cb: () => void,\n throwError: boolean = false,\n whenResolved?: (hasPassed: boolean) => void,\n ) => {\n const doUpsell = (): false => {\n handleOpenDialog()\n if (throwError) {\n throw new StudioReleaseLimitExceededError()\n }\n return false\n }\n\n if (mode === 'upsell') {\n whenResolved?.(false)\n return doUpsell()\n }\n\n const fetchLimitsCount = async () => {\n try {\n // if either fails then catch the error\n return await Promise.all([\n firstValueFrom(orgActiveReleaseCount$),\n firstValueFrom(\n releaseLimits$.pipe(\n tap((limit) => setReleaseLimit(limit?.orgActiveReleaseLimit || null)),\n ),\n ),\n ])\n } catch (e) {\n console.error('Error fetching release limits and org count for upsell:', e)\n\n return null\n }\n }\n\n const result = await fetchLimitsCount()\n\n // silently fail and allow pass through guard\n if (result === null) {\n whenResolved?.(true)\n return cb()\n }\n\n const [orgMeteredActiveReleaseCount, releaseLimits] = result\n\n if (releaseLimits === null || orgMeteredActiveReleaseCount === null) {\n whenResolved?.(true)\n return cb()\n }\n\n const {orgActiveReleaseLimit, datasetReleaseLimit} = releaseLimits\n\n // Misconfiguration is when the content release feature is enabled\n // but the quota is set to 0\n if (orgActiveReleaseLimit === 0) {\n whenResolved?.(false)\n setShowMisconfigurationDialog(true)\n if (throwError) {\n throw new StudioReleaseLimitExceededError()\n }\n return false\n }\n\n // orgMeteredActiveReleaseCount might be missing due to internal server error\n // allow pass through guard in that case\n if (orgMeteredActiveReleaseCount === null) {\n whenResolved?.(true)\n return cb()\n }\n\n const meteredActiveReleaseCount = meteredActiveReleases?.length || 0\n const allActiveReleaseCount = allActiveReleases?.length || 0\n\n // scheduled drafts and content releases contribute towards reaching the dataset limit\n const isCurrentDatasetAtAboveDatasetLimit = allActiveReleaseCount >= datasetReleaseLimit\n\n // only metered content releases contribute towards reaching the org limit\n const isCurrentDatasetAtAboveOrgLimit =\n orgActiveReleaseLimit !== null && meteredActiveReleaseCount >= orgActiveReleaseLimit\n const isOrgAtAboveOrgLimit =\n orgActiveReleaseLimit !== null && orgMeteredActiveReleaseCount >= orgActiveReleaseLimit\n\n const shouldShowDialog =\n isCurrentDatasetAtAboveDatasetLimit ||\n isCurrentDatasetAtAboveOrgLimit ||\n isOrgAtAboveOrgLimit\n\n if (shouldShowDialog) {\n whenResolved?.(false)\n return doUpsell()\n }\n\n whenResolved?.(true)\n return cb()\n },\n [\n meteredActiveReleases.length,\n handleOpenDialog,\n allActiveReleases.length,\n mode,\n releaseLimits$,\n orgActiveReleaseCount$,\n ],\n )\n\n const onReleaseLimitReached = useCallback(\n (limit: number) => {\n setReleaseLimit(limit)\n handleOpenDialog()\n },\n [handleOpenDialog],\n )\n\n const ctxValue = useMemo<ReleasesUpsellContextValue>(\n () => ({\n mode,\n upsellDialogOpen,\n guardWithReleaseLimitUpsell,\n onReleaseLimitReached,\n telemetryLogs,\n upsellData,\n handleOpenDialog,\n }),\n [\n mode,\n upsellDialogOpen,\n guardWithReleaseLimitUpsell,\n onReleaseLimitReached,\n telemetryLogs,\n upsellData,\n handleOpenDialog,\n ],\n )\n\n const interpolation = useMemo(\n () => (releaseLimit === null ? undefined : {releaseLimit: releaseLimit}),\n [releaseLimit],\n )\n\n const dialogProps = useMemo(\n () => ({\n data: upsellData,\n open: upsellDialogOpen,\n interpolation,\n onClose: handleClose,\n onPrimaryClick: handlePrimaryButtonClick,\n onSecondaryClick: handleSecondaryButtonClick,\n }),\n [\n upsellData,\n upsellDialogOpen,\n interpolation,\n handleClose,\n handlePrimaryButtonClick,\n handleSecondaryButtonClick,\n ],\n )\n\n return (\n <ReleasesUpsellContext.Provider value={ctxValue}>\n {props.children}\n {showMisconfigurationDialog ? (\n <ReleaseLimitsMisconfigurationDialog onClose={() => setShowMisconfigurationDialog(false)} />\n ) : (\n <UpsellDialog {...dialogProps} />\n )}\n </ReleasesUpsellContext.Provider>\n )\n}\n","import {type LayoutProps} from '../../config'\nimport {useReleasesToolAvailable} from '../../schedules/hooks/useReleasesToolAvailable'\nimport {ReleasesMetadataProvider} from '../contexts/ReleasesMetadataProvider'\nimport {ReleasesUpsellProvider} from '../contexts/upsell/ReleasesUpsellProvider'\n\nexport function ReleasesStudioLayout(props: LayoutProps) {\n const releasesToolAvailable = useReleasesToolAvailable()\n\n if (!releasesToolAvailable) {\n return props.renderDefault(props)\n }\n\n return (\n <ReleasesUpsellProvider>\n <ReleasesMetadataProvider>{props.renderDefault(props)}</ReleasesMetadataProvider>\n </ReleasesUpsellProvider>\n )\n}\n"],"names":["ReleaseLimitsMisconfigurationDialog","props","$","_c","onClose","t","useTranslation","t0","window","open","handleContactSupport","t1","t2","t3","confirmButton","text","onClick","tone","t4","t5","t6","isErrorAtLimits","error","statusCode","response","body","fetchReleaseLimits","client","storeOrigin","projectId","config","withConfig","apiVersion","observable","request","uri","tag","pipe","catchError","console","of","map","data","STATE_TTL_MS","ORG_ACTIVE_RELEASE_COUNT_RESOURCE_CACHE_NAMESPACE","createOrgActiveReleaseCountStore","activeReleasesCount","latestFetchState","BehaviorSubject","staleFlag$","activeReleaseCountAtFetch","orgActiveReleaseCount$","switchMap","state","getValue","next","tap","orgMeteredActiveReleaseCount","nextState","timer","subscribe","useOrgActiveReleaseCount","resourceCache","useResourceCache","activeReleases","useActiveReleases","for","useClient","length","count","releaseLimitsStore","get","dependencies","namespace","set","value","RELEASE_LIMITS_RESOURCE_CACHE_NAMESPACE","createReleaseLimitsStore","releaseLimits$","datasetReleaseLimit","orgActiveReleaseLimit","shareReplay","useReleaseLimits","StudioReleaseLimitExceededError","Error","constructor","name","details","type","ReleasesUpsellProvider","upsellDialogOpen","setUpsellDialogOpen","useState","allActiveReleases","enabled","isReleasesFeatureEnabled","useFeatureEnabled","FEATURES","contentReleases","dataUri","feature","upsellData","telemetryLogs","hasError","useUpsellData","toast","useToast","filter","_temp","meteredActiveReleases","bb0","mode","dialogPrimaryClicked","handlePrimaryButtonClick","dialogSecondaryClicked","handleSecondaryButtonClick","dialogDismissed","handleClose","releaseLimit","setReleaseLimit","showMisconfigurationDialog","setShowMisconfigurationDialog","t7","source","undefined","push","status","title","closable","dialogViewed","handleOpenDialog","cb","t8","whenResolved","throwError","doUpsell","result","Promise","all","firstValueFrom","limit","t9","e","releaseLimits","meteredActiveReleaseCount","isCurrentDatasetAtAboveDatasetLimit","isCurrentDatasetAtAboveOrgLimit","isOrgAtAboveOrgLimit","guardWithReleaseLimitUpsell","limit_0","onReleaseLimitReached","ctxValue","t10","interpolation","t11","onPrimaryClick","onSecondaryClick","dialogProps","t12","t13","children","release","isCardinalityOneRelease","ReleasesStudioLayout","useReleasesToolAvailable","renderDefault"],"mappings":"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"}
1
+ {"version":3,"file":"ReleasesStudioLayout.js","sources":["../../src/core/releases/components/dialog/ReleaseLimitsMisconfigurationDialog.tsx","../../src/core/releases/contexts/upsell/fetchReleaseLimits.ts","../../src/core/releases/store/useOrgActiveReleaseCount.ts","../../src/core/releases/store/useReleaseLimits.ts","../../src/core/releases/contexts/upsell/ReleasesUpsellProvider.tsx","../../src/core/releases/plugin/ReleasesStudioLayout.tsx"],"sourcesContent":["import {Stack, Text} from '@sanity/ui'\nimport {useCallback} from 'react'\n\nimport {Dialog} from '../../../../ui-components'\nimport {useTranslation} from '../../../i18n'\n\ninterface ReleaseLimitsMisconfigurationDialogProps {\n onClose: () => void\n}\n\nexport function ReleaseLimitsMisconfigurationDialog(\n props: ReleaseLimitsMisconfigurationDialogProps,\n) {\n const {onClose} = props\n const {t} = useTranslation()\n\n const handleContactSupport = useCallback(() => {\n window.open('https://www.sanity.io/contact/support', '_blank', 'noopener,noreferrer')\n onClose()\n }, [onClose])\n\n return (\n <Dialog\n id=\"releases-misconfiguration-dialog\"\n header={t('releases.upsell.misconfiguration.header')}\n width={1}\n onClose={onClose}\n footer={{\n confirmButton: {\n text: t('releases.upsell.misconfiguration.contact-support'),\n onClick: handleContactSupport,\n tone: 'primary',\n },\n }}\n >\n <Stack space={4}>\n <Text>{t('releases.upsell.misconfiguration.message')}</Text>\n </Stack>\n </Dialog>\n )\n}\n","import {type ClientError, type SanityClient} from '@sanity/client'\nimport {catchError, map, type Observable, of} from 'rxjs'\n\nexport interface ReleaseLimits {\n // count of all active releases (including content releases and scheduled drafts)\n orgActiveReleaseCount: number\n // counts all content releases that contribute towards reaching the org active release limit\n // excludes scheduled drafts (cardinality `one` releases)\n orgMeteredActiveReleaseCount: number\n datasetReleaseLimit: number\n // internal server error has no fallback number - it uses null\n orgActiveReleaseLimit: number | null\n}\n\ninterface ReleaseLimitsResponse {\n data: ReleaseLimits\n}\n\nfunction isErrorAtLimits(error: ClientError) {\n return (\n error.statusCode === 403 &&\n typeof error.response.body !== 'string' &&\n 'data' in error.response.body\n )\n}\n\n/**\n * @internal\n * fetches subscriptions for this project\n */\nexport function fetchReleaseLimits(\n client: SanityClient,\n storeOrigin: string,\n): Observable<ReleaseLimits> {\n const {projectId} = client.config()\n\n // This endpoint is prone to optimisation and further work\n // it will never live within a versions API and will always be on vX\n // until it goes away - there is graceful handling in `catchError`\n // for when this endpoint is no longer available and limits are fetched\n // some other way\n const clientX = client.withConfig({apiVersion: 'vX'})\n\n return clientX.observable\n .request<ReleaseLimitsResponse>({\n uri: `projects/${projectId}/new-content-release-allowed`,\n /**\n * In a particular case when both releaseLimits\n * and orgActiveReleaseCount stores are empty, 2 fetch calls are made\n * to guard the create/archive/revert actions - browsers behave differently.\n *\n * Chromium based browsers will stall the second network request until the first\n * resolves by attaching the store name to the tag, this spoofs 2 unique requests\n * allowing both the fire in parallel.\n */\n tag: `new-content-release-allowed-${storeOrigin}`,\n })\n .pipe(\n catchError((error: ClientError) => {\n console.error(error)\n\n if (isErrorAtLimits(error)) {\n // body will still contain the limits and current count (if available)\n // so still want to return these and just silently log the error\n return of(error.response.body as ReleaseLimitsResponse)\n }\n\n // for internal server errors, or as a fallback\n // propagate up the error\n throw error\n }),\n map(({data}) => data),\n )\n}\n","import {type SanityClient} from '@sanity/client'\nimport {useMemo} from 'react'\nimport {BehaviorSubject, catchError, map, type Observable, of, switchMap, tap, timer} from 'rxjs'\n\nimport {useClient} from '../../hooks/useClient'\nimport {useResourceCache} from '../../store/ResourceCacheProvider'\nimport {fetchReleaseLimits, type ReleaseLimits} from '../contexts/upsell/fetchReleaseLimits'\nimport {useActiveReleases} from './useActiveReleases'\n\ninterface OrgActiveReleaseCountStore {\n orgActiveReleaseCount$: Observable<ReleaseLimits['orgActiveReleaseCount']>\n}\n\nconst STATE_TTL_MS = 60_000\nconst ORG_ACTIVE_RELEASE_COUNT_RESOURCE_CACHE_NAMESPACE = 'orgActiveReleaseCount'\n\nfunction createOrgActiveReleaseCountStore(\n client: SanityClient,\n activeReleasesCount: number,\n): OrgActiveReleaseCountStore {\n const latestFetchState = new BehaviorSubject<number | null>(null)\n const staleFlag$ = new BehaviorSubject<boolean>(false)\n const activeReleaseCountAtFetch = new BehaviorSubject<number | null>(null)\n\n const orgActiveReleaseCount$ = latestFetchState.pipe(\n switchMap((state) => {\n if (\n state === null ||\n // oxlint-disable-next-line no-unnecessary-boolean-literal-compare\n staleFlag$.getValue() === true ||\n activeReleaseCountAtFetch.getValue() !== activeReleasesCount\n ) {\n staleFlag$.next(false)\n\n return fetchReleaseLimits(client, 'orgActiveReleaseCount').pipe(\n tap(() => activeReleaseCountAtFetch.next(activeReleasesCount)),\n map((data) => data.orgMeteredActiveReleaseCount),\n catchError((error) => {\n console.error('Failed to fetch org release count', error)\n\n if (!state) throw error\n\n // return the last state if it exists\n return of(state)\n }),\n switchMap((nextState) => {\n latestFetchState.next(nextState)\n\n timer(STATE_TTL_MS).subscribe(() => {\n staleFlag$.next(true)\n activeReleaseCountAtFetch.next(null)\n })\n\n return of(nextState)\n }),\n )\n }\n\n return of(state)\n }),\n )\n\n return {\n orgActiveReleaseCount$,\n }\n}\n\n/**\n * @internal\n *\n * Returns a shared observable to a cache of the org's active release count.\n *\n * This cache expires after a TTL or whenever the active releases in the\n * count of active releases in the dataset changes.\n *\n * @returns An Observable of the cached value for org's active release count.\n */\nexport const useOrgActiveReleaseCount = () => {\n const resourceCache = useResourceCache()\n const {data: activeReleases} = useActiveReleases()\n const client = useClient({apiVersion: 'v2025-02-19'})\n\n const activeReleasesCount = activeReleases?.length || 0\n\n // dependencies must be objects not primitives, so nesting activeReleasesCount in an object\n const count = useMemo(() => ({activeReleasesCount}), [activeReleasesCount])\n\n return useMemo(() => {\n const releaseLimitsStore =\n resourceCache.get<OrgActiveReleaseCountStore>({\n dependencies: [client, count],\n namespace: ORG_ACTIVE_RELEASE_COUNT_RESOURCE_CACHE_NAMESPACE,\n }) || createOrgActiveReleaseCountStore(client, count.activeReleasesCount)\n\n resourceCache.set({\n namespace: ORG_ACTIVE_RELEASE_COUNT_RESOURCE_CACHE_NAMESPACE,\n value: releaseLimitsStore,\n dependencies: [client, count],\n })\n\n return releaseLimitsStore\n }, [client, count, resourceCache])\n}\n","import {type SanityClient} from '@sanity/client'\nimport {useMemo} from 'react'\nimport {catchError, map, type Observable, of, shareReplay} from 'rxjs'\n\nimport {useClient} from '../../hooks/useClient'\nimport {useResourceCache} from '../../store/ResourceCacheProvider'\nimport {fetchReleaseLimits, type ReleaseLimits} from '../contexts/upsell/fetchReleaseLimits'\n\ninterface ReleaseLimitsStore {\n releaseLimits$: Observable<Omit<\n ReleaseLimits,\n 'orgActiveReleaseCount' | 'orgMeteredActiveReleaseCount'\n > | null>\n}\n\nconst RELEASE_LIMITS_RESOURCE_CACHE_NAMESPACE = 'ReleaseLimits'\n\nfunction createReleaseLimitsStore(client: SanityClient): ReleaseLimitsStore {\n const releaseLimits$ = fetchReleaseLimits(client, 'releaseLimits').pipe(\n map((data) => ({\n datasetReleaseLimit: data.datasetReleaseLimit,\n orgActiveReleaseLimit: data.orgActiveReleaseLimit,\n })),\n shareReplay(1),\n catchError((error) => {\n console.error('Failed to fetch release limits', error)\n\n return of(null)\n }),\n )\n\n return {\n releaseLimits$,\n }\n}\n\n/**\n * @internal\n *\n * Returns a shared observable to a cache of the release limits for the current project.\n *\n * This cache is shared across all instances of this hook, and will only be fetched once.\n * It will never expire as the limits are not expected to change during the lifetime of the render cycle.\n *\n * @returns An Observable of the cached value for the release limits\n */\nexport const useReleaseLimits: () => ReleaseLimitsStore = () => {\n const resourceCache = useResourceCache()\n const client = useClient({apiVersion: 'v2025-02-19'})\n\n return useMemo(() => {\n const releaseLimitsStore =\n resourceCache.get<ReleaseLimitsStore>({\n dependencies: [client],\n namespace: RELEASE_LIMITS_RESOURCE_CACHE_NAMESPACE,\n }) || createReleaseLimitsStore(client)\n\n resourceCache.set({\n namespace: RELEASE_LIMITS_RESOURCE_CACHE_NAMESPACE,\n value: releaseLimitsStore,\n dependencies: [client],\n })\n\n return releaseLimitsStore\n }, [client, resourceCache])\n}\n","import {useToast} from '@sanity/ui'\nimport {useCallback, useMemo, useState} from 'react'\nimport {firstValueFrom, tap} from 'rxjs'\nimport {ReleasesUpsellContext} from 'sanity/_singletons'\n\nimport {useFeatureEnabled} from '../../../hooks'\nimport {FEATURES} from '../../../hooks/useFeatureEnabled'\nimport {useUpsellData} from '../../../hooks/useUpsellData'\nimport {useTranslation} from '../../../i18n'\nimport {type UpsellDialogViewedInfo} from '../../../studio/upsell/__telemetry__/upsell.telemetry'\nimport {UpsellDialog} from '../../../studio/upsell/UpsellDialog'\nimport {isCardinalityOneRelease} from '../../../util/releaseUtils'\nimport {ReleaseLimitsMisconfigurationDialog} from '../../components/dialog/ReleaseLimitsMisconfigurationDialog'\nimport {useActiveReleases} from '../../store/useActiveReleases'\nimport {useOrgActiveReleaseCount} from '../../store/useOrgActiveReleaseCount'\nimport {useReleaseLimits} from '../../store/useReleaseLimits'\nimport {type ReleasesUpsellContextValue} from './types'\n\nclass StudioReleaseLimitExceededError extends Error {\n details: {type: 'releaseLimitExceededError'}\n\n constructor() {\n super('StudioReleaseLimitExceeded')\n this.name = 'StudioReleaseLimitExceededError'\n this.details = {\n type: 'releaseLimitExceededError',\n }\n }\n}\n\n/**\n * @beta\n * @hidden\n */\nexport function ReleasesUpsellProvider(props: {children: React.ReactNode}) {\n const [upsellDialogOpen, setUpsellDialogOpen] = useState(false)\n const {data: allActiveReleases} = useActiveReleases()\n const {enabled: isReleasesFeatureEnabled} = useFeatureEnabled(FEATURES.contentReleases)\n const {upsellData, telemetryLogs, hasError} = useUpsellData({\n dataUri: '/journey/content-releases',\n feature: 'content-releases',\n })\n const toast = useToast()\n const {t} = useTranslation()\n\n const meteredActiveReleases = useMemo(\n () => allActiveReleases.filter((release) => !isCardinalityOneRelease(release)),\n [allActiveReleases],\n )\n\n const mode = useMemo(() => {\n /**\n * upsell if:\n * plan is free, ie releases is not feature enabled\n */\n if (!isReleasesFeatureEnabled) {\n return 'upsell'\n }\n return 'default'\n }, [isReleasesFeatureEnabled])\n\n const handlePrimaryButtonClick = useCallback(() => {\n telemetryLogs.dialogPrimaryClicked()\n }, [telemetryLogs])\n\n const handleSecondaryButtonClick = useCallback(() => {\n telemetryLogs.dialogSecondaryClicked()\n }, [telemetryLogs])\n\n const handleClose = useCallback(() => {\n setUpsellDialogOpen(false)\n telemetryLogs.dialogDismissed()\n }, [telemetryLogs])\n\n const [releaseLimit, setReleaseLimit] = useState<number | null>(null)\n const [showMisconfigurationDialog, setShowMisconfigurationDialog] = useState(false)\n\n const handleOpenDialog = useCallback(\n (source: UpsellDialogViewedInfo['source'] = 'navbar') => {\n if (hasError) {\n toast.push({\n status: 'error',\n title: t('errors.unable-to-perform-action'),\n closable: true,\n })\n return\n }\n\n setUpsellDialogOpen(true)\n\n telemetryLogs.dialogViewed(source)\n },\n [hasError, toast, t, telemetryLogs],\n )\n\n const {releaseLimits$} = useReleaseLimits()\n const {orgActiveReleaseCount$} = useOrgActiveReleaseCount()\n\n const guardWithReleaseLimitUpsell = useCallback(\n async (\n cb: () => void,\n throwError: boolean = false,\n whenResolved?: (hasPassed: boolean) => void,\n ) => {\n const doUpsell = (): false => {\n handleOpenDialog()\n if (throwError) {\n throw new StudioReleaseLimitExceededError()\n }\n return false\n }\n\n if (mode === 'upsell') {\n whenResolved?.(false)\n return doUpsell()\n }\n\n const fetchLimitsCount = async () => {\n try {\n // if either fails then catch the error\n return await Promise.all([\n firstValueFrom(orgActiveReleaseCount$),\n firstValueFrom(\n releaseLimits$.pipe(\n tap((limit) => setReleaseLimit(limit?.orgActiveReleaseLimit || null)),\n ),\n ),\n ])\n } catch (e) {\n console.error('Error fetching release limits and org count for upsell:', e)\n\n return null\n }\n }\n\n const result = await fetchLimitsCount()\n\n // silently fail and allow pass through guard\n if (result === null) {\n whenResolved?.(true)\n return cb()\n }\n\n const [orgMeteredActiveReleaseCount, releaseLimits] = result\n\n if (releaseLimits === null || orgMeteredActiveReleaseCount === null) {\n whenResolved?.(true)\n return cb()\n }\n\n const {orgActiveReleaseLimit, datasetReleaseLimit} = releaseLimits\n\n // Misconfiguration is when the content release feature is enabled\n // but the quota is set to 0\n if (orgActiveReleaseLimit === 0) {\n whenResolved?.(false)\n setShowMisconfigurationDialog(true)\n if (throwError) {\n throw new StudioReleaseLimitExceededError()\n }\n return false\n }\n\n // orgMeteredActiveReleaseCount might be missing due to internal server error\n // allow pass through guard in that case\n if (orgMeteredActiveReleaseCount === null) {\n whenResolved?.(true)\n return cb()\n }\n\n const meteredActiveReleaseCount = meteredActiveReleases?.length || 0\n const allActiveReleaseCount = allActiveReleases?.length || 0\n\n // scheduled drafts and content releases contribute towards reaching the dataset limit\n const isCurrentDatasetAtAboveDatasetLimit = allActiveReleaseCount >= datasetReleaseLimit\n\n // only metered content releases contribute towards reaching the org limit\n const isCurrentDatasetAtAboveOrgLimit =\n orgActiveReleaseLimit !== null && meteredActiveReleaseCount >= orgActiveReleaseLimit\n const isOrgAtAboveOrgLimit =\n orgActiveReleaseLimit !== null && orgMeteredActiveReleaseCount >= orgActiveReleaseLimit\n\n const shouldShowDialog =\n isCurrentDatasetAtAboveDatasetLimit ||\n isCurrentDatasetAtAboveOrgLimit ||\n isOrgAtAboveOrgLimit\n\n if (shouldShowDialog) {\n whenResolved?.(false)\n return doUpsell()\n }\n\n whenResolved?.(true)\n return cb()\n },\n [\n meteredActiveReleases.length,\n handleOpenDialog,\n allActiveReleases.length,\n mode,\n releaseLimits$,\n orgActiveReleaseCount$,\n ],\n )\n\n const onReleaseLimitReached = useCallback(\n (limit: number) => {\n setReleaseLimit(limit)\n handleOpenDialog()\n },\n [handleOpenDialog],\n )\n\n const ctxValue = useMemo<ReleasesUpsellContextValue>(\n () => ({\n mode,\n upsellDialogOpen,\n guardWithReleaseLimitUpsell,\n onReleaseLimitReached,\n telemetryLogs,\n upsellData,\n handleOpenDialog,\n }),\n [\n mode,\n upsellDialogOpen,\n guardWithReleaseLimitUpsell,\n onReleaseLimitReached,\n telemetryLogs,\n upsellData,\n handleOpenDialog,\n ],\n )\n\n const interpolation = useMemo(\n () => (releaseLimit === null ? undefined : {releaseLimit: releaseLimit}),\n [releaseLimit],\n )\n\n const dialogProps = useMemo(\n () => ({\n data: upsellData,\n open: upsellDialogOpen,\n interpolation,\n onClose: handleClose,\n onPrimaryClick: handlePrimaryButtonClick,\n onSecondaryClick: handleSecondaryButtonClick,\n }),\n [\n upsellData,\n upsellDialogOpen,\n interpolation,\n handleClose,\n handlePrimaryButtonClick,\n handleSecondaryButtonClick,\n ],\n )\n\n return (\n <ReleasesUpsellContext.Provider value={ctxValue}>\n {props.children}\n {showMisconfigurationDialog ? (\n <ReleaseLimitsMisconfigurationDialog onClose={() => setShowMisconfigurationDialog(false)} />\n ) : (\n <UpsellDialog {...dialogProps} />\n )}\n </ReleasesUpsellContext.Provider>\n )\n}\n","import {type LayoutProps} from '../../config'\nimport {useReleasesToolAvailable} from '../../schedules/hooks/useReleasesToolAvailable'\nimport {ReleasesMetadataProvider} from '../contexts/ReleasesMetadataProvider'\nimport {ReleasesUpsellProvider} from '../contexts/upsell/ReleasesUpsellProvider'\n\nexport function ReleasesStudioLayout(props: LayoutProps) {\n const releasesToolAvailable = useReleasesToolAvailable()\n\n if (!releasesToolAvailable) {\n return props.renderDefault(props)\n }\n\n return (\n <ReleasesUpsellProvider>\n <ReleasesMetadataProvider>{props.renderDefault(props)}</ReleasesMetadataProvider>\n </ReleasesUpsellProvider>\n )\n}\n"],"names":["ReleaseLimitsMisconfigurationDialog","props","$","_c","onClose","t","useTranslation","t0","window","open","handleContactSupport","t1","t2","t3","confirmButton","text","onClick","tone","t4","t5","t6","isErrorAtLimits","error","statusCode","response","body","fetchReleaseLimits","client","storeOrigin","projectId","config","withConfig","apiVersion","observable","request","uri","tag","pipe","catchError","console","of","map","data","STATE_TTL_MS","ORG_ACTIVE_RELEASE_COUNT_RESOURCE_CACHE_NAMESPACE","createOrgActiveReleaseCountStore","activeReleasesCount","latestFetchState","BehaviorSubject","staleFlag$","activeReleaseCountAtFetch","orgActiveReleaseCount$","switchMap","state","getValue","next","tap","orgMeteredActiveReleaseCount","nextState","timer","subscribe","useOrgActiveReleaseCount","resourceCache","useResourceCache","activeReleases","useActiveReleases","for","useClient","length","count","releaseLimitsStore","get","dependencies","namespace","set","value","RELEASE_LIMITS_RESOURCE_CACHE_NAMESPACE","createReleaseLimitsStore","releaseLimits$","datasetReleaseLimit","orgActiveReleaseLimit","shareReplay","useReleaseLimits","StudioReleaseLimitExceededError","Error","constructor","name","details","type","ReleasesUpsellProvider","upsellDialogOpen","setUpsellDialogOpen","useState","allActiveReleases","enabled","isReleasesFeatureEnabled","useFeatureEnabled","FEATURES","contentReleases","dataUri","feature","upsellData","telemetryLogs","hasError","useUpsellData","toast","useToast","filter","_temp","meteredActiveReleases","bb0","mode","dialogPrimaryClicked","handlePrimaryButtonClick","dialogSecondaryClicked","handleSecondaryButtonClick","dialogDismissed","handleClose","releaseLimit","setReleaseLimit","showMisconfigurationDialog","setShowMisconfigurationDialog","t7","source","undefined","push","status","title","closable","dialogViewed","handleOpenDialog","cb","t8","whenResolved","throwError","doUpsell","result","Promise","all","firstValueFrom","limit","t9","e","releaseLimits","meteredActiveReleaseCount","isCurrentDatasetAtAboveDatasetLimit","isCurrentDatasetAtAboveOrgLimit","isOrgAtAboveOrgLimit","guardWithReleaseLimitUpsell","limit_0","onReleaseLimitReached","ctxValue","t10","interpolation","t11","onPrimaryClick","onSecondaryClick","dialogProps","t12","t13","children","release","isCardinalityOneRelease","ReleasesStudioLayout","useReleasesToolAvailable","renderDefault"],"mappings":"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"}
@@ -82,6 +82,7 @@ import "date-fns/getMinutes";
82
82
  import "date-fns/parseISO";
83
83
  import "date-fns/setMinutes";
84
84
  import "react-fast-compare";
85
+ import "clsx";
85
86
  import "@sanity/icons/EarthAmericas";
86
87
  import "lodash-es/noop.js";
87
88
  import "@sanity/icons/Search";