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
57 lines (50 loc) • 1.78 kB
text/typescript
import {type PreviewValue, type SchemaType, type SortOrdering} from '@sanity/types'
import {useMemo} from 'react'
import {useObservable} from 'react-rx'
import {type Observable, of} from 'rxjs'
import {catchError, map} from 'rxjs/operators'
import {usePerspective} from '../perspective/usePerspective'
import {useDocumentPreviewStore} from '../store'
import {type Previewable} from './types'
export {useDocumentPreview as unstable_useValuePreview}
interface State {
isLoading: boolean
error?: Error
value?: PreviewValue
}
const INITIAL_STATE: State = {
isLoading: true,
}
const IDLE_STATE: State = {
isLoading: false,
value: {
title: undefined,
description: undefined,
},
}
/**
* @internal
* @deprecated FOR INTERNAL USE.
*/
function useDocumentPreview(props: {
enabled?: boolean
ordering?: SortOrdering
schemaType?: SchemaType
value: unknown | undefined
}): State {
const {enabled = true, ordering, schemaType, value: previewValue} = props || {}
const {observeForPreview} = useDocumentPreviewStore()
const {perspectiveStack} = usePerspective()
const observable = useMemo<Observable<State>>(() => {
// this will render previews as "loaded" (i.e. not in loading state) – typically with "Untitled" text
if (!enabled || !previewValue || !schemaType) return of(IDLE_STATE)
return observeForPreview(previewValue as Previewable, schemaType, {
perspective: perspectiveStack,
viewOptions: {ordering: ordering},
}).pipe(
map((event) => ({isLoading: false, value: event.snapshot || undefined})),
catchError((error) => of({isLoading: false, error})),
)
}, [enabled, previewValue, schemaType, observeForPreview, perspectiveStack, ordering])
return useObservable(observable, INITIAL_STATE)
}