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

316 lines (282 loc) • 7.62 kB
import {type ClientPerspective, type StackablePerspective} from '@sanity/client' import {type ChannelInstance} from '@sanity/comlink' import { type LoaderControllerMsg, type LoaderNodeMsg, type VisualEditingControllerMsg, type VisualEditingNodeMsg, } from '@sanity/presentation-comlink' import { type PreviewUrlResolver, type PreviewUrlResolverOptions, } from '@sanity/preview-url-secret/define-preview-url' import {type ComponentType} from 'react' import {type Observable} from 'rxjs' import {type DocumentStore, type SanityClient} from 'sanity' import {type PreviewHeaderProps} from './preview/PreviewHeader' export type {PreviewUrlResolver, PreviewUrlResolverOptions} /** * Represents a document location * @param title - Title of the document * @param href - URL of the document location * @public */ export interface DocumentLocation { title: string href: string } /** * State for describing document locations or providing a message if no document * locations are unavailable * @param locations - Array of document locations * @param message - Message to display if locations are unavailable * @param tone - Tone of the message * @public */ export interface DocumentLocationsState { locations?: DocumentLocation[] message?: string tone?: 'positive' | 'caution' | 'critical' } /** * @internal */ export type DocumentLocationsStatus = 'empty' | 'resolving' | 'resolved' /** * Function used for advanced document location resolution * @param params - Object with document `id` and document `type` properties * @param context - Object with `documentStore` property for creating listenQuery subscriptions * @returns Document location state, optionally as an Observable, or null/undefined if no locations are available * @public */ export type DocumentLocationResolver = ( params: { id: string type: string version: string | undefined perspectiveStack: StackablePerspective[] }, context: {documentStore: DocumentStore}, ) => | DocumentLocationsState | null | undefined | Observable<DocumentLocationsState | null | undefined> /** @public */ export interface NavigatorOptions { minWidth?: number maxWidth?: number component: ComponentType } /** @public */ export interface HeaderOptions { component: ComponentType<PreviewHeaderProps> } /** @public */ export type PreviewUrlOption = string | PreviewUrlResolver<SanityClient> | PreviewUrlResolverOptions /** * Object of document location resolver definitions per document type * @public */ export type DocumentLocationResolvers = Record< string, DocumentLocationResolverObject | DocumentLocationsState > /** * Document location resolver object * @param select - object for selecting document fields * @param resolve - function that accepts a document with the selected fields and returns an optional document location state * @public */ export type DocumentLocationResolverObject<K extends string = string> = { select: Record<K, string> // eslint-disable-next-line @typescript-eslint/no-explicit-any resolve: (value: Record<K, any> | null) => DocumentLocationsState | null | undefined | void } /** * @public */ export interface DocumentResolverContext { origin: string | undefined params: Record<string, string> path: string } /** * @public */ export type ContextFn<T> = (context: DocumentResolverContext) => T /** * Object for resolving a document for a given route pattern * @public */ export type DocumentResolver = | { route: string | Array<string> type: string filter?: never params?: never resolve?: never } | { route: string | Array<string> type?: never filter: ContextFn<string> | string params?: ContextFn<Record<string, string>> | Record<string, string> resolve?: never } | { route: string | Array<string> type?: never filter?: never params?: never resolve: ContextFn< | { filter: string params?: Record<string, string> } | undefined > } /** * @public */ export interface PresentationPluginOptions { devMode?: boolean | (() => boolean) icon?: ComponentType name?: string title?: string /** * @deprecated use `resolve.locations` instead */ locate?: DocumentLocationResolver resolve?: { mainDocuments?: DocumentResolver[] locations?: DocumentLocationResolvers | DocumentLocationResolver } previewUrl: PreviewUrlOption components?: { unstable_header?: HeaderOptions unstable_navigator?: NavigatorOptions } /** * @deprecated this feature flag is no longer needed */ unstable_showUnsafeShareUrl?: boolean } /** * Presentation specific state that is stored in the pathname section of the URL * @public */ export interface PresentationStateParams { type?: string id?: string path?: string } /** * Presentation specific URL search parameters, they should persist when * navigating between the document pane and document list pane * @public */ export interface PresentationSearchParams { preview?: string perspective?: string viewport?: string } /** * Document Pane specific URL search parameters, they should not persist when * navigating between the document pane and document list pane * @public */ export interface StructureDocumentPaneParams extends InspectorTab { inspect?: string path?: string rev?: string since?: string template?: string templateParams?: string view?: string // assist pathKey?: string instruction?: string // comments comment?: string } /** * parameters for the changes inspector * @public */ export interface InspectorTab { changesInspectorTab?: 'history' | 'review' } /** * All possible URL search parameters used by the Presentation tool * @public */ export interface CombinedSearchParams extends StructureDocumentPaneParams, PresentationSearchParams, InspectorTab {} /** * All possible parameters that can be used to describe the state of the * Presentation tool, stored in the pathname and as search parameters of the URL * @public */ export interface PresentationParamsContextValue extends PresentationStateParams, CombinedSearchParams, InspectorTab {} /** @public */ export type PresentationNavigate = ( nextState: PresentationStateParams, nextSearchState?: CombinedSearchParams, forceReplace?: boolean, ) => void /** @public */ export type PresentationPerspective = Exclude<ClientPerspective, 'raw'> /** @public */ export type PresentationViewport = 'desktop' | 'mobile' /** @internal */ export interface FrameState { title: string | undefined url: string | undefined } /** * @internal */ export interface MainDocument { _id: string _type: string } /** * @internal */ export interface MainDocumentState { path: string document: MainDocument | undefined } /** * @internal */ export type VisualEditingConnection = ChannelInstance< VisualEditingControllerMsg, VisualEditingNodeMsg > /** * @internal */ export type LoaderConnection = ChannelInstance<LoaderControllerMsg, LoaderNodeMsg> /** @public */ export type ConnectionStatus = 'connected' | 'connecting' | 'reconnecting' | 'idle' /** @public */ export type PresentationNavigateContextValue = ( preview: string | undefined, document?: {type: string; id: string}, ) => void export interface PresentationContextValue { devMode: boolean name: string navigate: PresentationNavigate params: PresentationParamsContextValue structureParams: StructureDocumentPaneParams searchParams: PresentationSearchParams }