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
49 lines (42 loc) • 1.6 kB
text/typescript
import {type PreviewValue, type SanityDocument, type SchemaType} from '@sanity/types'
import {type ReactNode} from 'react'
import {combineLatest, type Observable, of} from 'rxjs'
import {map, startWith} from 'rxjs/operators'
import {getDraftId, getPublishedId} from '../../util/draftUtils'
import {type DocumentPreviewStore} from '../documentPreviewStore'
export interface PreviewState {
isLoading?: boolean
draft?: PreviewValue | Partial<SanityDocument> | null
published?: PreviewValue | Partial<SanityDocument> | null
}
const isLiveEditEnabled = (schemaType: SchemaType) => schemaType.liveEdit === true
/**
* Obtain a document's published and draft state, along with loading status.
*
* @internal
*/
export function getPreviewStateObservable(
documentPreviewStore: DocumentPreviewStore,
schemaType: SchemaType,
documentId: string,
title: ReactNode,
): Observable<PreviewState> {
const draft$ = isLiveEditEnabled(schemaType)
? of({snapshot: null})
: documentPreviewStore.observeForPreview(
{_type: 'reference', _ref: getDraftId(documentId)},
schemaType,
)
const published$ = documentPreviewStore.observeForPreview(
{_type: 'reference', _ref: getPublishedId(documentId)},
schemaType,
)
return combineLatest([draft$, published$]).pipe(
map(([draft, published]) => ({
draft: draft.snapshot ? {title, ...(draft.snapshot || {})} : null,
isLoading: false,
published: published.snapshot ? {title, ...(published.snapshot || {})} : null,
})),
startWith({draft: null, isLoading: true, published: null}),
)
}