UNPKG

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 • 53 kB
{"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} &middot; </>}\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} &middot; </>}\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 active={active}\n documentId={documentId}\n documentType={schemaType.name}\n key={l.href}\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?.({}, {preview: node.href})\n }, [node.href, navigate])\n\n return (\n <Card\n {...(isCurrentTool ? {} : presentationLinkProps)}\n as=\"a\"\n key={node.href}\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 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 // eslint-disable-next-line @typescript-eslint/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 // eslint-disable-next-line no-console\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","undefined","bb0","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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