sanity 6.5.0 → 6.5.1-next.10

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 (47) hide show
  1. package/lib/_chunks-dts/ActiveWorkspaceMatcherContext.d.ts +2 -1
  2. package/lib/_chunks-es/CommentsInspector.js +4 -2
  3. package/lib/_chunks-es/CommentsInspector.js.map +1 -1
  4. package/lib/_chunks-es/ReleasesStudioLayout.js +6 -4
  5. package/lib/_chunks-es/ReleasesStudioLayout.js.map +1 -1
  6. package/lib/_chunks-es/ReleasesTool.js +4 -2
  7. package/lib/_chunks-es/ReleasesTool.js.map +1 -1
  8. package/lib/_chunks-es/TasksDocumentInputLayout.js +6 -4
  9. package/lib/_chunks-es/TasksDocumentInputLayout.js.map +1 -1
  10. package/lib/_chunks-es/TasksFooterOpenTasks.js +4 -2
  11. package/lib/_chunks-es/TasksFooterOpenTasks.js.map +1 -1
  12. package/lib/_chunks-es/TasksStudioActiveToolLayout.js +5 -3
  13. package/lib/_chunks-es/TasksStudioActiveToolLayout.js.map +1 -1
  14. package/lib/_chunks-es/TasksStudioLayout.js +5 -3
  15. package/lib/_chunks-es/TasksStudioLayout.js.map +1 -1
  16. package/lib/_chunks-es/TasksStudioNavbar.js +4 -2
  17. package/lib/_chunks-es/TasksStudioNavbar.js.map +1 -1
  18. package/lib/_chunks-es/VariantsStudioNavbar.js +4 -2
  19. package/lib/_chunks-es/VariantsStudioNavbar.js.map +1 -1
  20. package/lib/_chunks-es/VariantsTool.js +4 -2
  21. package/lib/_chunks-es/VariantsTool.js.map +1 -1
  22. package/lib/_chunks-es/index2.js +550 -307
  23. package/lib/_chunks-es/index2.js.map +1 -1
  24. package/lib/_chunks-es/index3.js +4 -2
  25. package/lib/_chunks-es/index3.js.map +1 -1
  26. package/lib/_chunks-es/index6.js +4 -2
  27. package/lib/_chunks-es/index6.js.map +1 -1
  28. package/lib/_chunks-es/index7.js +6 -4
  29. package/lib/_chunks-es/index7.js.map +1 -1
  30. package/lib/_chunks-es/index8.js +5 -3
  31. package/lib/_chunks-es/index8.js.map +1 -1
  32. package/lib/_chunks-es/resources2.js +4 -2
  33. package/lib/_chunks-es/resources2.js.map +1 -1
  34. package/lib/_chunks-es/resources3.js +4 -2
  35. package/lib/_chunks-es/resources3.js.map +1 -1
  36. package/lib/_chunks-es/resources4.js +4 -2
  37. package/lib/_chunks-es/resources4.js.map +1 -1
  38. package/lib/_chunks-es/resources5.js +4 -2
  39. package/lib/_chunks-es/resources5.js.map +1 -1
  40. package/lib/_chunks-es/resources6.js +4 -2
  41. package/lib/_chunks-es/resources6.js.map +1 -1
  42. package/lib/_chunks-es/resources7.js +4 -2
  43. package/lib/_chunks-es/resources7.js.map +1 -1
  44. package/lib/_chunks-es/structureTool.js +18 -15
  45. package/lib/_chunks-es/structureTool.js.map +1 -1
  46. package/lib/_chunks-es/version.js +2 -2
  47. package/package.json +16 -17
@@ -1,4 +1,4 @@
1
- import { CSSProperties, Component, ComponentProps, ComponentType, Dispatch, ElementType, ErrorInfo, FC, FocusEvent, FocusEventHandler, FormEvent, FormEventHandler, HTMLAttributes, HTMLProps, KeyboardEvent, MutableRefObject, PropsWithChildren, PureComponent, ReactElement, ReactNode, Ref, RefAttributes, RefObject, SVGProps, SetStateAction } from "react";
1
+ import { CSSProperties, ClipboardEventHandler, Component, ComponentProps, ComponentType, Dispatch, ElementType, ErrorInfo, FC, FocusEvent, FocusEventHandler, FormEvent, FormEventHandler, HTMLAttributes, HTMLProps, KeyboardEvent, MutableRefObject, PropsWithChildren, PureComponent, ReactElement, ReactNode, Ref, RefAttributes, RefObject, SVGProps, SetStateAction } from "react";
2
2
  import { ArraySchemaType, AssetMetadataType, AssetSource, AssetSourceSpec, BlockDecoratorDefinition, BlockListDefinition, BlockStyleDefinition, BooleanSchemaType, ConditionalProperty, CrossDatasetReferenceSchemaType, CrossDatasetReferenceValue, CrossDatasetType, CurrentUser, DeprecatedProperty, DocumentSystem, FieldGroup, File as File$1, FileAsset, FileSchemaType, FileValue, FormNodeValidation, GeopointValue, GlobalDocumentReferenceType, I18nTextRecord, Image, ImageAsset, ImageSchemaType, ImageUrlFitMode, ImageValue, IndexTuple, InitialValueProperty, InitialValueResolverContext, IntrinsicTypeName, KeyedObject, KeyedSegment, MendozaEffectPair, NumberSchemaType, ObjectField, ObjectFieldType, ObjectSchemaType, PatchOperations, Path, PathSegment, PortableTextBlock, PortableTextObject, PortableTextTextBlock, PrepareViewOptions, PreviewValue, Reference, ReferenceSchemaType, ReferenceValue, Role, RuleClass, SanityDocument, SanityDocumentLike, Schema, SchemaType, SchemaTypeDefinition, SearchStrategy, SlugSchemaType, SlugValue, SortOrdering, StrictVersionLayeringOptions, StringSchemaType, TextSchemaType, TransactionLogEventWithEffects, TransactionLogEventWithMutations, UploadState, User, ValidationMarker } from "@sanity/types";
3
3
  import { BifurClient } from "@sanity/bifur-client";
4
4
  import { ClientConfig, ClientError, ClientPerspective, QueryParams, ReconnectEvent, ReleaseDocument, ReleaseDocument as ReleaseDocument$1, ReleaseType, RequestHandler, ResetEvent, SanityClient, SanityDocument as SanityDocument$1, SingleActionResult, SingleMutationResult, StackablePerspective, WelcomeBackEvent, WelcomeEvent } from "@sanity/client";
