sanity
Version:
Sanity is a real-time content infrastructure with a scalable, hosted backend featuring a Graph Oriented Query Language (GROQ), asset pipelines and fast edge caches
1 lines • 52.8 kB
Source Map (JSON)
{"version":3,"file":"presentation.mjs","sources":["../../src/presentation/overlays/useSharedState.ts","../../src/presentation/constants.ts","../../src/presentation/i18n/index.ts","../../src/presentation/useDocumentLocations.ts","../../src/presentation/usePresentationTool.ts","../../src/presentation/document/useCurrentPresentationToolName.ts","../../src/presentation/document/LocationsBanner.tsx","../../src/presentation/document/PresentationDocumentHeader.tsx","../../src/presentation/document/PresentationDocumentProvider.tsx","../../src/presentation/fieldActions/openInStructure.ts","../../src/presentation/getIntentState.ts","../../src/presentation/PresentationSpinner.tsx","../../src/presentation/router.ts","../../src/presentation/plugin.tsx","../../src/presentation/usePresentationNavigate.ts","../../src/presentation/usePresentationParams.ts"],"sourcesContent":["import {type Serializable} from '@sanity/presentation-comlink'\nimport {useContext, useEffect} from 'react'\nimport {PresentationSharedStateContext} from 'sanity/_singletons'\n\n/** @public */\nexport const useSharedState = (key: string, value: Serializable): undefined => {\n const context = useContext(PresentationSharedStateContext)\n\n if (!context) {\n throw new Error('Preview Snapshots context is missing')\n }\n\n const {setValue} = context\n\n useEffect(() => {\n setValue(key, value)\n }, [key, value, setValue])\n\n return undefined\n}\n","import {ComposeIcon} from '@sanity/icons'\nimport {apiVersion} from '@sanity/preview-url-secret/constants'\n\nexport const DEFAULT_TOOL_ICON = ComposeIcon\nexport const DEFAULT_TOOL_NAME = 'presentation'\nexport const DEFAULT_TOOL_TITLE = 'Presentation'\n\nexport const EDIT_INTENT_MODE = 'presentation'\n\n// How long we wait until an iframe is loaded until we consider it to be slow and possibly failed\nexport const MAX_TIME_TO_OVERLAYS_CONNECTION = 3_000 // ms\n\n// The API version to use when using `@sanity/client`\nexport const API_VERSION = apiVersion\n\n// Heartbeats shouldn't fire on intervals that are so short it causes performance issues\nexport const MIN_LOADER_QUERY_LISTEN_HEARTBEAT_INTERVAL = 1000 // ms\n\n// How often the list over loader queries should be garbage collected\nexport const LOADER_QUERY_GC_INTERVAL = 30_000 // ms\n\n// The interval at which we check if existing popups have been closed\nexport const POPUP_CHECK_INTERVAL = 1000 // ms\n","import {defineLocaleResourceBundle} from 'sanity'\n\n/**\n * The locale namespace for the presentation tool\n *\n * @public\n */\nexport const presentationLocaleNamespace = 'presentation' as const\n\n/**\n * The default locale bundle for the presentation tool, which is US English.\n *\n * @internal\n */\nexport const presentationUsEnglishLocaleBundle = defineLocaleResourceBundle({\n locale: 'en-US',\n namespace: presentationLocaleNamespace,\n resources: () => import('./resources'),\n})\n","import {useEffect, useMemo, useState} from 'react'\nimport {isObservable, map, of} from 'rxjs'\nimport {\n type ObjectSchemaType,\n type PreviewableType,\n useDocumentPreviewStore,\n useDocumentStore,\n usePerspective,\n} from 'sanity'\n\nimport {\n type DocumentLocationResolver,\n type DocumentLocationResolvers,\n type DocumentLocationsState,\n type DocumentLocationsStatus,\n} from './types'\n\nconst INITIAL_STATE: DocumentLocationsState = {locations: []}\n\nexport function useDocumentLocations(props: {\n id: string\n version: string | undefined\n resolvers?: DocumentLocationResolver | DocumentLocationResolvers\n type: ObjectSchemaType\n}): {\n state: DocumentLocationsState\n status: DocumentLocationsStatus\n} {\n const {id, resolvers, type, version} = props\n const documentStore = useDocumentStore()\n const documentPreviewStore = useDocumentPreviewStore()\n\n const {perspectiveStack} = usePerspective()\n const [locationsState, setLocationsState] = useState<DocumentLocationsState>(INITIAL_STATE)\n\n const resolver = resolvers && (typeof resolvers === 'function' ? resolvers : resolvers[type.name])\n\n const [locationsStatus, setLocationsStatus] = useState<DocumentLocationsStatus>(\n resolver ? 'resolving' : 'empty',\n )\n\n const result = useMemo(() => {\n if (!resolver) return undefined\n\n // Original/advanced resolver which requires explicit use of Observables\n if (typeof resolver === 'function') {\n const params = {id, type: type.name, version, perspectiveStack}\n const context = {documentStore}\n const _result = resolver(params, context)\n return isObservable(_result) ? _result : of(_result)\n }\n\n // Simplified resolver pattern which abstracts away Observable logic\n if ('select' in resolver && 'resolve' in resolver) {\n const doc = {_type: 'reference', _ref: id}\n // Override the preview selection in the schema type to use the user\n // defined selection defined by the resolver\n const _type = {...type, preview: {select: resolver.select}} satisfies PreviewableType\n const options = {perspective: perspectiveStack}\n return documentPreviewStore\n .observeForPreview(doc, _type, options)\n .pipe(map((preview) => resolver.resolve(preview.snapshot || null)))\n }\n\n // Resolver is explicitly provided state\n return of(resolver)\n }, [documentStore, documentPreviewStore, id, resolver, type, version, perspectiveStack])\n\n useEffect(() => {\n const sub = result?.subscribe((state) => {\n setLocationsState(state || INITIAL_STATE)\n setLocationsStatus(state ? 'resolved' : 'empty')\n })\n\n return () => sub?.unsubscribe()\n }, [result])\n\n return {\n state: locationsState,\n status: locationsStatus,\n }\n}\n","import {useContext} from 'react'\nimport {PresentationContext} from 'sanity/_singletons'\n\nimport {type PresentationContextValue} from './types'\n\nexport function usePresentationTool(throwOnMissingContext?: true): PresentationContextValue\nexport function usePresentationTool(throwOnMissingContext: false): PresentationContextValue | null\nexport function usePresentationTool(throwOnMissingContext = true): PresentationContextValue | null {\n const presentation = useContext(PresentationContext)\n\n if (throwOnMissingContext && !presentation) {\n throw new Error('Presentation context is missing')\n }\n\n return presentation\n}\n","import {usePresentationTool} from '../usePresentationTool'\n\nexport function useCurrentPresentationToolName(): string | undefined {\n return usePresentationTool(false)?.name ?? undefined\n}\n","import {\n ChevronRightIcon,\n DesktopIcon,\n ErrorOutlineIcon,\n InfoOutlineIcon,\n WarningOutlineIcon,\n} from '@sanity/icons'\nimport {Box, Card, Flex, Spinner, Stack, Text} from '@sanity/ui'\nimport {type ComponentType, type ReactNode, useCallback, useContext, useState} from 'react'\nimport {type ObjectSchemaType, useTranslation} from 'sanity'\nimport {PresentationContext} from 'sanity/_singletons'\nimport {useIntentLink} from 'sanity/router'\n\nimport {DEFAULT_TOOL_NAME, DEFAULT_TOOL_TITLE} from '../constants'\nimport {presentationLocaleNamespace} from '../i18n'\nimport {\n type DocumentLocation,\n type DocumentLocationResolver,\n type DocumentLocationResolvers,\n type PresentationPluginOptions,\n} from '../types'\nimport {useDocumentLocations} from '../useDocumentLocations'\nimport {useCurrentPresentationToolName} from './useCurrentPresentationToolName'\n\nconst TONE_ICONS: Record<'positive' | 'caution' | 'critical', ComponentType> = {\n positive: InfoOutlineIcon,\n caution: WarningOutlineIcon,\n critical: ErrorOutlineIcon,\n}\n\nexport function LocationsBanner(props: {\n documentId: string\n options: PresentationPluginOptions\n resolvers?: DocumentLocationResolver | DocumentLocationResolvers\n schemaType: ObjectSchemaType\n showPresentationTitle: boolean\n version: string | undefined\n}): ReactNode {\n const {documentId, options, resolvers, schemaType, showPresentationTitle, version} = props\n\n const {state, status} = useDocumentLocations({\n id: documentId,\n version,\n resolvers,\n type: schemaType,\n })\n\n const isResolving = status === 'resolving'\n\n const {locations, message, tone} = state\n const locationsCount = locations?.length || 0\n\n const {t} = useTranslation(presentationLocaleNamespace)\n const presentation = useContext(PresentationContext)\n const presentationName = presentation?.name\n const [expanded, setExpanded] = useState(false)\n const toggle = useCallback(() => {\n if (!locationsCount) return\n setExpanded((v) => !v)\n }, [locationsCount])\n\n const title = isResolving\n ? t('locations-banner.resolving.text')\n : message || t('locations-banner.locations-count', {count: locationsCount})\n\n const ToneIcon = tone ? TONE_ICONS[tone] : undefined\n\n if (!resolvers || status === 'empty') return null\n return (\n <Card padding={1} radius={2} border tone={tone}>\n <div style={{margin: -1}}>\n {!locations && (\n <Flex align=\"flex-start\" gap={3} padding={3}>\n {tone && ToneIcon && (\n <Box flex=\"none\">\n <Text size={1}>\n <ToneIcon />\n </Text>\n </Box>\n )}\n <Box flex={1}>\n <Text size={1} weight=\"medium\">\n {showPresentationTitle && <>{options.title || DEFAULT_TOOL_TITLE} · </>}\n {title}\n </Text>\n </Box>\n </Flex>\n )}\n {locations && (\n <>\n <Card\n as={locationsCount ? 'button' : undefined}\n onClick={toggle}\n padding={3}\n radius={1}\n tone=\"inherit\"\n >\n <Flex gap={3}>\n <Box flex=\"none\">\n {isResolving ? (\n <Spinner size={1} />\n ) : (\n <Text size={1}>\n {locationsCount === 0 ? (\n <InfoOutlineIcon />\n ) : (\n <ChevronRightIcon\n style={{\n transform: `rotate(${expanded ? '90deg' : 0})`,\n transition: 'transform 100ms ease-in-out',\n }}\n />\n )}\n </Text>\n )}\n </Box>\n <Box flex={1}>\n <Text size={1} weight=\"medium\">\n {showPresentationTitle && <>{options.title || DEFAULT_TOOL_TITLE} · </>}\n {title}\n </Text>\n </Box>\n </Flex>\n </Card>\n <Stack hidden={!expanded} marginTop={1} space={1}>\n {locations.map((l) => {\n let active = false\n if (\n (options.name || DEFAULT_TOOL_NAME) === presentationName &&\n presentation?.params.preview\n ) {\n active = areUrlsMatching(presentation.params.preview, l.href)\n }\n\n return (\n <LocationItem\n key={l.href}\n active={active}\n documentId={documentId}\n documentType={schemaType.name}\n node={l}\n toolName={options.name || DEFAULT_TOOL_NAME}\n />\n )\n })}\n </Stack>\n </>\n )}\n </div>\n </Card>\n )\n}\n\nfunction LocationItem(props: {\n active: boolean\n documentId: string\n documentType: string\n node: DocumentLocation\n toolName: string\n}) {\n const {documentId, documentType, node, active, toolName} = props\n const presentation = useContext(PresentationContext)\n const currentPresentationToolName = useCurrentPresentationToolName()\n const isCurrentTool = toolName === currentPresentationToolName\n const navigate = presentation?.navigate\n\n const presentationLinkProps = useIntentLink({\n intent: 'edit',\n params: {\n id: documentId,\n type: documentType,\n mode: 'presentation',\n presentation: toolName,\n ...presentation?.structureParams,\n preview: node.href,\n },\n })\n\n const handleCurrentToolClick = useCallback(() => {\n navigate?.({params: {preview: node.href}})\n }, [node.href, navigate])\n\n return (\n <Card\n key={node.href}\n {...(isCurrentTool ? {} : presentationLinkProps)}\n as=\"a\"\n onClick={isCurrentTool ? handleCurrentToolClick : presentationLinkProps.onClick}\n padding={3}\n radius={1}\n pressed={active}\n tone=\"inherit\"\n >\n <Flex gap={3}>\n <Box flex=\"none\">\n <Text size={1}>\n <DesktopIcon />\n </Text>\n </Box>\n <Stack flex={1} space={2}>\n <Text size={1} weight=\"medium\">\n {node.title}\n </Text>\n <Text muted size={1} textOverflow=\"ellipsis\">\n {node.href}\n </Text>\n </Stack>\n </Flex>\n </Card>\n )\n}\n\n/**\n * Compares two URLs to determine if they match based on origin, pathname, and search parameters\n * The previewUrl should have all the search parameters that are in the locationUrl\n */\nfunction areUrlsMatching(previewUrlString: string, locationUrlString: string): boolean {\n try {\n const previewUrl = new URL(previewUrlString, location.origin)\n const locationUrl = new URL(locationUrlString, previewUrl.origin)\n\n // First compare origin and pathname\n if (previewUrl.origin !== locationUrl.origin || previewUrl.pathname !== locationUrl.pathname) {\n return false\n }\n\n // Then check search params\n // All search params in locationUrl must exist with the same values in previewUrl\n const locationParams = new URLSearchParams(locationUrl.search)\n const previewParams = new URLSearchParams(previewUrl.search)\n\n for (const [key, value] of locationParams.entries()) {\n if (previewParams.get(key) !== value) {\n return false\n }\n }\n\n return true\n } catch {\n // If URL parsing fails, URLs don't match\n return false\n }\n}\n","import {rem} from '@sanity/ui'\n// eslint-disable-next-line camelcase\nimport {getTheme_v2} from '@sanity/ui/theme'\nimport {type ReactNode, useContext} from 'react'\nimport {type ObjectSchemaType, type PublishedId} from 'sanity'\nimport {PresentationDocumentContext} from 'sanity/_singletons'\nimport {css, styled} from 'styled-components'\n\nimport {type PresentationPluginOptions} from '../types'\nimport {LocationsBanner} from './LocationsBanner'\n\nconst LocationStack = styled.div((props) => {\n const theme = getTheme_v2(props.theme)\n return css`\n display: flex;\n flex-direction: column;\n gap: ${rem(theme.space[2])};\n min-height: ${rem(42)};\n margin-bottom: ${rem(theme.space[5])};\n\n &:empty {\n display: none;\n }\n `\n})\n\nexport function PresentationDocumentHeader(props: {\n documentId: PublishedId\n version: string | undefined\n options: PresentationPluginOptions\n schemaType: ObjectSchemaType\n}): ReactNode {\n const {documentId, options, schemaType, version} = props\n const context = useContext(PresentationDocumentContext)\n\n const contextOptions = context?.options || []\n const resolvers = contextOptions.map((o) => o.resolve?.locations || o.locate)\n const hasResolvers = resolvers.some(Boolean)\n\n if ((context && context.options[0] !== options) || !hasResolvers) {\n return null\n }\n\n return (\n <LocationStack>\n {contextOptions.map((_options, idx) => (\n <LocationsBanner\n // oxlint-disable-next-line no-array-index-key\n key={idx}\n documentId={documentId}\n options={_options}\n resolvers={resolvers[idx]}\n schemaType={schemaType}\n showPresentationTitle={contextOptions.length > 1}\n version={version}\n />\n ))}\n </LocationStack>\n )\n}\n","import {type ReactNode, useCallback, useContext, useLayoutEffect, useMemo, useState} from 'react'\nimport {PresentationDocumentContext} from 'sanity/_singletons'\nimport {useEffectEvent} from 'use-effect-event'\n\nimport {type PresentationPluginOptions} from '../types'\nimport {type PresentationDocumentContextValue} from './types'\n\n/** @internal */\nexport function PresentationDocumentProvider(props: {\n children?: ReactNode\n options: PresentationPluginOptions\n}): React.JSX.Element {\n const {children, options} = props\n const parent = useContext(PresentationDocumentContext)\n const parentRegister = parent?.register\n\n const [optionsArray, setOptionsArray] = useState<PresentationPluginOptions[]>(() => [])\n\n const register = useCallback(\n // eslint-disable-next-line @typescript-eslint/no-shadow\n (options: PresentationPluginOptions) => {\n if (parentRegister) {\n return parentRegister(options)\n }\n\n setOptionsArray((prev) => [options].concat(prev))\n\n return () => {\n setOptionsArray((prev) => prev.filter((o) => o !== options))\n }\n },\n [parentRegister],\n )\n\n const context: PresentationDocumentContextValue = useMemo(\n () => ({\n options: parent?.options || optionsArray,\n register,\n }),\n [optionsArray, parent, register],\n )\n\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const registerEffectEvent = useEffectEvent((options: PresentationPluginOptions) =>\n register(options),\n )\n useLayoutEffect(() => registerEffectEvent(options), [options])\n\n return (\n <PresentationDocumentContext.Provider value={context}>\n {children}\n </PresentationDocumentContext.Provider>\n )\n}\n","import {MasterDetailIcon} from '@sanity/icons'\nimport {useContext, useMemo} from 'react'\nimport {\n defineDocumentFieldAction,\n type DocumentFieldActionGroup,\n type DocumentFieldActionItem,\n type DocumentFieldActionProps,\n isRecord,\n pathToString,\n type Tool,\n useWorkspace,\n} from 'sanity'\nimport {PresentationContext} from 'sanity/_singletons'\nimport {useRouter} from 'sanity/router'\n\nimport {DEFAULT_TOOL_NAME} from '../constants'\n\nfunction useOpenInStructureAction(\n props: DocumentFieldActionProps,\n): DocumentFieldActionItem | DocumentFieldActionGroup {\n const {documentId, documentType, path} = props\n const workspace = useWorkspace()\n const {navigateIntent} = useRouter()\n const presentation = useContext(PresentationContext)\n\n const defaultStructureTool = useMemo(\n () =>\n findStructureTool(\n workspace.tools,\n documentId,\n documentType,\n presentation?.name || DEFAULT_TOOL_NAME,\n ),\n [documentId, documentType, workspace.tools, presentation],\n )\n\n return {\n type: 'action',\n hidden: !presentation || path.length > 0 || !defaultStructureTool,\n icon: defaultStructureTool?.icon || MasterDetailIcon,\n title: `Open in ${defaultStructureTool?.title || 'Structure'}`,\n onAction() {\n navigateIntent('edit', {\n id: documentId,\n type: documentType,\n mode: 'structure',\n path: pathToString(path),\n })\n },\n renderAsButton: true,\n }\n}\n\nexport const openInStructure = defineDocumentFieldAction({\n name: 'presentation/openInStructure',\n useAction: useOpenInStructureAction,\n})\n\nfunction findStructureTool(\n tools: Tool[],\n documentId: string,\n documentType: string,\n presentationToolName?: string,\n): Tool | undefined {\n const results = tools\n .filter((t) => t.name !== presentationToolName)\n .map((t) => {\n const match = t.canHandleIntent?.(\n 'edit',\n {\n id: documentId,\n type: documentType,\n mode: 'structure',\n },\n {},\n )\n\n return {tool: t, match}\n })\n\n const modeMatches = results.filter((t) => isRecord(t.match) && t.match.mode)\n\n if (modeMatches.length > 0) {\n return modeMatches[0].tool\n }\n\n const matches = results.filter((t) => t.match)\n\n return matches[0]?.tool\n}\n","import {uuid} from '@sanity/uuid'\nimport {getPublishedId} from 'sanity'\nimport {encodeJsonParams, type RouterState, type SearchParam} from 'sanity/router'\n\nimport {type PresentationSearchParams, type PresentationStateParams} from './types'\n\nconst preservedSearchParamKeys: Array<keyof PresentationSearchParams> = ['preview', 'viewport']\n\n/**\n * @internal\n */\nexport function getIntentState(\n intent: string,\n params: Record<string, string>,\n routerState: RouterState | undefined,\n payload: unknown,\n):\n | (PresentationStateParams & {_searchParams: SearchParam[]})\n | {intent: string; params: Record<string, string>; payload: unknown} {\n // oxlint-disable-next-line no-unused-vars\n const {id, mode, path, presentation, type, ...searchParams} = params\n\n const preservedSearchParams = (routerState?._searchParams || [])\n // @todo Casting https://github.com/microsoft/TypeScript/issues/14520\n .filter(([key]) => preservedSearchParamKeys.includes(key as keyof PresentationSearchParams))\n .reduce((acc, [key, value]) => ({...acc, [key]: value}), {} as Record<string, string>)\n\n const _searchParams = {\n ...preservedSearchParams,\n ...searchParams,\n }\n\n if (intent === 'edit' && id) {\n _searchParams.preview =\n _searchParams.preview || new URLSearchParams(window.location.search).get('preview') || '/'\n return {\n type: type || '*',\n id: getPublishedId(id),\n path,\n _searchParams: Object.entries(_searchParams),\n }\n }\n\n if (intent === 'create') {\n _searchParams.preview =\n _searchParams.preview || new URLSearchParams(window.location.search).get('preview') || '/'\n\n if (payload && typeof payload === 'object') {\n _searchParams.templateParams = encodeJsonParams(payload as Record<string, unknown>)\n }\n\n return {\n type: type || '*',\n id: id || uuid(),\n _searchParams: Object.entries(_searchParams),\n }\n }\n return {intent, params, payload}\n}\n","import {Flex, Spinner} from '@sanity/ui'\n\nexport function PresentationSpinner(): React.JSX.Element {\n return (\n <Flex align=\"center\" direction=\"column\" height=\"fill\" justify=\"center\" style={{width: '100%'}}>\n <Spinner />\n </Flex>\n )\n}\n","import {route} from 'sanity/router'\n\n// eslint-disable-next-line camelcase\nexport const router = route.create('/', {__unsafe_disableScopedSearchParams: true}, [\n route.intents('/intent'),\n route.create(':type', [route.create(':id', [route.create(':path')])]),\n])\n","import {type SanityDocument} from '@sanity/client'\nimport {lazy, Suspense} from 'react'\nimport {\n definePlugin,\n getPublishedId,\n getVersionFromId,\n type InputProps,\n isDocumentSchemaType,\n} from 'sanity'\n\nimport {DEFAULT_TOOL_ICON, DEFAULT_TOOL_NAME, EDIT_INTENT_MODE} from './constants'\nimport {PresentationDocumentHeader} from './document/PresentationDocumentHeader'\nimport {PresentationDocumentProvider} from './document/PresentationDocumentProvider'\nimport {openInStructure} from './fieldActions/openInStructure'\nimport {getIntentState} from './getIntentState'\nimport {presentationUsEnglishLocaleBundle} from './i18n'\nimport {PresentationSpinner} from './PresentationSpinner'\nimport {router} from './router'\nimport {\n type DocumentLocationResolverObject,\n type DocumentLocationsState,\n type DocumentResolver,\n type PresentationPluginOptions,\n} from './types'\n\nconst PresentationTool = lazy(() => import('./PresentationToolGrantsCheck'))\nconst BroadcastDisplayedDocument = lazy(() => import('./loader/BroadcastDisplayedDocument'))\n\n/**\n * Define locations for a given document type.\n * This function doesn't do anything itself, it is used to provide type information.\n * @param resolver - resolver that return locations for a document.\n * @public\n */\nexport function defineLocations<K extends string>(\n resolver: DocumentLocationResolverObject<K> | DocumentLocationsState,\n): typeof resolver {\n return resolver\n}\n\n/**\n * Define documents for a given location.\n * This function doesn't do anything itself, it is used to provide type information.\n * @param resolvers - resolvers that return documents.\n * @public\n */\nexport function defineDocuments(resolvers: DocumentResolver[]): typeof resolvers {\n return resolvers\n}\n\n/** @public */\nexport const presentationTool = definePlugin<PresentationPluginOptions>((options) => {\n const toolName = options.name || DEFAULT_TOOL_NAME\n\n if ('locate' in options) {\n console.warn('Presentation’s `locate` option is deprecated. Use `resolve.locations` instead.')\n }\n\n const hasLocationsResolver = !!(options.resolve?.locations || options.locate)\n\n function PresentationDocumentInput(props: InputProps) {\n const value = props.value as SanityDocument\n const documentId = value?._id ? getPublishedId(value?._id) : undefined\n const documentVersion = value?._id ? getVersionFromId(value._id) : undefined\n if (isDocumentSchemaType(props.schemaType)) {\n return (\n <PresentationDocumentProvider options={options}>\n {hasLocationsResolver && documentId && (\n <PresentationDocumentHeader\n documentId={documentId}\n version={documentVersion}\n options={options}\n schemaType={props.schemaType}\n />\n )}\n <Suspense fallback={<PresentationSpinner />}>{props.renderDefault(props)}</Suspense>\n <Suspense key=\"broadcast-displayed-document\">\n <BroadcastDisplayedDocument key={documentId} value={value} />\n </Suspense>\n </PresentationDocumentProvider>\n )\n }\n\n return props.renderDefault(props)\n }\n\n function canHandleCreateIntent(params: Record<string, unknown>) {\n // We can't handle create intents without a `type` parameter\n if (!('type' in params)) {\n return false\n }\n\n if ('presentation' in params && params.presentation !== toolName) {\n return false\n }\n\n return 'template' in params ? {template: true} : true\n }\n\n function canHandleEditIntent(params: Record<string, unknown>) {\n // We can't handle edit intents without `type` or `id` parameters\n if (!('type' in params) || !('id' in params)) {\n return false\n }\n\n if ('presentation' in params && params.presentation !== toolName) {\n return false\n }\n\n return 'mode' in params ? {mode: params.mode === EDIT_INTENT_MODE} : true\n }\n\n return {\n i18n: {\n bundles: [presentationUsEnglishLocaleBundle],\n },\n document: {\n unstable_fieldActions: (prev) => {\n return [\n ...prev.filter((a) => a.name !== openInStructure.name), // prevent duplication\n openInStructure,\n ]\n },\n },\n\n form: {\n components: {\n input: PresentationDocumentInput,\n },\n },\n\n tools: [\n {\n icon: options.icon || DEFAULT_TOOL_ICON,\n name: toolName,\n title: options.title,\n component: PresentationTool,\n options,\n canHandleIntent(intent, params) {\n if (intent === 'create') return canHandleCreateIntent(params)\n if (intent === 'edit') return canHandleEditIntent(params)\n return false\n },\n getIntentState,\n router,\n __internalApplicationType: 'sanity/presentation',\n },\n ],\n }\n})\n","import {useContext} from 'react'\nimport {PresentationNavigateContext} from 'sanity/_singletons'\n\nimport {type PresentationNavigateContextValue} from './types'\n\n/** @public */\nexport function usePresentationNavigate(): PresentationNavigateContextValue {\n const navigate = useContext(PresentationNavigateContext)\n\n if (!navigate) {\n throw new Error('Presentation navigate context is missing')\n }\n\n return navigate\n}\n\nexport type {PresentationNavigateContextValue}\n","import {useContext} from 'react'\nimport {PresentationParamsContext} from 'sanity/_singletons'\n\nimport {type PresentationParamsContextValue} from './types'\n\n/** @public */\nexport function usePresentationParams(throwOnMissingContext?: true): PresentationParamsContextValue\n/** @public */\nexport function usePresentationParams(\n throwOnMissingContext: false,\n): PresentationParamsContextValue | null\n/** @public */\nexport function usePresentationParams(\n throwOnMissingContext = true,\n): PresentationParamsContextValue | null {\n const params = useContext(PresentationParamsContext)\n\n if (throwOnMissingContext && !params) {\n throw new Error('Presentation params context is missing')\n }\n\n return params\n}\n"],"names":["useSharedState","key","value","$","_c","context","useContext","PresentationSharedStateContext","Error","setValue","t0","t1","useEffect","DEFAULT_TOOL_ICON","ComposeIcon","DEFAULT_TOOL_NAME","DEFAULT_TOOL_TITLE","EDIT_INTENT_MODE","MAX_TIME_TO_OVERLAYS_CONNECTION","API_VERSION","apiVersion","MIN_LOADER_QUERY_LISTEN_HEARTBEAT_INTERVAL","LOADER_QUERY_GC_INTERVAL","POPUP_CHECK_INTERVAL","presentationLocaleNamespace","presentationUsEnglishLocaleBundle","defineLocaleResourceBundle","locale","namespace","resources","INITIAL_STATE","locations","useDocumentLocations","props","id","resolvers","type","version","documentStore","useDocumentStore","documentPreviewStore","useDocumentPreviewStore","perspectiveStack","usePerspective","locationsState","setLocationsState","useState","resolver","name","locationsStatus","setLocationsStatus","bb0","undefined","params","_result","isObservable","of","doc","_type","_ref","preview","select","options","perspective","t2","resolve","snapshot","observeForPreview","pipe","map","result","sub","subscribe","state","unsubscribe","t3","status","usePresentationTool","throwOnMissingContext","presentation","PresentationContext","useCurrentPresentationToolName","TONE_ICONS","positive","InfoOutlineIcon","caution","WarningOutlineIcon","critical","ErrorOutlineIcon","LocationsBanner","documentId","schemaType","showPresentationTitle","isResolving","message","tone","locationsCount","length","t","useTranslation","presentationName","expanded","setExpanded","_temp","toggle","count","title","ToneIcon","Symbol","for","margin","t4","t5","transform","transition","l","active","href","t6","t7","v","LocationItem","documentType","node","toolName","currentPresentationToolName","isCurrentTool","navigate","structureParams","intent","mode","presentationLinkProps","useIntentLink","handleCurrentToolClick","onClick","t8","t9","areUrlsMatching","previewUrlString","locationUrlString","previewUrl","URL","location","origin","locationUrl","pathname","locationParams","URLSearchParams","search","previewParams","entries","get","LocationStack","styled","div","theme","getTheme_v2","css","rem","space","PresentationDocumentHeader","PresentationDocumentContext","contextOptions","some","Boolean","hasResolvers","_options","idx","o","locate","PresentationDocumentProvider","children","parent","parentRegister","register","optionsArray","setOptionsArray","options_0","prev","concat","prev_0","filter","options_1","registerEffectEvent","useEffectEvent","useLayoutEffect","useOpenInStructureAction","path","workspace","useWorkspace","navigateIntent","useRouter","tools","findStructureTool","defaultStructureTool","icon","MasterDetailIcon","hidden","onAction","pathToString","renderAsButton","openInStructure","defineDocumentFieldAction","useAction","presentationToolName","results","match","canHandleIntent","tool","modeMatches","isRecord","preservedSearchParamKeys","getIntentState","routerState","payload","searchParams","_searchParams","includes","reduce","acc","window","getPublishedId","Object","templateParams","encodeJsonParams","uuid","PresentationSpinner","width","router","route","create","__unsafe_disableScopedSearchParams","intents","PresentationTool","lazy","BroadcastDisplayedDocument","defineLocations","defineDocuments","presentationTool","definePlugin","console","warn","hasLocationsResolver","PresentationDocumentInput","_id","getVersionFromId","documentVersion","isDocumentSchemaType","renderDefault","canHandleCreateIntent","template","canHandleEditIntent","i18n","bundles","document","unstable_fieldActions","a","form","components","input","component","__internalApplicationType","usePresentationNavigate","PresentationNavigateContext","usePresentationParams","PresentationParamsContext"],"mappings":"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