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

63 lines (56 loc) 1.98 kB
import {type PreviewValue, type SanityDocument, type SchemaType} from '@sanity/types' import {combineLatest, type Observable, of} from 'rxjs' import {map, startWith} from 'rxjs/operators' import {type PerspectiveStack} from '../../perspective/types' import {getPublishedId, getVersionFromId, isVersionId} from '../../util/draftUtils' import {type DocumentPreviewStore} from '../documentPreviewStore' /** * @internal */ export interface PreviewState { isLoading?: boolean /** * The preview snapshot as seen through the current perspective stack */ snapshot: PreviewValue | Partial<SanityDocument> | null /** * The preview snapshot in either a single `version` perspective, or the `drafts` perspective * This can be used as a fallback if the document exists in e.g. drafts form, but not in the current perspective */ original: PreviewValue | Partial<SanityDocument> | null } /** * Obtain a document's published and draft state, along with loading status. * * @internal */ export function getPreviewStateObservable( documentPreviewStore: DocumentPreviewStore, schemaType: SchemaType, documentId: string, perspective?: PerspectiveStack, ): Observable<PreviewState> { const perspectiveSnapshot = documentPreviewStore.observeForPreview( {_id: getPublishedId(documentId)}, schemaType, {perspective}, ) const versionOrDraftId = isVersionId(documentId) ? getVersionFromId(documentId) : 'drafts' const preparedVersionSnapshot = versionOrDraftId ? documentPreviewStore.observeForPreview({_id: getPublishedId(documentId)}, schemaType, { perspective: [versionOrDraftId], }) : of(null) return combineLatest([perspectiveSnapshot, preparedVersionSnapshot]).pipe( map(([main, version]) => ({ isLoading: false, snapshot: main?.snapshot || null, original: version?.snapshot || null, })), startWith({ isLoading: true, snapshot: null, original: null, }), ) }