@@ -12563,6 +12563,7 @@ interface PrimitiveInputElementProps {
12563
12563
  'onChange': FormEventHandler;
12564
12564
  'onFocus': FocusEventHandler;
12565
12565
  'onBlur': FocusEventHandler;
12566
+ 'onPaste'?: ClipboardEventHandler;
12566
12567
  'ref': MutableRefObject<any>;
12567
12568
  'aria-describedby': string | undefined;
12568
12569
  'style': Pick<CSSProperties$1, 'anchorName'>;
@@ -108,16 +108,18 @@ import "observable-callback";
108
108
  import "@sanity/util/content";
109
109
  import "@sanity/icons/BulbOutline";
110
110
  import "@sanity/icons/Unknown";
111
+ import "@sanity/client/stega";
111
112
  import "@sanity/icons/ToggleArrowRight";
112
113
  import "lodash-es/isPlainObject.js";
113
- import "@sanity/insert-menu";
114
+ import "@sanity/icons/ThLarge";
115
+ import "@sanity/icons/Ulist";
116
+ import "lodash-es/startCase.js";
114
117
  import "@dnd-kit/sortable";
115
118
  import "@sanity/icons/DragHandle";
116
119
  import "@sanity/icons/AddDocument";
117
120
  import "@sanity/icons/InsertAbove";
118
121
  import "@sanity/icons/InsertBelow";
119
122
  import "@tanstack/react-virtual";
120
- import "lodash-es/startCase.js";
121
123
  import "speakingurl";
122
124
  import "@sanity/icons/Reset";
123
125
  import "@sanity/icons/Sync";
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAWO,SAAAA,oBAAAC,OAAA;AAAA,QAAAC,IAAAC,EAAA,CAAA,GACL;AAAA,IAAAC;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,EAAAA,IAAiDL;AAAK,MAAAM;AAAA,SAAAL,EAAA,CAAA,MAAAE,QAAAF,SAAAG,kBAAAH,EAAA,CAAA,MAAAI,oBAEpDC,yBAAC,aAAiB,UAChB,8BAAC,KAAA,EAAkB,cAAA,GACjB,UAAA,oBAAC,aAAA,EACOH,MACUC,gBACEC,iBAAAA,CAAgB,GAEtC,GACF,GAAYJ,OAAAE,MAAAF,OAAAG,gBAAAH,OAAAI,kBAAAJ,OAAAK,MAAAA,KAAAL,EAAA,CAAA,GARZK;AAQY;ACjBT,SAAAC,wBAAA;AACL,QAAAC,MAAYC,WAAWC,yBAAyB;AAEhD,MAAI,CAACF;AACH,UAAM,IAAIG,MAAM,8CAA8C;AAC/D,SAEMH;AAAG;ACPL,SAAAI,uBAAAN,IAAA;AAAA,QAAAL,IAAAC,EAAA,CAAA,GAAgC;AAAA,IAAAW;AAAAA,EAAAA,IAAAP,IACrC;AAAA,IAAAQ;AAAAA,EAAAA,IAAYC,eAAeC,uBAAuB;AAAC,MAAAC;AAAAhB,WAAAa,KAOxCG,KAAAH,EAAE,uBAAuB,GAACb,OAAAa,GAAAb,OAAAgB,MAAAA,KAAAhB,EAAA,CAAA;AAAA,MAAAiB;AAAAjB,WAAAgB,MAD7BC,yBAAC,MAAA,EAAW,SAAU,QAAA,UACnBD,cACH,GAAOhB,OAAAgB,IAAAhB,OAAAiB,MAAAA,KAAAjB,EAAA,CAAA;AAAA,MAAAkB;AAAAlB,IAAA,CAAA,MAAAY,MAAAO,WACPD,yBAAC,MAAA,EAAW,MAAA,GAAG,WACZN,UAAAA,MAAKO,SACR,GAAOnB,EAAA,CAAA,IAAAY,MAAAO,SAAAnB,OAAAkB,MAAAA,KAAAlB,EAAA,CAAA;AAAA,MAAAoB;AAAA,SAAApB,EAAA,CAAA,MAAAiB,MAAAjB,SAAAkB,MARbE,KAAA,oBAAC,KAAA,EAAa,YACZ,UAAA,oBAAC,MAAA,EAAe,aAAa,UAAA,GAAQ,MAAA,YAAW,QAAA,IAAe,QAAA,GAC7D,UAAA,qBAAC,OAAA,EAAa,OAAA,GACZH,UAAAA;AAAAA,IAAAA;AAAAA,IAGAC;AAAAA,EAAAA,EAAAA,CAGF,GACF,GACF,GAAMlB,OAAAiB,IAAAjB,OAAAkB,IAAAlB,OAAAoB,MAAAA,KAAApB,EAAA,CAAA,GAXNoB;AAWM;ACRV,MAAMC,OAAOC,uBAAOC,IAAI,EAACC,WAAA;AAAA,EAAAC,aAAA;AAAA,EAAAC,aAAA;AAAA,CAAA,EAAC;AAAA,EACxBC,UAAU;AAAA,EACVC,QAAQ;AAAA,EACRC,YAAY;AACd,CAAC,GASYC,0BAA0BC,WAAW,SAAAhC,OAAAiC,KAAA;AAAA,QAAAhC,IAAAC,EAAA,EAAA,GAIhD;AAAA,IAAAY;AAAAA,EAAAA,IAAYC,eAAeC,uBAAuB,GAClD;AAAA,IAAAkB;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,EAAAA,IAA4CrC;AAAK,MAAAM;AAAAL,WAAAkC,gBAEX7B,KAAAA,MAAM6B,aAAa,MAAM,GAAClC,OAAAkC,cAAAlC,OAAAK,MAAAA,KAAAL,EAAA,CAAA;AAAhE,QAAAqC,oBAA0BhC;AAAuD,MAAAW;AAAAhB,WAAAkC,gBACvClB,KAAAA,MAAMkB,aAAa,UAAU,GAAClC,OAAAkC,cAAAlC,OAAAgB,MAAAA,KAAAhB,EAAA,CAAA;AAAxE,QAAAsC,wBAA8BtB;AAA2D,MAAAC;AAAAjB,WAAAa,KAO9EI,KAAAJ,EAAE,cAAc,GAACb,OAAAa,GAAAb,OAAAiB,MAAAA,KAAAjB,EAAA,CAAA;AAAA,MAAAkB;AAAAlB,WAAAiB,MAFtBC,yBAAC,MAAA,EAAW,OAAA,UAAe,MAAA,GAAQ,QAAa,UAAA,GAAY,SAAA,GAC1D,UAAA,oBAAC,MAAA,EAAQ,IAAA,MAAW,SAAU,QAAA,UAC3BD,UAAAA,GAAAA,CACH,GACF,GAAOjB,OAAAiB,IAAAjB,OAAAkB,MAAAA,KAAAlB,EAAA,CAAA;AAAA,MAAAoB;AAAApB,IAAA,CAAA,MAAAa,KAAAb,SAAAmC,QAQGf,KACIP,EADJsB,SAAS,SACH,8BACA,+BAA+B,GAACnC,OAAAa,GAAAb,OAAAmC,MAAAnC,QAAAoB,MAAAA,KAAApB,EAAA,EAAA;AAAA,MAAAuC;AAAAvC,YAAAoB,MAJ1CmB,yBAAC,QAAA,EAEG,MAAAnB,IAIG,MAAA,SACMoB,WAAAA,iBAAe,GAC1BxC,QAAAoB,IAAApB,QAAAuC,MAAAA,KAAAvC,EAAA,EAAA;AAAA,MAAAyC;AAAAzC,IAAA,EAAA,6BAAA0C,IAAA,2BAAA,KAGWD,KAAA;AAAA,IAAAE,OAAQ;AAAA,EAAA,GAAQ3C,QAAAyC,MAAAA,KAAAzC,EAAA,EAAA;AAEd,QAAA4C,KAAAT,SAAS,SAATU,gBAAAC;AAA2C,MAAAC;AAAA/C,YAAAa,KAEhDkC,KAAAlC,EAAE,gCAAgC,GAACb,QAAAa,GAAAb,QAAA+C,MAAAA,KAAA/C,EAAA,EAAA;AAAA,MAAAgD;AAAAhD,IAAA,EAAA,MAAAqC,qBAAArC,UAAA4C,MAAA5C,EAAA,EAAA,MAAA+C,MAH3CC,yBAAC,YACY,WAAAJ,IACFP,SAAAA,mBACH,MAAAU,IAAmC,GACzC/C,QAAAqC,mBAAArC,QAAA4C,IAAA5C,QAAA+C,IAAA/C,QAAAgD,MAAAA,KAAAhD,EAAA,EAAA;AAEW,QAAAiD,MAAAd,SAAS,aAATU,gBAAAC;AAA+C,MAAAI;AAAAlD,YAAAa,KAEpDqC,MAAArC,EAAE,oCAAoC,GAACb,QAAAa,GAAAb,QAAAkD,OAAAA,MAAAlD,EAAA,EAAA;AAAA,MAAAmD;AAAAnD,IAAA,EAAA,MAAAoC,QAAApC,UAAAa,KAE3CsC,MAAAf,SAAS,WAAT;AAAA,IAAAgB,SACcvC,EAAE,2CAA2C;AAAA,EAAA,IAD3DiC,QAEa9C,QAAAoC,MAAApC,QAAAa,GAAAb,QAAAmD,OAAAA,MAAAnD,EAAA,EAAA;AAEL,QAAAqD,MAAAjB,SAAS;AAAQ,MAAAkB;AAAAtD,IAAA,EAAA,MAAAsC,yBAAAtC,EAAA,EAAA,MAAAiD,OAAAjD,EAAA,EAAA,MAAAkD,OAAAlD,EAAA,EAAA,MAAAmD,OAAAnD,UAAAqD,OAT7BC,MAAA,oBAAC,UAAA,EACY,WAAAL,KACFX,SAAAA,uBACH,MAAAY,KAEJ,cAAAC,KAIQ,UAAAE,IAAAA,CAAiB,GAC3BrD,QAAAsC,uBAAAtC,QAAAiD,KAAAjD,QAAAkD,KAAAlD,QAAAmD,KAAAnD,QAAAqD,KAAArD,QAAAsD,OAAAA,MAAAtD,EAAA,EAAA;AAAA,MAAAuD;AAAAvD,IAAA,EAAA,MAAAsD,OAAAtD,UAAAgD,MAhBJO,2BAAC,MAAA,EAAY,OAAAd,IACXO,UAAAA;AAAAA,IAAAA;AAAAA,IAKAM;AAAAA,EAAAA,EAAAA,CAWF,GAAOtD,QAAAsD,KAAAtD,QAAAgD,IAAAhD,QAAAuD,OAAAA,MAAAvD,EAAA,EAAA;AAAA,MAAAwD;AAAAxD,IAAA,EAAA,6BAAA0C,IAAA,2BAAA,KAEAc,MAAA;AAAA,IAAAC,WAAY;AAAA,EAAA,GAAazD,QAAAwD,OAAAA,MAAAxD,EAAA,EAAA;AAAA,MAAA0D;AAAA1D,IAAA,EAAA,MAAAuD,OAAAvD,UAAAuC,MAjCpCmB,0BAAC,YAAA,EACI,IAAA,8BAED,QAAAnB,IAWA,MAAAgB,KAmBO,SAAAC,IAAAA,CAAyB,GAClCxD,QAAAuD,KAAAvD,QAAAuC,IAAAvC,QAAA0D,OAAAA,MAAA1D,EAAA,EAAA;AAAA,MAAA2D;AAAA3D,YAAAa,KAGY8C,MAAA9C,EAAE,mCAAmC,GAACb,QAAAa,GAAAb,QAAA2D,OAAAA,MAAA3D,EAAA,EAAA;AAAA,MAAA4D;AAAA5D,YAAAa,KAI1B+C,MAAA/C,EAAE,wBAAwB,GAACb,QAAAa,GAAAb,QAAA4D,OAAAA,MAAA5D,EAAA,EAAA;AAAA,MAAA6D;AAAA7D,YAAA4D,OAArCC,MAAA;AAAA,IAAAT,SAAUQ;AAAAA,EAAAA,GAA4B5D,QAAA4D,KAAA5D,QAAA6D,OAAAA,MAAA7D,EAAA,EAAA;AAAA,MAAA8D;AAAA9D,IAAA,EAAA,MAAAiC,WAAAjC,UAAA2D,OAAA3D,EAAA,EAAA,MAAA6D,OALtDC,0BAAC,QAAA,EACa,cAAAH,KACNI,MAAAA,WACD,MAAA,SACI9B,SAAAA,SACK,cAAA4B,IAAAA,CAAsC,GACpD7D,QAAAiC,SAAAjC,QAAA2D,KAAA3D,QAAA6D,KAAA7D,QAAA8D,OAAAA,MAAA9D,EAAA,EAAA;AAAA,MAAAgE;AAAAhE,IAAA,EAAA,MAAA0D,OAAA1D,UAAA8D,OA3CJE,MAAA,qBAAC,QAAU,MAAA,QAAgB,SAAA,GAAQ,KAAA,GACjCN,UAAAA;AAAAA,IAAAA;AAAAA,IAoCAI;AAAAA,EAAAA,EAAAA,CAOF,GAAO9D,QAAA0D,KAAA1D,QAAA8D,KAAA9D,QAAAgE,OAAAA,MAAAhE,EAAA,EAAA;AAAA,MAAAiE;AAAAjE,IAAA,EAAA,MAAAgE,OAAAhE,UAAAkB,MAnDT+C,MAAA,qBAAC,MAAA,EAAc,SAAA,GACb/C,UAAAA;AAAAA,IAAAA;AAAAA,IAMA8C;AAAAA,EAAAA,EAAAA,CA6CF,GAAOhE,QAAAgE,KAAAhE,QAAAkB,IAAAlB,QAAAiE,OAAAA,MAAAjE,EAAA,EAAA;AAAA,MAAAkE;AAAA,SAAAlE,EAAA,EAAA,MAAAgC,OAAAhC,UAAAiE,OArDTC,MAAA,oBAAC,MAAA,EAAUlC,KACTiC,UAAAA,IAAAA,CAqDF,GAAOjE,QAAAgC,KAAAhC,QAAAiE,KAAAjE,QAAAkE,OAAAA,MAAAlE,EAAA,EAAA,GAtDPkE;AAsDO,CAEV,GClDKC,YAAY7C,uBAAO8C,KAAK,EAAC5C,WAAA;AAAA,EAAAC,aAAA;AAAA,EAAAC,aAAA;AAAA,CAAA,EAAA,CAAA,iEAAA,CAAA;AAOxB,SAAA2C,kBAAAtE,OAAA;AAAA,QAAAC,IAAAC,EAAA,CAAA,GACL;AAAA,IAAAqE;AAAAA,IAAAlC;AAAAA,EAAAA,IAAwBmC,mBAAAA;AAExB,MAAI,CAACD;AAAO,WAAS;AAAI,MAAAjE;AAAA,SAAAL,EAAA,CAAA,MAAAoC,QAAApC,SAAAD,SAMvBM,KAAA,oBAAC,WAAA,EACC,UAAA,oBAAC,wBAAA,EAAsB,GAAKN,OAAaqC,KAAAA,CAAI,EAAA,CAC/C,GAAYpC,OAAAoC,MAAApC,OAAAD,OAAAC,OAAAK,MAAAA,KAAAL,EAAA,CAAA,GAFZK;AAEY;AAIhB,SAAAmE,uBAAAzE,OAAA;AAAA,QAAAC,IAAAC,EAAA,GAAA,GAKE;AAAA,IAAAY;AAAAA,EAAAA,IAAYC,eAAeC,uBAAuB,GAClD;AAAA,IAAAkB;AAAAA,IAAAG;AAAAA,EAAAA,IAAwBrC,OACxB,CAAA0E,kBAAAC,mBAAA,IAAgDC,SAAkB,EAAK,GACvE,CAAAC,iBAAAC,kBAAA,IAA8CF,SAAiC,IAAI,GACnF,CAAAG,eAAAC,gBAAA,IAA0CJ,SAAkB,EAAK,GACjE,CAAAK,aAAAC,cAAA,IAAsCN,SAAuB,IAAI,GAEjEO,UAAgBC,OAA8B,IAAI,GAClD,CAAAC,aAAAC,cAAA,IAAsCV,SAAgC,IAAI,GAE1EW,cAAoBC,kBACpB;AAAA,IAAAC;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,EAAAA,IAYIC,YAAAA,GACJC,oBAA0BjB,OAA2BY,iBAAiB,GACtE;AAAA,IAAAnF,OAAAyF;AAAAA,EAAAA,IAAmCC,gBAAAA,GACnCC,8BAAoCpB,OAAgB,EAAK,GAEzDqB,YAAkBC,SAAAA,EAAUC,MAC5B;AAAA,IAAAC;AAAAA,EAAAA,IAAqBC,SAAAA;AAAU,MAAAvG;AAAAL,WAAAoF,eAEmD/E,KAAA;AAAA,IAAAwG,iBAC/DzB;AAAAA,EAAAA,GAClBpF,OAAAoF,aAAApF,OAAAK,MAAAA,KAAAL,EAAA,CAAA;AAFD,QAAA;AAAA,IAAA8G;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,EAAAA,IAAgEC,kBAAkB5G,EAEjF,GACD;AAAA,IAAA6G;AAAAA,IAAAC;AAAAA,EAAAA,IAAwCC,2BACxC;AAAA,IAAAC;AAAAA,IAAAC;AAAAA,EAAAA,IAAoChH,sBAAAA,GACpCiH,YAAkBC,wBAElB;AAAA,IAAAC;AAAAA,IAAAC,eAAAC;AAAAA,EAAAA,IAAyDC,kBAAAA,GAEzDC,kBAAsCrC,SAAQtF,KAAM2F,MAAM,GAE1D;AAAA,IAAAiC;AAAAA,EAAAA,IAAkBtC;AAAQ,MAAAxE;AAAAhB,IAAA,CAAA,MAAAmH,mBAAAnH,SAAA4F,aAAA5F,EAAA,CAAA,MAAAuH,aAGxBvG,KAAA+G,CAAAA,aAAA;AACEnC,cAAUmC,QAAQ,GAClBZ,gBAAgB,IAAI,GAEpBI,UAASS,uBAAwBD,QAAQ;AAAA,EAAC,GAC3C/H,OAAAmH,iBAAAnH,OAAA4F,WAAA5F,OAAAuH,WAAAvH,OAAAgB,MAAAA,KAAAhB,EAAA,CAAA;AANH,QAAAiI,mBAAyBjH;AAQxB,MAAAC;AAAAjB,IAAA,CAAA,MAAAiC,WAAAjC,SAAAmH,mBAEwClG,KAAAA,MAAA;AACvCgB,YAAAA,GACAkF,gBAAgB,IAAI;AAAA,EAAC,GACtBnH,OAAAiC,SAAAjC,OAAAmH,iBAAAnH,OAAAiB,MAAAA,KAAAjB,EAAA,CAAA;AAHD,QAAAkI,uBAA6BjH;AAGC,MAAAC;AAAAiH,OAAA;AAG5B,QAAI,CAACnC,gBAAc;AAAE9E,WAAO4B;AAAP,YAAAqF;AAAAA,IAAgB;AAAA,QAAA/G;AAAApB,MAAA,CAAA,MAAAgG,kBAAAhG,EAAA,EAAA,MAAAwG,aAAAxG,EAAA,EAAA,MAAAa,KAAAb,UAAAuH,aAEpBnG,MAAAgH,CAAAA,OAAA;AACfC,gBAASC,UAAUC,UAAWvC,eAAeoC,EAAE,CAAC,EAACI,MAAO,MAAA;AACtDhC,kBAAU;AAAA,UAAAiC,UACE;AAAA,UAAI5C,QACN;AAAA,UAAO6C,OACR7H,EAAE,yBAAyB;AAAA,QAAA,CACnC;AAAA,MAAC,CACH,GAED0G,UAASoB,kBAAAA;AAAAA,IAAoB,GAC9B3I,OAAAgG,gBAAAhG,QAAAwG,WAAAxG,QAAAa,GAAAb,QAAAuH,WAAAvH,QAAAoB,OAAAA,MAAApB,EAAA,EAAA,GAEDkB,KAZiBE;AAAAA,EAYF;AAfjB,QAAAwH,iBAAuB1H;AAgBsB,MAAAE;AAAApB,IAAA,EAAA,MAAAyF,cAAAzF,UAAA8F,aAG3C1E,KAAAyH,CAAAA,SAAA;AACE,UAAAC,UAAgBrD,WAAW2C,IAAE;AACxBU,eAEAhD,UAASiD,OAAQ;AAAA,MAAAC,MACd;AAAA,MAAOC,WACFH,QAAOI,OAAOC,MAAYC,SAA1B;AAAA,MAAgChB,IACvCU,QAAOO;AAAAA,MAAIlI,SACN2H,QAAO3H;AAAAA,MAAQmI,iBACPR,QAAOQ;AAAAA,MAAgBC,WAC7BT,QAAOS,aAAP,CAAA;AAAA,MAAuB1D,QAC1BiD,QAAOjD;AAAAA,MAAO2D,UACZV,QAAOU;AAAAA,IAAAA,CAClB;AAAA,EAAC,GACHxJ,QAAAyF,YAAAzF,QAAA8F,WAAA9F,QAAAoB,MAAAA,KAAApB,EAAA,EAAA;AAfH,QAAAyJ,oBAA0BrI;AAiBzB,MAAAmB;AAAAvC,YAAA8E,iBAEqCvC,KAAAA,MAAA;AAChCuC,sBACJJ,oBAAoB,EAAK,GACzBG,mBAAmB,IAAI;AAAA,EAAC,GACzB7E,QAAA8E,eAAA9E,QAAAuC,MAAAA,KAAAvC,EAAA,EAAA;AAJD,QAAA0J,oBAA0BnH;AAIP,MAAAE;AAAAzC,YAAAwF,SAAAtF,KAAAyJ,QAAA3J,EAAA,EAAA,MAAAkG,cAAAlG,EAAA,EAAA,MAAA+G,iBAAA/G,UAAAgH,yBAAAhH,EAAA,EAAA,MAAAmH,mBAGjB1E,KAAAmH,CAAAA,aAAA;AAGE,QAFAzC,gBAAgByC,QAAQ,GAEpBA,UAAQX,WAAW;AACrB,YAAAE,OAAaU,UAASC,WAAYF,SAAQX,SAAU;AACpD/C,mBAAaiD,IAAI,GAEjBpC,cAAc6C,SAAQX,SAAU,GAERzD,SAAQtF,KAAKyJ,KAAKI,OAChCC,CAAAA,OAAOA,GAACR,aAAcI,UAAQJ,QAAU,EAACS,KAC3CC,KAA8C,KAE/BN,SAAQJ,YAC7BxC,sBAAsB4C,SAAQJ,QAAS;AAAA,IACxC;AAAA,EACF,GACFxJ,EAAA,EAAA,IAAAwF,SAAAtF,KAAAyJ,MAAA3J,QAAAkG,YAAAlG,QAAA+G,eAAA/G,QAAAgH,uBAAAhH,QAAAmH,iBAAAnH,QAAAyC,MAAAA,KAAAzC,EAAA,EAAA;AAlBH,QAAAmK,mBAAyB1H;AAoBxB,MAAAG;AAAA5C,IAAA,EAAA,MAAA8F,aAAA9F,UAAAmH,mBAGCvE,KAAAwH,CAAAA,gBAAA;AACE,UAAAnB,YAAkBmB,aAAWC,SAAoBpB,aAA/B;AAEbnD,cAASiD,OAAQ;AAAA,MAAAC,MACd;AAAA,MAAOC;AAAAA,MAAA9H,SAEJiJ,YAAWjJ;AAAAA,MAAQmI,iBACXc,YAAWd;AAAAA,MAAgBC,WACjCa,YAAWb;AAAAA,MAAU1D,QACxBuE,YAAWvE;AAAAA,MAAO2D,UAChBY,YAAWZ;AAAAA,IAAAA,CACtB,GAEDrC,gBAAgB;AAAA,MAAA8B;AAAAA,MAAAqB,QAEN;AAAA,MAAWd,UACTY,YAAWZ;AAAAA,IAAAA,CACtB;AAAA,EAAC,GACHxJ,QAAA8F,WAAA9F,QAAAmH,iBAAAnH,QAAA4C,MAAAA,KAAA5C,EAAA,EAAA;AAnBH,QAAAuK,wBAA8B3H;AAqB7B,MAAAG;AAAA/C,YAAA8F,aAGC/C,KAAAyH,CAAAA,kBAAA;AACO1E,cAASiD,OAAQ;AAAA,MAAA,GACjBqB;AAAAA,MAAWpB,MACR;AAAA,MAAOC,WACFmB,eAAWC,SAAoBpB,aAA/B;AAAA,IAAA,CACZ;AAAA,EAAC,GACHjJ,QAAA8F,WAAA9F,QAAA+C,MAAAA,KAAA/C,EAAA,EAAA;AAPH,QAAAyK,cAAoB1H;AASnB,MAAAC;AAAAhD,YAAA8F,aAGC9C,KAAAA,CAAA0H,MAAAC,kBAAA;AACO7E,cAAS8E,OAAQxC,MAAIgC,aAAW;AAAA,EAAC,GACvCpK,QAAA8F,WAAA9F,QAAAgD,MAAAA,KAAAhD,EAAA,EAAA;AAHH,QAAA6K,aAAmB7H;AAKlB,MAAAC;AAAAjD,YAAA6H,mBAGC5E,MAAA6H,CAAAA,SAAA;AACE,UAAAC,SAAelD,gBAAemD,KAAMC,CAAAA,QAAOjB,IAACkB,eAAmB7B,QAAKjB,IAAE,GACtE+C,WAAiBC,CAAAA,EAAQL,UAAUA,QAAMM,SAAiBC,SAAG;AAE7D5G,wBAAoB,EAAI,GACxBG,mBAAmB;AAAA,MAAA0G,WACNnD;AAAAA,MAAE+C;AAAAA,IAAAA,CAEd;AAAA,EAAC,GACHnL,QAAA6H,iBAAA7H,QAAAiD,OAAAA,MAAAjD,EAAA,EAAA;AAVH,QAAAwL,gBAAsBvI;AAarB,MAAAC;AAAAlD,IAAA,EAAA,MAAA0J,qBAAA1J,UAAA8F,aAGC5C,aAAAuI,SAAA;AACE,QAAA;AACE1G,uBAAiB,EAAI,GACrB,MAAMe,UAAS4F,OAAQtD,IAAE,GACzBsB,kBAAAA;AAAAA,IAAmB,SAAAvG,MAAA;AAEnB8B,qBADO0G,IACW;AAAA,IAAC;AAErB5G,qBAAiB,EAAK;AAAA,EAAC,GACxB/E,QAAA0J,mBAAA1J,QAAA8F,WAAA9F,QAAAkD,OAAAA,MAAAlD,EAAA,EAAA;AAVH,QAAA4L,sBAA4B1I;AAY3B,MAAAC;AAAAnD,IAAA,EAAA,MAAAyF,cAAAzF,EAAA,EAAA,MAAA8F,aAAA9F,EAAA,EAAA,MAAA8G,mBAAA9G,EAAA,EAAA,MAAAmH,mBAAAnH,UAAA4F,aAGCzC,MAAAA,CAAA0I,MAAAC,eAAA;AAOE,QANKhG,UAAS8E,OAAQxC,MAAI;AAAA,MAAAvC,QAChBiG;AAAAA,IAAAA,CACT,GAIGA,eAAe,QAAM;AACvBlG,gBAAU,MAAM;AAEhB,YAAAmG,YAAgBtG,WAAW2C,IAAE;AAE7B,UAAI,CAACU;AAAO;AAEZ3B,sBAAgB;AAAA,QAAA8B,WACHH,UAAOI,OAAOC,MAAYC,SAA1B;AAAA,QAAkCkB,QACrC;AAAA,QAAWd,UACTV,UAAOU,YAAP;AAAA,MAAA,CACX,GAED1C,gBAAgBsB,IAAE;AAAA,IAAC;AAAA,EACpB,GACFpI,QAAAyF,YAAAzF,QAAA8F,WAAA9F,QAAA8G,iBAAA9G,QAAAmH,iBAAAnH,QAAA4F,WAAA5F,QAAAmD,OAAAA,MAAAnD,EAAA,EAAA;AAvBH,QAAAgM,qBAA2B7I;AAyB1B,MAAAE;AAAArD,YAAA8F,aAGCzC,MAAAA,CAAA4I,MAAAC,aAAA;AACOpG,cAASqG,MAAO/D,MAAI8D,QAAQ;AAAA,EAAC,GACnClM,QAAA8F,WAAA9F,QAAAqD,OAAAA,MAAArD,EAAA,EAAA;AAHH,QAAAoM,uBAA6B/I;AAK5B,MAAAC;AAAAtD,IAAA,EAAA,MAAA2G,cAAA3G,UAAAkH,gBAAAlH,EAAA,EAAA,MAAAmH,mBAEsC7D,MAAAA,MAAA;AAKjC4D,oBAAAP,cACFQ,gBAAgB,IAAI;AAAA,EACrB,GACFnH,QAAA2G,YAAA3G,QAAAkH,cAAAlH,QAAAmH,iBAAAnH,QAAAsD,OAAAA,MAAAtD,EAAA,EAAA;AARD,QAAAqM,qBAA2B/I;AAQoB,MAAAC;AAAAvD,IAAA,EAAA,MAAAsM,uBAAA5J,IAAA,2BAAA,KAEhBa,MAAAgJ,CAAAA,YAAA;AAC7BrH,YAAOsH,UAAWD,SAClBlH,eAAekH,OAAO;AAAA,EAAC,GACxBvM,QAAAuD,OAAAA,MAAAvD,EAAA,EAAA;AAHD,QAAAyM,aAAmBlJ;AAGb,MAAAC;AAAAxD,YAAAqM,sBAGJ7I,MAAAkJ,CAAAA,UAAA;AAIIA,UAAKxD,kBAAmByD,eAAeD,MAAKxD,QAAqB0D,aAAC,cAAc,KAGhFP,mBAAAA;AAAAA,EACD,GACFrM,QAAAqM,oBAAArM,QAAAwD,OAAAA,MAAAxD,EAAA,EAAA;AAAA,MAAA0D;AAAA1D,IAAA,EAAA,MAAAsM,uBAAA5J,IAAA,2BAAA,KACDgB,MAAAA,MAAM,CAACwB,QAAOsH,OAAQ,GAACxM,QAAA0D,OAAAA,MAAA1D,EAAA,EAAA,GAXzB6M,qBACErJ,KAUAE,GACF;AAEA,QAAA,CAAAoJ,iBAAAC,kBAAA,IAA8CpI,SAAS,EAAK;AAAC,MAAAhB;AAAA3D,IAAA,EAAA,MAAA8M,mBAAA9M,UAAAoC,QAAApC,EAAA,EAAA,MAAAkH,cAAAoD,UAAAtK,UAAA2H,uBACnDhE,MAAAA,MAAA;AACR,QAAImJ,qBAAmB1K,SAAS;AAEhC2K,aAAAA,mBAAmB,EAAI,GACnB7F,cAAYoD,WAAa,SAC3B3C,oBAAmBqF,YAAa,cAAc,IACrC5G,kBAAiBoG,UAC1B7E,oBAAmBqF,YAAa,MAAM,IAEtCrF,oBAAmBqF,YAAa,iBAAiB,GAE5C,MAAA;AACLrF,4BAAmBsF,eAAAA;AAAAA,MAAiB;AAAA,EACrC,GACFjN,QAAA8M,iBAAA9M,QAAAoC,MAAApC,EAAA,EAAA,IAAAkH,cAAAoD,QAAAtK,QAAA2H,qBAAA3H,QAAA2D,OAAAA,MAAA3D,EAAA,EAAA;AAA0B,QAAA4D,MAAAsD,cAAYoD;AAAQ,MAAAzG;AAAA7D,IAAA,EAAA,MAAA8M,mBAAA9M,EAAA,EAAA,MAAAoC,QAAApC,EAAA,EAAA,MAAA4D,OAAA5D,UAAA2H,uBAA5C9D,MAAA,CAACiJ,iBAAiB1K,MAAMwB,KAAsB+D,mBAAmB,GAAC3H,QAAA8M,iBAAA9M,QAAAoC,MAAApC,QAAA4D,KAAA5D,QAAA2H,qBAAA3H,QAAA6D,OAAAA,MAAA7D,EAAA,EAAA,GAdrEkN,UAAUvJ,KAcPE,GAAkE;AAAC,MAAAC,KAAAE;AAAAhE,IAAA,EAAA,MAAAyF,cAAAzF,EAAA,EAAA,MAAAmK,oBAAAnK,EAAA,EAAA,MAAA8H,WAAA9H,UAAAiG,0BAAAjG,EAAA,EAAA,MAAA8G,mBAAA9G,EAAA,EAAA,MAAA4F,aAAA5F,EAAA,EAAA,MAAAuH,aAG5DzD,MAAAA,MAAA;AAGR,UAAAqJ,oBAA0B1H,WAAWW,kBAAiBoG,WAAjB,EAA+B;AAEhE,KAAC1E,WAADqF,qBAAA,CAAkC5G,4BAA2BiG,YAE/D5G,UAAUuH,kBAAiBtH,UAAjB,MAAkC,GAE5CsE,iBAAiB;AAAA,MAAAlB,WACJkE,kBAAiBjE,OAAOC,MAAYC,SAApC;AAAA,MAA4CkB,QAC/C;AAAA,MAAKd,UACH2D,kBAAiB3D,YAAjB;AAAA,IAAA,CACX,GAGD4D,sBAAsB,MAAA;AACpBtG,sBAAgBqG,kBAAiB9D,GAAI;AAAA,IAAC,CACvC,GAED9C,4BAA2BiG,UAAW,IACtCpG,kBAAiBoG,UAAW1J,QAE5BmD,yBAAAA,GAEAsB,UAAS8F,sBAAAA;AAAAA,EACV,GACArJ,MAAA,CACDyB,YACA0E,kBACArC,SACA7B,wBACAa,iBACAlB,WACA2B,SAAS,GACVvH,QAAAyF,YAAAzF,QAAAmK,kBAAAnK,QAAA8H,SAAA9H,QAAAiG,wBAAAjG,QAAA8G,iBAAA9G,QAAA4F,WAAA5F,QAAAuH,WAAAvH,QAAA8D,KAAA9D,QAAAgE,QAAAF,MAAA9D,EAAA,EAAA,GAAAgE,MAAAhE,EAAA,EAAA,IAnCDkN,UAAUpJ,KA2BPE,GAQF;AAAC,MAAAC;AAAAqJ,OAAA;AAGA,QAAIlL,SAAS,YAATqF,YAA+B;AAAA,UAAAvD;AAAAlE,QAAA,EAAA,MAAAyH,cAAAzH,EAAA,EAAA,MAAA2H,oBAAA4F,uBAAAvN,EAAA,EAAA,MAAA2H,oBAAA6F,yBAE/BtJ,OAAA,oBAAC,qBAAA,EACOuD,MAAAA,YACU,gBAAAE,oBAAmB4F,qBACjB,kBAAA5F,oBAAmB6F,uBAAsB,GAC3DxN,QAAAyH,YAAAzH,EAAA,EAAA,IAAA2H,oBAAA4F,qBAAAvN,EAAA,EAAA,IAAA2H,oBAAA6F,uBAAAxN,QAAAkE,QAAAA,OAAAlE,EAAA,EAAA,GALJiE,MACEC;AADF,YAAAoJ;AAAAA,IAMC;AAGHrJ,UAAO;AAAA,EAAI;AAXb,QAAAwJ,iBAAuBxJ;AAiBrB,MAAAC;AAAAlE,YAAA0J,qBAAA1J,EAAA,EAAA,MAAA4E,mBAAA5E,EAAA,EAAA,MAAAgF,eAAAhF,EAAA,EAAA,MAAA8E,iBAAA9E,UAAA4L,uBAAA5L,EAAA,EAAA,MAAAyE,oBAIGP,MAAAU,mBAAAH,wCACE,qBAAA,EAAmB,GACdG,iBACGI,OAAAA,aACEF,SAAAA,eACA4E,SAAAA,mBACEkC,WAAAA,oBAAAA,CAAmB,GAEjC5L,QAAA0J,mBAAA1J,QAAA4E,iBAAA5E,QAAAgF,aAAAhF,QAAA8E,eAAA9E,QAAA4L,qBAAA5L,QAAAyE,kBAAAzE,QAAAkE,OAAAA,MAAAlE,EAAA,EAAA;AAYS,QAAA0N,OAACrG;AAAW,MAAAsG;AAAA3N,IAAA,EAAA,MAAAiI,oBAAAjI,EAAA,EAAA,MAAAkI,wBAAAlI,EAAA,EAAA,MAAAoC,QAAApC,UAAA6F,UAGlB8H,0BAAC,yBAAA,EACUzF,SAAAA,sBACKD,cAAAA,kBACRpC,MAAAA,QACAzD,MAAI,GACVpC,QAAAiI,kBAAAjI,QAAAkI,sBAAAlI,QAAAoC,MAAApC,QAAA6F,QAAA7F,QAAA2N,OAAAA,MAAA3N,EAAA,EAAA;AAAA,MAAA4N;AAAA5N,IAAA,EAAA,MAAAsH,gBAAAtH,UAAA0N,OAAA1N,EAAA,EAAA,MAAA2N,OAVJC,MAAA,oBAAC,6BACYtG,WAAAA,cACL,MAAAoG,KACI,WAAA,cAEVC,UAAAA,IAAAA,CAMF,GAA4B3N,QAAAsH,cAAAtH,QAAA0N,KAAA1N,QAAA2N,KAAA3N,QAAA4N,OAAAA,MAAA5N,EAAA,EAAA;AAAA,MAAA6N;AAAA7N,YAAAqG,qBAC3BwH,MAAAxH,qBAAqB,oBAAC,0BAA8BA,OAAAA,kBAAAA,CAAiB,GAAIrG,QAAAqG,mBAAArG,QAAA6N,OAAAA,MAAA7N,EAAA,EAAA;AAAA,MAAA8N;AAAA9N,IAAA,EAAA,MAAAyN,kBAAAzN,UAAAwF,SAAA5E,SAAAZ,EAAA,EAAA,MAAA6H,mBAAA7H,UAAAsF,eAAAtF,EAAA,EAAA,MAAA4I,kBAAA5I,EAAA,EAAA,MAAAyJ,qBAAAzJ,EAAA,GAAA,MAAA6K,cAAA7K,EAAA,GAAA,MAAAuK,yBAAAvK,WAAAmK,oBAAAnK,EAAA,GAAA,MAAAoM,wBAAApM,EAAA,GAAA,MAAAyK,eAAAzK,EAAA,GAAA,MAAAgM,sBAAAhM,EAAA,GAAA,MAAA0F,qBAAA1F,WAAA8H,WAAA9H,EAAA,GAAA,MAAA2F,kBAAA3F,EAAA,GAAA,MAAAoC,QAAApC,EAAA,GAAA,MAAAwL,iBAAAxL,EAAA,GAAA,MAAAkH,gBAAAlH,WAAA6F,UACzEiI,MAAAxI,mCACE,cAAA,EACiBmI,gBACN5F,UAAAA,iBACGvC,aACN,OAAAE,SAAQ5E,OACNkH,SACOnC,gBACVvD,MACMwG,YAAAA,gBACGa,kCACL+B,UAAAA,eACFX,QAAAA,YACWN,mBAAAA,uBACLJ,gCACIiC,kBAAAA,sBACT3B,sBACOuB,gBAAAA,oBACNtG,6BACIwB,cACNrB,OAAAA,CAAM,GAEjB7F,QAAAyN,gBAAAzN,EAAA,EAAA,IAAAwF,SAAA5E,OAAAZ,QAAA6H,iBAAA7H,QAAAsF,aAAAtF,QAAA4I,gBAAA5I,QAAAyJ,mBAAAzJ,SAAA6K,YAAA7K,SAAAuK,uBAAAvK,SAAAmK,kBAAAnK,SAAAoM,sBAAApM,SAAAyK,aAAAzK,SAAAgM,oBAAAhM,SAAA0F,mBAAA1F,SAAA8H,SAAA9H,SAAA2F,gBAAA3F,SAAAoC,MAAApC,SAAAwL,eAAAxL,SAAAkH,cAAAlH,SAAA6F,QAAA7F,SAAA8N,OAAAA,MAAA9N,EAAA,GAAA;AAAA,MAAA+N;AAAA/N,IAAA,GAAA,MAAAqM,sBAAArM,EAAA,GAAA,MAAA4N,OAAA5N,EAAA,GAAA,MAAA6N,OAAA7N,WAAA8N,OA3CHC,2BAAC,MAAA,EACW,WAAA,UACJ,MAAA,GACC,QAAA,QACE1B,6BACA,UAAA,UACJI,KAAAA,YAELmB,UAAAA;AAAAA,IAAAA;AAAAA,IAYCC;AAAAA,IACAC;AAAAA,EAAAA,GAuBH,GAAO9N,SAAAqM,oBAAArM,SAAA4N,KAAA5N,SAAA6N,KAAA7N,SAAA8N,KAAA9N,SAAA+N,OAAAA,MAAA/N,EAAA,GAAA;AAAA,MAAAgO;AAAA,SAAAhO,EAAA,GAAA,MAAAkE,OAAAlE,WAAA+N,OAvDTC,MAAA,qBAAC,UAAA,EACE9J,UAAAA;AAAAA,IAAAA;AAAAA,IAUD6J;AAAAA,EAAAA,EAAAA,CA6CF,GAAW/N,SAAAkE,KAAAlE,SAAA+N,KAAA/N,SAAAgO,OAAAA,MAAAhO,EAAA,GAAA,GAxDXgO;AAwDW;AAzYf,SAAA9D,MAAA+D,GAAA;AAAA,SAuHuBC,uBAAuBD,EAAC/C,aAAc;AAAC;"}
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAWO,SAAAA,oBAAAC,OAAA;AAAA,QAAAC,IAAAC,EAAA,CAAA,GACL;AAAA,IAAAC;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,EAAAA,IAAiDL;AAAK,MAAAM;AAAA,SAAAL,EAAA,CAAA,MAAAE,QAAAF,SAAAG,kBAAAH,EAAA,CAAA,MAAAI,oBAEpDC,yBAAC,aAAiB,UAChB,8BAAC,KAAA,EAAkB,cAAA,GACjB,UAAA,oBAAC,aAAA,EACOH,MACUC,gBACEC,iBAAAA,CAAgB,GAEtC,GACF,GAAYJ,OAAAE,MAAAF,OAAAG,gBAAAH,OAAAI,kBAAAJ,OAAAK,MAAAA,KAAAL,EAAA,CAAA,GARZK;AAQY;ACjBT,SAAAC,wBAAA;AACL,QAAAC,MAAYC,WAAWC,yBAAyB;AAEhD,MAAI,CAACF;AACH,UAAM,IAAIG,MAAM,8CAA8C;AAC/D,SAEMH;AAAG;ACPL,SAAAI,uBAAAN,IAAA;AAAA,QAAAL,IAAAC,EAAA,CAAA,GAAgC;AAAA,IAAAW;AAAAA,EAAAA,IAAAP,IACrC;AAAA,IAAAQ;AAAAA,EAAAA,IAAYC,eAAeC,uBAAuB;AAAC,MAAAC;AAAAhB,WAAAa,KAOxCG,KAAAH,EAAE,uBAAuB,GAACb,OAAAa,GAAAb,OAAAgB,MAAAA,KAAAhB,EAAA,CAAA;AAAA,MAAAiB;AAAAjB,WAAAgB,MAD7BC,yBAAC,MAAA,EAAW,SAAU,QAAA,UACnBD,cACH,GAAOhB,OAAAgB,IAAAhB,OAAAiB,MAAAA,KAAAjB,EAAA,CAAA;AAAA,MAAAkB;AAAAlB,IAAA,CAAA,MAAAY,MAAAO,WACPD,yBAAC,MAAA,EAAW,MAAA,GAAG,WACZN,UAAAA,MAAKO,SACR,GAAOnB,EAAA,CAAA,IAAAY,MAAAO,SAAAnB,OAAAkB,MAAAA,KAAAlB,EAAA,CAAA;AAAA,MAAAoB;AAAA,SAAApB,EAAA,CAAA,MAAAiB,MAAAjB,SAAAkB,MARbE,KAAA,oBAAC,KAAA,EAAa,YACZ,UAAA,oBAAC,MAAA,EAAe,aAAa,UAAA,GAAQ,MAAA,YAAW,QAAA,IAAe,QAAA,GAC7D,UAAA,qBAAC,OAAA,EAAa,OAAA,GACZH,UAAAA;AAAAA,IAAAA;AAAAA,IAGAC;AAAAA,EAAAA,EAAAA,CAGF,GACF,GACF,GAAMlB,OAAAiB,IAAAjB,OAAAkB,IAAAlB,OAAAoB,MAAAA,KAAApB,EAAA,CAAA,GAXNoB;AAWM;ACRV,MAAMC,OAAOC,uBAAOC,IAAI,EAACC,WAAA;AAAA,EAAAC,aAAA;AAAA,EAAAC,aAAA;AAAA,CAAA,EAAC;AAAA,EACxBC,UAAU;AAAA,EACVC,QAAQ;AAAA,EACRC,YAAY;AACd,CAAC,GASYC,0BAA0BC,WAAW,SAAAhC,OAAAiC,KAAA;AAAA,QAAAhC,IAAAC,EAAA,EAAA,GAIhD;AAAA,IAAAY;AAAAA,EAAAA,IAAYC,eAAeC,uBAAuB,GAClD;AAAA,IAAAkB;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,EAAAA,IAA4CrC;AAAK,MAAAM;AAAAL,WAAAkC,gBAEX7B,KAAAA,MAAM6B,aAAa,MAAM,GAAClC,OAAAkC,cAAAlC,OAAAK,MAAAA,KAAAL,EAAA,CAAA;AAAhE,QAAAqC,oBAA0BhC;AAAuD,MAAAW;AAAAhB,WAAAkC,gBACvClB,KAAAA,MAAMkB,aAAa,UAAU,GAAClC,OAAAkC,cAAAlC,OAAAgB,MAAAA,KAAAhB,EAAA,CAAA;AAAxE,QAAAsC,wBAA8BtB;AAA2D,MAAAC;AAAAjB,WAAAa,KAO9EI,KAAAJ,EAAE,cAAc,GAACb,OAAAa,GAAAb,OAAAiB,MAAAA,KAAAjB,EAAA,CAAA;AAAA,MAAAkB;AAAAlB,WAAAiB,MAFtBC,yBAAC,MAAA,EAAW,OAAA,UAAe,MAAA,GAAQ,QAAa,UAAA,GAAY,SAAA,GAC1D,UAAA,oBAAC,MAAA,EAAQ,IAAA,MAAW,SAAU,QAAA,UAC3BD,UAAAA,GAAAA,CACH,GACF,GAAOjB,OAAAiB,IAAAjB,OAAAkB,MAAAA,KAAAlB,EAAA,CAAA;AAAA,MAAAoB;AAAApB,IAAA,CAAA,MAAAa,KAAAb,SAAAmC,QAQGf,KACIP,EADJsB,SAAS,SACH,8BACA,+BAA+B,GAACnC,OAAAa,GAAAb,OAAAmC,MAAAnC,QAAAoB,MAAAA,KAAApB,EAAA,EAAA;AAAA,MAAAuC;AAAAvC,YAAAoB,MAJ1CmB,yBAAC,QAAA,EAEG,MAAAnB,IAIG,MAAA,SACMoB,WAAAA,iBAAe,GAC1BxC,QAAAoB,IAAApB,QAAAuC,MAAAA,KAAAvC,EAAA,EAAA;AAAA,MAAAyC;AAAAzC,IAAA,EAAA,6BAAA0C,IAAA,2BAAA,KAGWD,KAAA;AAAA,IAAAE,OAAQ;AAAA,EAAA,GAAQ3C,QAAAyC,MAAAA,KAAAzC,EAAA,EAAA;AAEd,QAAA4C,KAAAT,SAAS,SAATU,gBAAAC;AAA2C,MAAAC;AAAA/C,YAAAa,KAEhDkC,KAAAlC,EAAE,gCAAgC,GAACb,QAAAa,GAAAb,QAAA+C,MAAAA,KAAA/C,EAAA,EAAA;AAAA,MAAAgD;AAAAhD,IAAA,EAAA,MAAAqC,qBAAArC,UAAA4C,MAAA5C,EAAA,EAAA,MAAA+C,MAH3CC,yBAAC,YACY,WAAAJ,IACFP,SAAAA,mBACH,MAAAU,IAAmC,GACzC/C,QAAAqC,mBAAArC,QAAA4C,IAAA5C,QAAA+C,IAAA/C,QAAAgD,MAAAA,KAAAhD,EAAA,EAAA;AAEW,QAAAiD,MAAAd,SAAS,aAATU,gBAAAC;AAA+C,MAAAI;AAAAlD,YAAAa,KAEpDqC,MAAArC,EAAE,oCAAoC,GAACb,QAAAa,GAAAb,QAAAkD,OAAAA,MAAAlD,EAAA,EAAA;AAAA,MAAAmD;AAAAnD,IAAA,EAAA,MAAAoC,QAAApC,UAAAa,KAE3CsC,MAAAf,SAAS,WAAT;AAAA,IAAAgB,SACcvC,EAAE,2CAA2C;AAAA,EAAA,IAD3DiC,QAEa9C,QAAAoC,MAAApC,QAAAa,GAAAb,QAAAmD,OAAAA,MAAAnD,EAAA,EAAA;AAEL,QAAAqD,MAAAjB,SAAS;AAAQ,MAAAkB;AAAAtD,IAAA,EAAA,MAAAsC,yBAAAtC,EAAA,EAAA,MAAAiD,OAAAjD,EAAA,EAAA,MAAAkD,OAAAlD,EAAA,EAAA,MAAAmD,OAAAnD,UAAAqD,OAT7BC,MAAA,oBAAC,UAAA,EACY,WAAAL,KACFX,SAAAA,uBACH,MAAAY,KAEJ,cAAAC,KAIQ,UAAAE,IAAAA,CAAiB,GAC3BrD,QAAAsC,uBAAAtC,QAAAiD,KAAAjD,QAAAkD,KAAAlD,QAAAmD,KAAAnD,QAAAqD,KAAArD,QAAAsD,OAAAA,MAAAtD,EAAA,EAAA;AAAA,MAAAuD;AAAAvD,IAAA,EAAA,MAAAsD,OAAAtD,UAAAgD,MAhBJO,2BAAC,MAAA,EAAY,OAAAd,IACXO,UAAAA;AAAAA,IAAAA;AAAAA,IAKAM;AAAAA,EAAAA,EAAAA,CAWF,GAAOtD,QAAAsD,KAAAtD,QAAAgD,IAAAhD,QAAAuD,OAAAA,MAAAvD,EAAA,EAAA;AAAA,MAAAwD;AAAAxD,IAAA,EAAA,6BAAA0C,IAAA,2BAAA,KAEAc,MAAA;AAAA,IAAAC,WAAY;AAAA,EAAA,GAAazD,QAAAwD,OAAAA,MAAAxD,EAAA,EAAA;AAAA,MAAA0D;AAAA1D,IAAA,EAAA,MAAAuD,OAAAvD,UAAAuC,MAjCpCmB,0BAAC,YAAA,EACI,IAAA,8BAED,QAAAnB,IAWA,MAAAgB,KAmBO,SAAAC,IAAAA,CAAyB,GAClCxD,QAAAuD,KAAAvD,QAAAuC,IAAAvC,QAAA0D,OAAAA,MAAA1D,EAAA,EAAA;AAAA,MAAA2D;AAAA3D,YAAAa,KAGY8C,MAAA9C,EAAE,mCAAmC,GAACb,QAAAa,GAAAb,QAAA2D,OAAAA,MAAA3D,EAAA,EAAA;AAAA,MAAA4D;AAAA5D,YAAAa,KAI1B+C,MAAA/C,EAAE,wBAAwB,GAACb,QAAAa,GAAAb,QAAA4D,OAAAA,MAAA5D,EAAA,EAAA;AAAA,MAAA6D;AAAA7D,YAAA4D,OAArCC,MAAA;AAAA,IAAAT,SAAUQ;AAAAA,EAAAA,GAA4B5D,QAAA4D,KAAA5D,QAAA6D,OAAAA,MAAA7D,EAAA,EAAA;AAAA,MAAA8D;AAAA9D,IAAA,EAAA,MAAAiC,WAAAjC,UAAA2D,OAAA3D,EAAA,EAAA,MAAA6D,OALtDC,0BAAC,QAAA,EACa,cAAAH,KACNI,MAAAA,WACD,MAAA,SACI9B,SAAAA,SACK,cAAA4B,IAAAA,CAAsC,GACpD7D,QAAAiC,SAAAjC,QAAA2D,KAAA3D,QAAA6D,KAAA7D,QAAA8D,OAAAA,MAAA9D,EAAA,EAAA;AAAA,MAAAgE;AAAAhE,IAAA,EAAA,MAAA0D,OAAA1D,UAAA8D,OA3CJE,MAAA,qBAAC,QAAU,MAAA,QAAgB,SAAA,GAAQ,KAAA,GACjCN,UAAAA;AAAAA,IAAAA;AAAAA,IAoCAI;AAAAA,EAAAA,EAAAA,CAOF,GAAO9D,QAAA0D,KAAA1D,QAAA8D,KAAA9D,QAAAgE,OAAAA,MAAAhE,EAAA,EAAA;AAAA,MAAAiE;AAAAjE,IAAA,EAAA,MAAAgE,OAAAhE,UAAAkB,MAnDT+C,MAAA,qBAAC,MAAA,EAAc,SAAA,GACb/C,UAAAA;AAAAA,IAAAA;AAAAA,IAMA8C;AAAAA,EAAAA,EAAAA,CA6CF,GAAOhE,QAAAgE,KAAAhE,QAAAkB,IAAAlB,QAAAiE,OAAAA,MAAAjE,EAAA,EAAA;AAAA,MAAAkE;AAAA,SAAAlE,EAAA,EAAA,MAAAgC,OAAAhC,UAAAiE,OArDTC,MAAA,oBAAC,MAAA,EAAUlC,KACTiC,UAAAA,IAAAA,CAqDF,GAAOjE,QAAAgC,KAAAhC,QAAAiE,KAAAjE,QAAAkE,OAAAA,MAAAlE,EAAA,EAAA,GAtDPkE;AAsDO,CAEV,GClDKC,YAAY7C,uBAAO8C,KAAK,EAAC5C,WAAA;AAAA,EAAAC,aAAA;AAAA,EAAAC,aAAA;AAAA,CAAA,EAAA,CAAA,iEAAA,CAAA;AAOxB,SAAA2C,kBAAAtE,OAAA;AAAA,QAAAC,IAAAC,EAAA,CAAA,GACL;AAAA,IAAAqE;AAAAA,IAAAlC;AAAAA,EAAAA,IAAwBmC,mBAAAA;AAExB,MAAI,CAACD;AAAO,WAAS;AAAI,MAAAjE;AAAA,SAAAL,EAAA,CAAA,MAAAoC,QAAApC,SAAAD,SAMvBM,KAAA,oBAAC,WAAA,EACC,UAAA,oBAAC,wBAAA,EAAsB,GAAKN,OAAaqC,KAAAA,CAAI,EAAA,CAC/C,GAAYpC,OAAAoC,MAAApC,OAAAD,OAAAC,OAAAK,MAAAA,KAAAL,EAAA,CAAA,GAFZK;AAEY;AAIhB,SAAAmE,uBAAAzE,OAAA;AAAA,QAAAC,IAAAC,EAAA,GAAA,GAKE;AAAA,IAAAY;AAAAA,EAAAA,IAAYC,eAAeC,uBAAuB,GAClD;AAAA,IAAAkB;AAAAA,IAAAG;AAAAA,EAAAA,IAAwBrC,OACxB,CAAA0E,kBAAAC,mBAAA,IAAgDC,SAAkB,EAAK,GACvE,CAAAC,iBAAAC,kBAAA,IAA8CF,SAAiC,IAAI,GACnF,CAAAG,eAAAC,gBAAA,IAA0CJ,SAAkB,EAAK,GACjE,CAAAK,aAAAC,cAAA,IAAsCN,SAAuB,IAAI,GAEjEO,UAAgBC,OAA8B,IAAI,GAClD,CAAAC,aAAAC,cAAA,IAAsCV,SAAgC,IAAI,GAE1EW,cAAoBC,kBACpB;AAAA,IAAAC;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,EAAAA,IAYIC,YAAAA,GACJC,oBAA0BjB,OAA2BY,iBAAiB,GACtE;AAAA,IAAAnF,OAAAyF;AAAAA,EAAAA,IAAmCC,gBAAAA,GACnCC,8BAAoCpB,OAAgB,EAAK,GAEzDqB,YAAkBC,SAAAA,EAAUC,MAC5B;AAAA,IAAAC;AAAAA,EAAAA,IAAqBC,SAAAA;AAAU,MAAAvG;AAAAL,WAAAoF,eAEmD/E,KAAA;AAAA,IAAAwG,iBAC/DzB;AAAAA,EAAAA,GAClBpF,OAAAoF,aAAApF,OAAAK,MAAAA,KAAAL,EAAA,CAAA;AAFD,QAAA;AAAA,IAAA8G;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,EAAAA,IAAgEC,kBAAkB5G,EAEjF,GACD;AAAA,IAAA6G;AAAAA,IAAAC;AAAAA,EAAAA,IAAwCC,2BACxC;AAAA,IAAAC;AAAAA,IAAAC;AAAAA,EAAAA,IAAoChH,sBAAAA,GACpCiH,YAAkBC,wBAElB;AAAA,IAAAC;AAAAA,IAAAC,eAAAC;AAAAA,EAAAA,IAAyDC,kBAAAA,GAEzDC,kBAAsCrC,SAAQtF,KAAM2F,MAAM,GAE1D;AAAA,IAAAiC;AAAAA,EAAAA,IAAkBtC;AAAQ,MAAAxE;AAAAhB,IAAA,CAAA,MAAAmH,mBAAAnH,SAAA4F,aAAA5F,EAAA,CAAA,MAAAuH,aAGxBvG,KAAA+G,CAAAA,aAAA;AACEnC,cAAUmC,QAAQ,GAClBZ,gBAAgB,IAAI,GAEpBI,UAASS,uBAAwBD,QAAQ;AAAA,EAAC,GAC3C/H,OAAAmH,iBAAAnH,OAAA4F,WAAA5F,OAAAuH,WAAAvH,OAAAgB,MAAAA,KAAAhB,EAAA,CAAA;AANH,QAAAiI,mBAAyBjH;AAQxB,MAAAC;AAAAjB,IAAA,CAAA,MAAAiC,WAAAjC,SAAAmH,mBAEwClG,KAAAA,MAAA;AACvCgB,YAAAA,GACAkF,gBAAgB,IAAI;AAAA,EAAC,GACtBnH,OAAAiC,SAAAjC,OAAAmH,iBAAAnH,OAAAiB,MAAAA,KAAAjB,EAAA,CAAA;AAHD,QAAAkI,uBAA6BjH;AAGC,MAAAC;AAAAiH,OAAA;AAG5B,QAAI,CAACnC,gBAAc;AAAE9E,WAAO4B;AAAP,YAAAqF;AAAAA,IAAgB;AAAA,QAAA/G;AAAApB,MAAA,CAAA,MAAAgG,kBAAAhG,EAAA,EAAA,MAAAwG,aAAAxG,EAAA,EAAA,MAAAa,KAAAb,UAAAuH,aAEpBnG,MAAAgH,CAAAA,OAAA;AACfC,gBAASC,UAAUC,UAAWvC,eAAeoC,EAAE,CAAC,EAACI,MAAO,MAAA;AACtDhC,kBAAU;AAAA,UAAAiC,UACE;AAAA,UAAI5C,QACN;AAAA,UAAO6C,OACR7H,EAAE,yBAAyB;AAAA,QAAA,CACnC;AAAA,MAAC,CACH,GAED0G,UAASoB,kBAAAA;AAAAA,IAAoB,GAC9B3I,OAAAgG,gBAAAhG,QAAAwG,WAAAxG,QAAAa,GAAAb,QAAAuH,WAAAvH,QAAAoB,OAAAA,MAAApB,EAAA,EAAA,GAEDkB,KAZiBE;AAAAA,EAYF;AAfjB,QAAAwH,iBAAuB1H;AAgBsB,MAAAE;AAAApB,IAAA,EAAA,MAAAyF,cAAAzF,UAAA8F,aAG3C1E,KAAAyH,CAAAA,SAAA;AACE,UAAAC,UAAgBrD,WAAW2C,IAAE;AACxBU,eAEAhD,UAASiD,OAAQ;AAAA,MAAAC,MACd;AAAA,MAAOC,WACFH,QAAOI,OAAOC,MAAYC,SAA1B;AAAA,MAAgChB,IACvCU,QAAOO;AAAAA,MAAIlI,SACN2H,QAAO3H;AAAAA,MAAQmI,iBACPR,QAAOQ;AAAAA,MAAgBC,WAC7BT,QAAOS,aAAP,CAAA;AAAA,MAAuB1D,QAC1BiD,QAAOjD;AAAAA,MAAO2D,UACZV,QAAOU;AAAAA,IAAAA,CAClB;AAAA,EAAC,GACHxJ,QAAAyF,YAAAzF,QAAA8F,WAAA9F,QAAAoB,MAAAA,KAAApB,EAAA,EAAA;AAfH,QAAAyJ,oBAA0BrI;AAiBzB,MAAAmB;AAAAvC,YAAA8E,iBAEqCvC,KAAAA,MAAA;AAChCuC,sBACJJ,oBAAoB,EAAK,GACzBG,mBAAmB,IAAI;AAAA,EAAC,GACzB7E,QAAA8E,eAAA9E,QAAAuC,MAAAA,KAAAvC,EAAA,EAAA;AAJD,QAAA0J,oBAA0BnH;AAIP,MAAAE;AAAAzC,YAAAwF,SAAAtF,KAAAyJ,QAAA3J,EAAA,EAAA,MAAAkG,cAAAlG,EAAA,EAAA,MAAA+G,iBAAA/G,UAAAgH,yBAAAhH,EAAA,EAAA,MAAAmH,mBAGjB1E,KAAAmH,CAAAA,aAAA;AAGE,QAFAzC,gBAAgByC,QAAQ,GAEpBA,UAAQX,WAAW;AACrB,YAAAE,OAAaU,UAASC,WAAYF,SAAQX,SAAU;AACpD/C,mBAAaiD,IAAI,GAEjBpC,cAAc6C,SAAQX,SAAU,GAERzD,SAAQtF,KAAKyJ,KAAKI,OAChCC,CAAAA,OAAOA,GAACR,aAAcI,UAAQJ,QAAU,EAACS,KAC3CC,KAA8C,KAE/BN,SAAQJ,YAC7BxC,sBAAsB4C,SAAQJ,QAAS;AAAA,IACxC;AAAA,EACF,GACFxJ,EAAA,EAAA,IAAAwF,SAAAtF,KAAAyJ,MAAA3J,QAAAkG,YAAAlG,QAAA+G,eAAA/G,QAAAgH,uBAAAhH,QAAAmH,iBAAAnH,QAAAyC,MAAAA,KAAAzC,EAAA,EAAA;AAlBH,QAAAmK,mBAAyB1H;AAoBxB,MAAAG;AAAA5C,IAAA,EAAA,MAAA8F,aAAA9F,UAAAmH,mBAGCvE,KAAAwH,CAAAA,gBAAA;AACE,UAAAnB,YAAkBmB,aAAWC,SAAoBpB,aAA/B;AAEbnD,cAASiD,OAAQ;AAAA,MAAAC,MACd;AAAA,MAAOC;AAAAA,MAAA9H,SAEJiJ,YAAWjJ;AAAAA,MAAQmI,iBACXc,YAAWd;AAAAA,MAAgBC,WACjCa,YAAWb;AAAAA,MAAU1D,QACxBuE,YAAWvE;AAAAA,MAAO2D,UAChBY,YAAWZ;AAAAA,IAAAA,CACtB,GAEDrC,gBAAgB;AAAA,MAAA8B;AAAAA,MAAAqB,QAEN;AAAA,MAAWd,UACTY,YAAWZ;AAAAA,IAAAA,CACtB;AAAA,EAAC,GACHxJ,QAAA8F,WAAA9F,QAAAmH,iBAAAnH,QAAA4C,MAAAA,KAAA5C,EAAA,EAAA;AAnBH,QAAAuK,wBAA8B3H;AAqB7B,MAAAG;AAAA/C,YAAA8F,aAGC/C,KAAAyH,CAAAA,kBAAA;AACO1E,cAASiD,OAAQ;AAAA,MAAA,GACjBqB;AAAAA,MAAWpB,MACR;AAAA,MAAOC,WACFmB,eAAWC,SAAoBpB,aAA/B;AAAA,IAAA,CACZ;AAAA,EAAC,GACHjJ,QAAA8F,WAAA9F,QAAA+C,MAAAA,KAAA/C,EAAA,EAAA;AAPH,QAAAyK,cAAoB1H;AASnB,MAAAC;AAAAhD,YAAA8F,aAGC9C,KAAAA,CAAA0H,MAAAC,kBAAA;AACO7E,cAAS8E,OAAQxC,MAAIgC,aAAW;AAAA,EAAC,GACvCpK,QAAA8F,WAAA9F,QAAAgD,MAAAA,KAAAhD,EAAA,EAAA;AAHH,QAAA6K,aAAmB7H;AAKlB,MAAAC;AAAAjD,YAAA6H,mBAGC5E,MAAA6H,CAAAA,SAAA;AACE,UAAAC,SAAelD,gBAAemD,KAAMC,CAAAA,QAAOjB,IAACkB,eAAmB7B,QAAKjB,IAAE,GACtE+C,WAAiBC,CAAAA,EAAQL,UAAUA,QAAMM,SAAiBC,SAAG;AAE7D5G,wBAAoB,EAAI,GACxBG,mBAAmB;AAAA,MAAA0G,WACNnD;AAAAA,MAAE+C;AAAAA,IAAAA,CAEd;AAAA,EAAC,GACHnL,QAAA6H,iBAAA7H,QAAAiD,OAAAA,MAAAjD,EAAA,EAAA;AAVH,QAAAwL,gBAAsBvI;AAarB,MAAAC;AAAAlD,IAAA,EAAA,MAAA0J,qBAAA1J,UAAA8F,aAGC5C,aAAAuI,SAAA;AACE,QAAA;AACE1G,uBAAiB,EAAI,GACrB,MAAMe,UAAS4F,OAAQtD,IAAE,GACzBsB,kBAAAA;AAAAA,IAAmB,SAAAvG,MAAA;AAEnB8B,qBADO0G,IACW;AAAA,IAAC;AAErB5G,qBAAiB,EAAK;AAAA,EAAC,GACxB/E,QAAA0J,mBAAA1J,QAAA8F,WAAA9F,QAAAkD,OAAAA,MAAAlD,EAAA,EAAA;AAVH,QAAA4L,sBAA4B1I;AAY3B,MAAAC;AAAAnD,IAAA,EAAA,MAAAyF,cAAAzF,EAAA,EAAA,MAAA8F,aAAA9F,EAAA,EAAA,MAAA8G,mBAAA9G,EAAA,EAAA,MAAAmH,mBAAAnH,UAAA4F,aAGCzC,MAAAA,CAAA0I,MAAAC,eAAA;AAOE,QANKhG,UAAS8E,OAAQxC,MAAI;AAAA,MAAAvC,QAChBiG;AAAAA,IAAAA,CACT,GAIGA,eAAe,QAAM;AACvBlG,gBAAU,MAAM;AAEhB,YAAAmG,YAAgBtG,WAAW2C,IAAE;AAE7B,UAAI,CAACU;AAAO;AAEZ3B,sBAAgB;AAAA,QAAA8B,WACHH,UAAOI,OAAOC,MAAYC,SAA1B;AAAA,QAAkCkB,QACrC;AAAA,QAAWd,UACTV,UAAOU,YAAP;AAAA,MAAA,CACX,GAED1C,gBAAgBsB,IAAE;AAAA,IAAC;AAAA,EACpB,GACFpI,QAAAyF,YAAAzF,QAAA8F,WAAA9F,QAAA8G,iBAAA9G,QAAAmH,iBAAAnH,QAAA4F,WAAA5F,QAAAmD,OAAAA,MAAAnD,EAAA,EAAA;AAvBH,QAAAgM,qBAA2B7I;AAyB1B,MAAAE;AAAArD,YAAA8F,aAGCzC,MAAAA,CAAA4I,MAAAC,aAAA;AACOpG,cAASqG,MAAO/D,MAAI8D,QAAQ;AAAA,EAAC,GACnClM,QAAA8F,WAAA9F,QAAAqD,OAAAA,MAAArD,EAAA,EAAA;AAHH,QAAAoM,uBAA6B/I;AAK5B,MAAAC;AAAAtD,IAAA,EAAA,MAAA2G,cAAA3G,UAAAkH,gBAAAlH,EAAA,EAAA,MAAAmH,mBAEsC7D,MAAAA,MAAA;AAKjC4D,oBAAAP,cACFQ,gBAAgB,IAAI;AAAA,EACrB,GACFnH,QAAA2G,YAAA3G,QAAAkH,cAAAlH,QAAAmH,iBAAAnH,QAAAsD,OAAAA,MAAAtD,EAAA,EAAA;AARD,QAAAqM,qBAA2B/I;AAQoB,MAAAC;AAAAvD,IAAA,EAAA,MAAAsM,uBAAA5J,IAAA,2BAAA,KAEhBa,MAAAgJ,CAAAA,YAAA;AAC7BrH,YAAOsH,UAAWD,SAClBlH,eAAekH,OAAO;AAAA,EAAC,GACxBvM,QAAAuD,OAAAA,MAAAvD,EAAA,EAAA;AAHD,QAAAyM,aAAmBlJ;AAGb,MAAAC;AAAAxD,YAAAqM,sBAGJ7I,MAAAkJ,CAAAA,UAAA;AAIIA,UAAKxD,kBAAmByD,eAAeD,MAAKxD,QAAqB0D,aAAC,cAAc,KAGhFP,mBAAAA;AAAAA,EACD,GACFrM,QAAAqM,oBAAArM,QAAAwD,OAAAA,MAAAxD,EAAA,EAAA;AAAA,MAAA0D;AAAA1D,IAAA,EAAA,MAAAsM,uBAAA5J,IAAA,2BAAA,KACDgB,MAAAA,MAAM,CAACwB,QAAOsH,OAAQ,GAACxM,QAAA0D,OAAAA,MAAA1D,EAAA,EAAA,GAXzB6M,qBACErJ,KAUAE,GACF;AAEA,QAAA,CAAAoJ,iBAAAC,kBAAA,IAA8CpI,SAAS,EAAK;AAAC,MAAAhB;AAAA3D,IAAA,EAAA,MAAA8M,mBAAA9M,UAAAoC,QAAApC,EAAA,EAAA,MAAAkH,cAAAoD,UAAAtK,UAAA2H,uBACnDhE,MAAAA,MAAA;AACR,QAAImJ,qBAAmB1K,SAAS;AAEhC2K,aAAAA,mBAAmB,EAAI,GACnB7F,cAAYoD,WAAa,SAC3B3C,oBAAmBqF,YAAa,cAAc,IACrC5G,kBAAiBoG,UAC1B7E,oBAAmBqF,YAAa,MAAM,IAEtCrF,oBAAmBqF,YAAa,iBAAiB,GAE5C,MAAA;AACLrF,4BAAmBsF,eAAAA;AAAAA,MAAiB;AAAA,EACrC,GACFjN,QAAA8M,iBAAA9M,QAAAoC,MAAApC,EAAA,EAAA,IAAAkH,cAAAoD,QAAAtK,QAAA2H,qBAAA3H,QAAA2D,OAAAA,MAAA3D,EAAA,EAAA;AAA0B,QAAA4D,MAAAsD,cAAYoD;AAAQ,MAAAzG;AAAA7D,IAAA,EAAA,MAAA8M,mBAAA9M,EAAA,EAAA,MAAAoC,QAAApC,EAAA,EAAA,MAAA4D,OAAA5D,UAAA2H,uBAA5C9D,MAAA,CAACiJ,iBAAiB1K,MAAMwB,KAAsB+D,mBAAmB,GAAC3H,QAAA8M,iBAAA9M,QAAAoC,MAAApC,QAAA4D,KAAA5D,QAAA2H,qBAAA3H,QAAA6D,OAAAA,MAAA7D,EAAA,EAAA,GAdrEkN,UAAUvJ,KAcPE,GAAkE;AAAC,MAAAC,KAAAE;AAAAhE,IAAA,EAAA,MAAAyF,cAAAzF,EAAA,EAAA,MAAAmK,oBAAAnK,EAAA,EAAA,MAAA8H,WAAA9H,UAAAiG,0BAAAjG,EAAA,EAAA,MAAA8G,mBAAA9G,EAAA,EAAA,MAAA4F,aAAA5F,EAAA,EAAA,MAAAuH,aAG5DzD,MAAAA,MAAA;AAGR,UAAAqJ,oBAA0B1H,WAAWW,kBAAiBoG,WAAjB,EAA+B;AAEhE,KAAC1E,WAADqF,qBAAA,CAAkC5G,4BAA2BiG,YAE/D5G,UAAUuH,kBAAiBtH,UAAjB,MAAkC,GAE5CsE,iBAAiB;AAAA,MAAAlB,WACJkE,kBAAiBjE,OAAOC,MAAYC,SAApC;AAAA,MAA4CkB,QAC/C;AAAA,MAAKd,UACH2D,kBAAiB3D,YAAjB;AAAA,IAAA,CACX,GAGD4D,sBAAsB,MAAA;AACpBtG,sBAAgBqG,kBAAiB9D,GAAI;AAAA,IAAC,CACvC,GAED9C,4BAA2BiG,UAAW,IACtCpG,kBAAiBoG,UAAW1J,QAE5BmD,yBAAAA,GAEAsB,UAAS8F,sBAAAA;AAAAA,EACV,GACArJ,MAAA,CACDyB,YACA0E,kBACArC,SACA7B,wBACAa,iBACAlB,WACA2B,SAAS,GACVvH,QAAAyF,YAAAzF,QAAAmK,kBAAAnK,QAAA8H,SAAA9H,QAAAiG,wBAAAjG,QAAA8G,iBAAA9G,QAAA4F,WAAA5F,QAAAuH,WAAAvH,QAAA8D,KAAA9D,QAAAgE,QAAAF,MAAA9D,EAAA,EAAA,GAAAgE,MAAAhE,EAAA,EAAA,IAnCDkN,UAAUpJ,KA2BPE,GAQF;AAAC,MAAAC;AAAAqJ,OAAA;AAGA,QAAIlL,SAAS,YAATqF,YAA+B;AAAA,UAAAvD;AAAAlE,QAAA,EAAA,MAAAyH,cAAAzH,EAAA,EAAA,MAAA2H,oBAAA4F,uBAAAvN,EAAA,EAAA,MAAA2H,oBAAA6F,yBAE/BtJ,OAAA,oBAAC,qBAAA,EACOuD,MAAAA,YACU,gBAAAE,oBAAmB4F,qBACjB,kBAAA5F,oBAAmB6F,uBAAsB,GAC3DxN,QAAAyH,YAAAzH,EAAA,EAAA,IAAA2H,oBAAA4F,qBAAAvN,EAAA,EAAA,IAAA2H,oBAAA6F,uBAAAxN,QAAAkE,QAAAA,OAAAlE,EAAA,EAAA,GALJiE,MACEC;AADF,YAAAoJ;AAAAA,IAMC;AAGHrJ,UAAO;AAAA,EAAI;AAXb,QAAAwJ,iBAAuBxJ;AAiBrB,MAAAC;AAAAlE,YAAA0J,qBAAA1J,EAAA,EAAA,MAAA4E,mBAAA5E,EAAA,EAAA,MAAAgF,eAAAhF,EAAA,EAAA,MAAA8E,iBAAA9E,UAAA4L,uBAAA5L,EAAA,EAAA,MAAAyE,oBAIGP,MAAAU,mBAAAH,wCACE,qBAAA,EAAmB,GACdG,iBACGI,OAAAA,aACEF,SAAAA,eACA4E,SAAAA,mBACEkC,WAAAA,oBAAAA,CAAmB,GAEjC5L,QAAA0J,mBAAA1J,QAAA4E,iBAAA5E,QAAAgF,aAAAhF,QAAA8E,eAAA9E,QAAA4L,qBAAA5L,QAAAyE,kBAAAzE,QAAAkE,OAAAA,MAAAlE,EAAA,EAAA;AAYS,QAAA0N,OAACrG;AAAW,MAAAsG;AAAA3N,IAAA,EAAA,MAAAiI,oBAAAjI,EAAA,EAAA,MAAAkI,wBAAAlI,EAAA,EAAA,MAAAoC,QAAApC,UAAA6F,UAGlB8H,0BAAC,yBAAA,EACUzF,SAAAA,sBACKD,cAAAA,kBACRpC,MAAAA,QACAzD,MAAI,GACVpC,QAAAiI,kBAAAjI,QAAAkI,sBAAAlI,QAAAoC,MAAApC,QAAA6F,QAAA7F,QAAA2N,OAAAA,MAAA3N,EAAA,EAAA;AAAA,MAAA4N;AAAA5N,IAAA,EAAA,MAAAsH,gBAAAtH,UAAA0N,OAAA1N,EAAA,EAAA,MAAA2N,OAVJC,MAAA,oBAAC,6BACYtG,WAAAA,cACL,MAAAoG,KACI,WAAA,cAEVC,UAAAA,IAAAA,CAMF,GAA4B3N,QAAAsH,cAAAtH,QAAA0N,KAAA1N,QAAA2N,KAAA3N,QAAA4N,OAAAA,MAAA5N,EAAA,EAAA;AAAA,MAAA6N;AAAA7N,YAAAqG,qBAC3BwH,MAAAxH,qBAAqB,oBAAC,0BAA8BA,OAAAA,kBAAAA,CAAiB,GAAIrG,QAAAqG,mBAAArG,QAAA6N,OAAAA,MAAA7N,EAAA,EAAA;AAAA,MAAA8N;AAAA9N,IAAA,EAAA,MAAAyN,kBAAAzN,UAAAwF,SAAA5E,SAAAZ,EAAA,EAAA,MAAA6H,mBAAA7H,UAAAsF,eAAAtF,EAAA,EAAA,MAAA4I,kBAAA5I,EAAA,EAAA,MAAAyJ,qBAAAzJ,EAAA,GAAA,MAAA6K,cAAA7K,EAAA,GAAA,MAAAuK,yBAAAvK,WAAAmK,oBAAAnK,EAAA,GAAA,MAAAoM,wBAAApM,EAAA,GAAA,MAAAyK,eAAAzK,EAAA,GAAA,MAAAgM,sBAAAhM,EAAA,GAAA,MAAA0F,qBAAA1F,WAAA8H,WAAA9H,EAAA,GAAA,MAAA2F,kBAAA3F,EAAA,GAAA,MAAAoC,QAAApC,EAAA,GAAA,MAAAwL,iBAAAxL,EAAA,GAAA,MAAAkH,gBAAAlH,WAAA6F,UACzEiI,MAAAxI,mCACE,cAAA,EACiBmI,gBACN5F,UAAAA,iBACGvC,aACN,OAAAE,SAAQ5E,OACNkH,SACOnC,gBACVvD,MACMwG,YAAAA,gBACGa,kCACL+B,UAAAA,eACFX,QAAAA,YACWN,mBAAAA,uBACLJ,gCACIiC,kBAAAA,sBACT3B,sBACOuB,gBAAAA,oBACNtG,6BACIwB,cACNrB,OAAAA,CAAM,GAEjB7F,QAAAyN,gBAAAzN,EAAA,EAAA,IAAAwF,SAAA5E,OAAAZ,QAAA6H,iBAAA7H,QAAAsF,aAAAtF,QAAA4I,gBAAA5I,QAAAyJ,mBAAAzJ,SAAA6K,YAAA7K,SAAAuK,uBAAAvK,SAAAmK,kBAAAnK,SAAAoM,sBAAApM,SAAAyK,aAAAzK,SAAAgM,oBAAAhM,SAAA0F,mBAAA1F,SAAA8H,SAAA9H,SAAA2F,gBAAA3F,SAAAoC,MAAApC,SAAAwL,eAAAxL,SAAAkH,cAAAlH,SAAA6F,QAAA7F,SAAA8N,OAAAA,MAAA9N,EAAA,GAAA;AAAA,MAAA+N;AAAA/N,IAAA,GAAA,MAAAqM,sBAAArM,EAAA,GAAA,MAAA4N,OAAA5N,EAAA,GAAA,MAAA6N,OAAA7N,WAAA8N,OA3CHC,2BAAC,MAAA,EACW,WAAA,UACJ,MAAA,GACC,QAAA,QACE1B,6BACA,UAAA,UACJI,KAAAA,YAELmB,UAAAA;AAAAA,IAAAA;AAAAA,IAYCC;AAAAA,IACAC;AAAAA,EAAAA,GAuBH,GAAO9N,SAAAqM,oBAAArM,SAAA4N,KAAA5N,SAAA6N,KAAA7N,SAAA8N,KAAA9N,SAAA+N,OAAAA,MAAA/N,EAAA,GAAA;AAAA,MAAAgO;AAAA,SAAAhO,EAAA,GAAA,MAAAkE,OAAAlE,WAAA+N,OAvDTC,MAAA,qBAAC,UAAA,EACE9J,UAAAA;AAAAA,IAAAA;AAAAA,IAUD6J;AAAAA,EAAAA,EAAAA,CA6CF,GAAW/N,SAAAkE,KAAAlE,SAAA+N,KAAA/N,SAAAgO,OAAAA,MAAAhO,EAAA,GAAA,GAxDXgO;AAwDW;AAzYf,SAAA9D,MAAA+D,GAAA;AAAA,SAuHuBC,uBAAuBD,EAAC/C,aAAc;AAAC;"}
@@ -104,21 +104,24 @@ import "@sanity/icons/Add";
104
104
  import "observable-callback";
105
105
  import "@sanity/icons/BulbOutline";
106
106
  import "@sanity/icons/Unknown";
107
+ import "@sanity/client/stega";
107
108
  import "@sanity/icons/ToggleArrowRight";
108
- import "@sanity/insert-menu";
109
+ import "@sanity/icons/Search";
110
+ import "@sanity/icons/ThLarge";
111
+ import "@sanity/icons/Ulist";
112
+ import "lodash-es/startCase.js";
113
+ import "react-is";
109
114
  import "@dnd-kit/sortable";
110
115
  import "@sanity/icons/DragHandle";
111
116
  import "@sanity/icons/AddDocument";
112
117
  import "@sanity/icons/InsertAbove";
113
118
  import "@sanity/icons/InsertBelow";
114
119
  import "@tanstack/react-virtual";
115
- import "lodash-es/startCase.js";
116
120
  import "date-fns/getMinutes";
117
121
  import "date-fns/parseISO";
118
122
  import "date-fns/setMinutes";
119
123
  import "@sanity/icons/EarthAmericas";
120
124
  import "lodash-es/noop.js";
121
- import "@sanity/icons/Search";
122
125
  import "speakingurl";
123
126
  import "@sanity/icons/Reset";
124
127
  import "@sanity/icons/Sync";
@@ -126,7 +129,6 @@ import "@sanity/asset-utils";
126
129
  import "@sanity/icons/AccessDenied";
127
130
  import "@sanity/icons/HelpCircle";
128
131
  import "@sanity/image-url";
129
- import "react-is";
130
132
  import "lodash-es/pickBy.js";
131
133
  import "swr";
132
134
  import "@sanity/icons/ChevronDown";
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAUO,SAAAA,oCAAAC,OAAA;AAAA,QAAAC,IAAAC,EAAA,EAAA,GAGL;AAAA,IAAAC;AAAAA,EAAAA,IAAkBH,OAClB;AAAA,IAAAI;AAAAA,EAAAA,IAAYC,eAAAA;AAAgB,MAAAC;AAAAL,WAAAE,WAEaG,KAAAA,MAAA;AACvCC,WAAMC,KAAM,yCAAyC,UAAU,qBAAqB,GACpFL,QAAAA;AAAAA,EAAS,GACVF,OAAAE,SAAAF,OAAAK,MAAAA,KAAAL,EAAA,CAAA;AAHD,QAAAQ,uBAA6BH;AAGhB,MAAAI;AAAAT,WAAAG,KAKDM,KAAAN,EAAE,yCAAyC,GAACH,OAAAG,GAAAH,OAAAS,MAAAA,KAAAT,EAAA,CAAA;AAAA,MAAAU;AAAAV,WAAAG,KAK1CO,KAAAP,EAAE,kDAAkD,GAACH,OAAAG,GAAAH,OAAAU,MAAAA,KAAAV,EAAA,CAAA;AAAA,MAAAW;AAAAX,IAAA,CAAA,MAAAQ,wBAAAR,SAAAU,MAFvDC,KAAA;AAAA,IAAAC,eACS;AAAA,MAAAC,MACPH;AAAAA,MAAqDI,SAClDN;AAAAA,MAAoBO,MACvB;AAAA,IAAA;AAAA,EACR,GACDf,OAAAQ,sBAAAR,OAAAU,IAAAV,OAAAW,MAAAA,KAAAX,EAAA,CAAA;AAAA,MAAAgB;AAAAhB,WAAAG,KAGQa,KAAAb,EAAE,0CAA0C,GAACH,OAAAG,GAAAH,QAAAgB,MAAAA,KAAAhB,EAAA,EAAA;AAAA,MAAAiB;AAAAjB,YAAAgB,MADtDC,yBAAC,OAAA,EAAa,OAAA,GACZ,UAAA,oBAAC,MAAA,EAAMD,UAAAA,GAAAA,CAA8C,GACvD,GAAQhB,QAAAgB,IAAAhB,QAAAiB,MAAAA,KAAAjB,EAAA,EAAA;AAAA,MAAAkB;AAAA,SAAAlB,EAAA,EAAA,MAAAE,WAAAF,EAAA,EAAA,MAAAS,MAAAT,EAAA,EAAA,MAAAW,MAAAX,UAAAiB,MAfVC,KAAA,oBAAC,QAAA,EACI,IAAA,oCACK,QAAAT,IACD,OAAA,GACEP,SACD,QAAAS,IAQRM,UAAAA,IAGF,GAASjB,QAAAE,SAAAF,QAAAS,IAAAT,QAAAW,IAAAX,QAAAiB,IAAAjB,QAAAkB,MAAAA,KAAAlB,EAAA,EAAA,GAhBTkB;AAgBS;ACpBb,SAASC,gBAAgBC,OAAoB;AAC3C,SACEA,MAAMC,eAAe,OACrB,OAAOD,MAAME,SAASC,QAAS,YAC/B,UAAUH,MAAME,SAASC;AAE7B;AAMO,SAASC,mBACdC,QACAC,aAC2B;AAC3B,QAAM;AAAA,IAACC;AAAAA,EAAAA,IAAaF,OAAOG,OAAAA;AAS3B,SAFgBH,OAAOI,WAAW;AAAA,IAACC,YAAY;AAAA,EAAA,CAAK,EAErCC,WACZC,QAA+B;AAAA,IAC9BC,KAAK,YAAYN,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAU1BO,KAAK,+BAA+BR,WAAW;AAAA,EAAA,CAChD,EACAS,KACCC,WAAYhB,CAAAA,UAAuB;AAGjC,QAFAiB,QAAQjB,MAAMA,KAAK,GAEfD,gBAAgBC,KAAK;AAGvB,aAAOkB,GAAGlB,MAAME,SAASC,IAA6B;AAKxD,UAAMH;AAAAA,EACR,CAAC,GACDmB,IAAI,CAAC;AAAA,IAACC;AAAAA,EAAAA,MAAUA,IAAI,CACtB;AACJ;AC5DA,MAAMC,eAAe,KACfC,oDAAoD;AAE1D,SAASC,iCACPlB,QACAmB,qBAC4B;AAC5B,QAAMC,mBAAmB,IAAIC,gBAA+B,IAAI,GAC1DC,aAAa,IAAID,gBAAyB,EAAK,GAC/CE,4BAA4B,IAAIF,gBAA+B,IAAI;AAwCzE,SAAO;AAAA,IACLG,wBAvC6BJ,iBAAiBV,KAC9Ce,UAAWC,WAEPA,UAAU;AAAA,IAEVJ,WAAWK,SAAAA,MAAe,MAC1BJ,0BAA0BI,SAAAA,MAAeR,uBAEzCG,WAAWM,KAAK,EAAK,GAEd7B,mBAAmBC,QAAQ,uBAAuB,EAAEU,KACzDmB,IAAI,MAAMN,0BAA0BK,KAAKT,mBAAmB,CAAC,GAC7DL,IAAKC,CAAAA,SAASA,KAAKe,4BAA4B,GAC/CnB,WAAYhB,CAAAA,UAAU;AAGpB,UAFAiB,QAAQjB,MAAM,qCAAqCA,KAAK,GAEpD,CAAC+B,MAAO,OAAM/B;AAGlB,aAAOkB,GAAGa,KAAK;AAAA,IACjB,CAAC,GACDD,UAAWM,CAAAA,eACTX,iBAAiBQ,KAAKG,SAAS,GAE/BC,MAAMhB,YAAY,EAAEiB,UAAU,MAAM;AAClCX,iBAAWM,KAAK,EAAI,GACpBL,0BAA0BK,KAAK,IAAI;AAAA,IACrC,CAAC,GAEMf,GAAGkB,SAAS,EACpB,CACH,KAGKlB,GAAGa,KAAK,CAChB,CACH;AAAA,EAAA;AAKF;AAYO,MAAMQ,2BAA2BA,MAAA;AAAA,QAAA3D,IAAAC,EAAA,CAAA,GACtC2D,gBAAsBC,oBACtB;AAAA,IAAArB,MAAAsB;AAAAA,EAAAA,IAA+BC,kBAAAA;AAAmB,MAAA1D;AAAAL,IAAA,CAAA,6BAAAgE,IAAA,2BAAA,KACzB3D,KAAA;AAAA,IAAAyB,YAAa;AAAA,EAAA,GAAc9B,OAAAK,MAAAA,KAAAL,EAAA,CAAA;AAApD,QAAAyB,SAAewC,UAAU5D,EAA2B,GAEpDuC,sBAA4BkB,gBAAcI,UAAd;AAA2B,MAAAzD;AAAAT,WAAA4C,uBAG1BnC,KAAA;AAAA,IAAAmC;AAAAA,EAAAA,GAAqB5C,OAAA4C,qBAAA5C,OAAAS,MAAAA,KAAAT,EAAA,CAAA;AAAlD,QAAAmE,QAA6B1D;AAA8C,MAAA2D;AAAA,SAAApE,EAAA,CAAA,MAAAyB,UAAAzB,SAAAmE,SAAAnE,EAAA,CAAA,MAAA4D,iBAGzEQ,qBACER,cAAaS,IAAiC;AAAA,IAAAC,cAC9B,CAAC7C,QAAQ0C,KAAK;AAAA,IAACI,WAClB7B;AAAAA,EAAAA,CAC2D,KAAlEC,iCAAiClB,QAAQ0C,MAAKvB,mBAAoB,GAE1EgB,cAAaY,IAAK;AAAA,IAAAD,WACL7B;AAAAA,IAAiD+B,OACrDL;AAAAA,IAAkBE,cACX,CAAC7C,QAAQ0C,KAAK;AAAA,EAAA,CAC7B,GAACnE,OAAAyB,QAAAzB,OAAAmE,OAAAnE,OAAA4D,eAAA5D,OAAAoE,sBAAAA,qBAAApE,EAAA,CAAA,GAEFoE;AAAyB,GCrFvBM,0CAA0C;AAEhD,SAASC,yBAAyBlD,QAA0C;AAc1E,SAAO;AAAA,IACLmD,gBAdqBpD,mBAAmBC,QAAQ,eAAe,EAAEU,KACjEI,IAAKC,CAAAA,UAAU;AAAA,MACbqC,qBAAqBrC,KAAKqC;AAAAA,MAC1BC,uBAAuBtC,KAAKsC;AAAAA,IAAAA,EAC5B,GACFC,YAAY,CAAC,GACb3C,WAAYhB,CAAAA,WACViB,QAAQjB,MAAM,kCAAkCA,KAAK,GAE9CkB,GAAG,IAAI,EACf,CACH;AAAA,EAAA;AAKF;AAYO,MAAM0C,mBAA6CA,MAAA;AAAA,QAAAhF,IAAAC,EAAA,CAAA,GACxD2D,gBAAsBC,iBAAAA;AAAkB,MAAAxD;AAAAL,IAAA,CAAA,6BAAAgE,IAAA,2BAAA,KACf3D,KAAA;AAAA,IAAAyB,YAAa;AAAA,EAAA,GAAc9B,OAAAK,MAAAA,KAAAL,EAAA,CAAA;AAApD,QAAAyB,SAAewC,UAAU5D,EAA2B;AAAC,MAAA+D;AAAA,SAAApE,EAAA,CAAA,MAAAyB,UAAAzB,SAAA4D,iBAGnDQ,qBACER,cAAaS,IAAyB;AAAA,IAAAC,cACtB,CAAC7C,MAAM;AAAA,IAAC8C,WACXG;AAAAA,EAAAA,CACwB,KAA/BC,yBAAyBlD,MAAM,GAEvCmC,cAAaY,IAAK;AAAA,IAAAD,WACLG;AAAAA,IAAuCD,OAC3CL;AAAAA,IAAkBE,cACX,CAAC7C,MAAM;AAAA,EAAA,CACtB,GAACzB,OAAAyB,QAAAzB,OAAA4D,eAAA5D,OAAAoE,sBAAAA,qBAAApE,EAAA,CAAA,GAEFoE;AAAyB;AC7C7B,MAAMa,wCAAwCC,MAAM;AAAA,EAGlDC,cAAc;AACZ,UAAM,4BAA4B,GAClC,KAAKC,OAAO,mCACZ,KAAKC,UAAU;AAAA,MACbC,MAAM;AAAA,IAAA;AAAA,EAEV;AACF;AAMO,SAAAC,uBAAAxF,OAAA;AAAA,QAAAC,IAAAC,EAAA,EAAA,GACL,CAAAuF,kBAAAC,mBAAA,IAAgDC,SAAS,EAAK,GAC9D;AAAA,IAAAlD,MAAAmD;AAAAA,EAAAA,IAAkC5B,qBAClC;AAAA,IAAA6B,SAAAC;AAAAA,EAAAA,IAA4CC,kBAAkBC,SAAQC,eAAgB;AAAC,MAAA3F;AAAAL,IAAA,CAAA,6BAAAgE,IAAA,2BAAA,KAC3B3D,KAAA;AAAA,IAAA4F,SACjD;AAAA,IAA2BC,SAC3B;AAAA,EAAA,GACVlG,OAAAK,MAAAA,KAAAL,EAAA,CAAA;AAHD,QAAA;AAAA,IAAAmG;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,EAAAA,IAA8CC,cAAcjG,EAG3D,GACDkG,QAAcC,YACd;AAAA,IAAArG;AAAAA,EAAAA,IAAYC,eAAAA;AAAgB,MAAAK;AAAAT,WAAA2F,qBAGpBlF,KAAAkF,kBAAiBc,OAAQC,KAA8C,GAAC1G,OAAA2F,mBAAA3F,OAAAS,MAAAA,KAAAT,EAAA,CAAA;AADhF,QAAA2G,wBACQlG;AAEP,MAAAC;AAAAkG,OAAA;AAOC,QAAI,CAACf,0BAAwB;AAC3BnF,WAAO;AAAP,YAAAkG;AAAAA,IAAe;AAEjBlG,SAAO;AAAA,EAAS;AARlB,QAAAmG,OAAanG;AASiB,MAAAC;AAAAX,WAAAoG,iBAEezF,KAAAA,MAAA;AAC3CyF,kBAAaU,qBAAAA;AAAAA,EAAuB,GACrC9G,OAAAoG,eAAApG,OAAAW,MAAAA,KAAAX,EAAA,CAAA;AAFD,QAAA+G,2BAAiCpG;AAEd,MAAAK;AAAAhB,WAAAoG,iBAE4BpF,KAAAA,MAAA;AAC7CoF,kBAAaY,uBAAAA;AAAAA,EAAyB,GACvChH,OAAAoG,eAAApG,OAAAgB,MAAAA,KAAAhB,EAAA,CAAA;AAFD,QAAAiH,6BAAmCjG;AAEhB,MAAAC;AAAAjB,WAAAoG,iBAEanF,KAAAA,MAAA;AAC9BwE,wBAAoB,EAAK,GACzBW,cAAac,gBAAAA;AAAAA,EAAkB,GAChClH,OAAAoG,eAAApG,OAAAiB,MAAAA,KAAAjB,EAAA,CAAA;AAHD,QAAAmH,cAAoBlG,IAKpB,CAAAmG,cAAAC,eAAA,IAAwC3B,SAAwB,IAAI,GACpE,CAAA4B,4BAAAC,6BAAA,IAAoE7B,SAAS,EAAK;AAAC,MAAAxE;AAAAlB,IAAA,CAAA,MAAAqG,YAAArG,EAAA,EAAA,MAAAG,KAAAH,EAAA,EAAA,MAAAoG,iBAAApG,UAAAuG,SAGjFrF,KAAAsG,CAAAA,QAAA;AAAC,UAAAC,SAAAD,QAAAE,SAAA,WAAAF;AACC,QAAInB,UAAQ;AACVE,YAAKoB,KAAM;AAAA,QAAAC,QACD;AAAA,QAAOC,OACR1H,EAAE,iCAAiC;AAAA,QAAC2H,UACjC;AAAA,MAAA,CACX;AAAC;AAAA,IAAA;AAIJrC,wBAAoB,EAAI,GAExBW,cAAa2B,aAAcN,MAAM;AAAA,EAAC,GACnCzH,OAAAqG,UAAArG,QAAAG,GAAAH,QAAAoG,eAAApG,QAAAuG,OAAAvG,QAAAkB,MAAAA,KAAAlB,EAAA,EAAA;AAdH,QAAAgI,mBAAyB9G,IAkBzB;AAAA,IAAA0D;AAAAA,EAAAA,IAAyBI,oBACzB;AAAA,IAAA/B;AAAAA,EAAAA,IAAiCU,yBAAAA;AAA0B,MAAA6D;AAAAxH,IAAA,EAAA,MAAA2F,kBAAAzB,UAAAlE,EAAA,EAAA,MAAAgI,oBAAAhI,EAAA,EAAA,MAAA2G,sBAAAzC,UAAAlE,EAAA,EAAA,MAAA6G,QAAA7G,EAAA,EAAA,MAAAiD,0BAAAjD,EAAA,EAAA,MAAA4E,kBAGzD4C,YAAAS,IAAAC,KAAAC,iBAAA;AAEE,UAAAC,aAAAF,QAAAR,SAAA,KAAAQ,KAGAG,WAAiBA,MAAA;AAEf,UADAL,oBACII;AACF,cAAM,IAAInD,gCAAAA;AACX,aACM;AAAA,IAAK;AAGd,QAAI4B,SAAS;AACXsB,aAAAA,eAAe,EAAK,GACbE,SAAAA;AAqBT,UAAAC,SAAe,OAlBU,YAAA;AACvB,UAAA;AAAA,eAES,MAAMC,QAAOC,IAAK,CACvBC,eAAexF,sBAAsB,GACrCwF,eACE7D,eAAczC,KACZmB,IAAIoF,CAAAA,UAAWrB,gBAAgBqB,OAAK5D,yBAAL,IAAoC,CAAC,CACtE,CACF,CAAC,CACF;AAAA,MAAC,SAAA6D,KAAA;AAEFtG,eAAAA,QAAOjB,MAAO,2DADPwH,GACmE,GAEnE;AAAA,MAAI;AAAA,IACZ,GAAA;AAMH,QAAIN,WAAW;AACbH,aAAAA,eAAe,EAAI,GACZF,GAAAA;AAGT,UAAA,CAAA1E,8BAAAsF,aAAA,IAAsDP;AAEtD,QAAIO,kBAAkB,QAAQtF,iCAAiC;AAC7D4E,aAAAA,eAAe,EAAI,GACZF,GAAAA;AAGT,UAAA;AAAA,MAAAnD;AAAAA,MAAAD;AAAAA,IAAAA,IAAqDgE;AAIrD,QAAI/D,0BAA0B,GAAC;AAG7B,UAFAqD,eAAe,EAAK,GACpBZ,8BAA8B,EAAI,GAC9Ba;AACF,cAAM,IAAInD,gCAAAA;AACX,aACM;AAAA,IAAK;AAKd,QAAI1B,iCAAiC;AACnC4E,aAAAA,eAAe,EAAI,GACZF,GAAAA;AAGT,UAAAa,4BAAkCnC,uBAAqBzC,UAArB,GAIlC6E,uCAH8BpD,mBAAiBzB,UAAjB,MAGuCW,qBAGrEmE,kCACElE,0BAA0B,QAAQgE,6BAA6BhE,uBACjEmE,uBACEnE,0BAA0B,QAAQvB,gCAAgCuB;AAOpE,WAJEiE,uCAAAC,mCAAAC,wBAKAd,eAAe,EAAK,GACbE,SAAAA,MAGTF,eAAe,EAAI,GACZF,GAAAA;AAAAA,EAAI,GACZjI,EAAA,EAAA,IAAA2F,kBAAAzB,QAAAlE,QAAAgI,kBAAAhI,EAAA,EAAA,IAAA2G,sBAAAzC,QAAAlE,QAAA6G,MAAA7G,QAAAiD,wBAAAjD,QAAA4E,gBAAA5E,QAAAwH,MAAAA,KAAAxH,EAAA,EAAA;AAhGH,QAAAkJ,8BAAoC1B;AAyGnC,MAAAU;AAAAlI,YAAAgI,oBAGCE,KAAAiB,CAAAA,YAAA;AACE9B,oBAAgBqB,OAAK,GACrBV,iBAAAA;AAAAA,EAAkB,GACnBhI,QAAAgI,kBAAAhI,QAAAkI,MAAAA,KAAAlI,EAAA,EAAA;AAJH,QAAAoJ,wBAA8BlB;AAM7B,MAAAS;AAAA3I,IAAA,EAAA,MAAAkJ,+BAAAlJ,EAAA,EAAA,MAAAgI,oBAAAhI,EAAA,EAAA,MAAA6G,QAAA7G,UAAAoJ,yBAAApJ,EAAA,EAAA,MAAAoG,iBAAApG,EAAA,EAAA,MAAAmG,cAAAnG,EAAA,EAAA,MAAAwF,oBAGQmD,KAAA;AAAA,IAAA9B;AAAAA,IAAArB;AAAAA,IAAA0D;AAAAA,IAAAE;AAAAA,IAAAhD;AAAAA,IAAAD;AAAAA,IAAA6B;AAAAA,EAAAA,GAQNhI,QAAAkJ,6BAAAlJ,QAAAgI,kBAAAhI,QAAA6G,MAAA7G,QAAAoJ,uBAAApJ,QAAAoG,eAAApG,QAAAmG,YAAAnG,QAAAwF,kBAAAxF,QAAA2I,MAAAA,KAAA3I,EAAA,EAAA;AATH,QAAAqJ,WACSV;AAkBR,MAAAW;AAAAtJ,YAAAoH,gBAGQkC,MAAAlC,iBAAiB,OAAjBM,SAAA;AAAA,IAAAN;AAAAA,EAAAA,GAAgEpH,QAAAoH,cAAApH,QAAAsJ,OAAAA,MAAAtJ,EAAA,EAAA;AADzE,QAAAuJ,gBACSD;AAER,MAAAE;AAAAxJ,YAAAmH,eAAAnH,EAAA,EAAA,MAAA+G,4BAAA/G,EAAA,EAAA,MAAAiH,8BAAAjH,EAAA,EAAA,MAAAuJ,iBAAAvJ,UAAAmG,cAAAnG,EAAA,EAAA,MAAAwF,oBAGQgE,MAAA;AAAA,IAAAhH,MACC2D;AAAAA,IAAU5F,MACViF;AAAAA,IAAgB+D;AAAAA,IAAArJ,SAEbiH;AAAAA,IAAWsC,gBACJ1C;AAAAA,IAAwB2C,kBACtBzC;AAAAA,EAAAA,GACnBjH,QAAAmH,aAAAnH,QAAA+G,0BAAA/G,QAAAiH,4BAAAjH,QAAAuJ,eAAAvJ,QAAAmG,YAAAnG,QAAAwF,kBAAAxF,QAAAwJ,OAAAA,MAAAxJ,EAAA,EAAA;AARH,QAAA2J,cACSH;AAgBR,MAAAI;AAAA5J,IAAA,EAAA,MAAA2J,eAAA3J,UAAAsH,8BAKIsC,MAAAtC,iDACE,qCAAA,EAA6C,SAAA,MAAMC,8BAA8B,EAAK,EAAA,CAAC,IAExF,oBAAC,cAAA,EAAY,GAAKoC,aAAW,GAC9B3J,QAAA2J,aAAA3J,QAAAsH,4BAAAtH,QAAA4J,OAAAA,MAAA5J,EAAA,EAAA;AAAA,MAAA6J;AAAA,SAAA7J,EAAA,EAAA,MAAAqJ,YAAArJ,EAAA,EAAA,MAAAD,MAAA+J,YAAA9J,EAAA,EAAA,MAAA4J,OANHC,MAAA,qBAAA,sBAAA,UAAA,EAAuCR,OAAAA,UACpCtJ,UAAAA;AAAAA,IAAAA,MAAK+J;AAAAA,IACLF;AAAAA,EAAAA,GAKH,GAAiC5J,QAAAqJ,UAAArJ,EAAA,EAAA,IAAAD,MAAA+J,UAAA9J,QAAA4J,KAAA5J,QAAA6J,OAAAA,MAAA7J,EAAA,EAAA,GAPjC6J;AAOiC;AAxO9B,SAAAnD,MAAAqD,SAAA;AAAA,SAYyC,CAACC,wBAAwBD,OAAO;AAAC;ACzC1E,SAAAE,qBAAAlK,OAAA;AAAA,QAAAC,IAAAC,EAAA,CAAA;AAGL,MAAI,CAF0BiK,4BAEJ;AAAA,QAAA7J;AAAA,WAAAL,SAAAD,SACjBM,MAAAN,MAAKoK,cAAepK,KAAK,GAACC,OAAAD,OAAAC,OAAAK,OAAAA,MAAAL,EAAA,CAAA,GAA1BK;AAAAA,EAA0B;AAClC,MAAAA;AAAAL,WAAAD,SAI8BM,KAAAN,MAAKoK,cAAepK,KAAK,GAACC,OAAAD,OAAAC,OAAAK,MAAAA,KAAAL,EAAA,CAAA;AAAA,MAAAS;AAAA,SAAAT,SAAAK,MADvDI,KAAA,oBAAC,wBAAA,EACC,UAAA,oBAAC,0BAAA,EAA0BJ,UAAAA,IAA2B,EAAA,CACxD,GAAyBL,OAAAK,IAAAL,OAAAS,MAAAA,KAAAT,EAAA,CAAA,GAFzBS;AAEyB;"}
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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"}
@@ -109,16 +109,18 @@ import "observable-callback";
109
109
  import "@sanity/util/content";
110
110
  import "@sanity/icons/BulbOutline";
111
111
  import "@sanity/icons/Unknown";
112
+ import "@sanity/client/stega";
112
113
  import "@sanity/icons/ToggleArrowRight";
113
114
  import "lodash-es/isPlainObject.js";
114
- import "@sanity/insert-menu";
115
+ import "@sanity/icons/ThLarge";
116
+ import "@sanity/icons/Ulist";
117
+ import "lodash-es/startCase.js";
115
118
  import "@dnd-kit/sortable";
116
119
  import "@sanity/icons/DragHandle";
117
120
  import "@sanity/icons/AddDocument";
118
121
  import "@sanity/icons/InsertAbove";
119
122
  import "@sanity/icons/InsertBelow";
120
123
  import { useVirtualizer } from "@tanstack/react-virtual";
121
- import "lodash-es/startCase.js";
122
124
  import "speakingurl";
123
125
  import "@portabletext/react";
124
126
  import "@sanity/icons/LinkRemoved";