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 (57 loc) 2.08 kB
import {combineLatest, map, type Observable} from 'rxjs' import {type useReleasesStore} from '../../releases/store/useReleasesStore' import {getDocumentVariantType} from '../../util/getDocumentVariantType' import {type EventsObservableValue} from './getInitialFetchEvents' import {type EditDocumentVersionEvent, type UpdateLiveDocumentEvent} from './types' import { addParentToEvents, sortEvents, squashLiveEditEvents, updatePublishedEvents, updateVersionEvents, } from './utils' interface CreateEventsObservableOptions { documentId: string releases$: ReturnType<typeof useReleasesStore>['state$'] events$: Observable<EventsObservableValue> remoteEdits$: Observable<(UpdateLiveDocumentEvent | EditDocumentVersionEvent)[]> expandedEvents$: Observable<EditDocumentVersionEvent[]> } export function createEventsObservable({ releases$, events$, remoteEdits$, expandedEvents$, documentId, }: CreateEventsObservableOptions) { const documentVariantType = getDocumentVariantType(documentId) return combineLatest([releases$, events$, remoteEdits$, expandedEvents$]).pipe( map(([releases, {events, nextCursor, loading, error}, remoteEdits, expandedEvents]) => { const eventsWithRemoteEdits = sortEvents({remoteEdits, events, expandedEvents}) if (documentVariantType === 'published') { return { events: updatePublishedEvents(eventsWithRemoteEdits, releases), nextCursor: nextCursor, loading: loading, error: error, } } if (documentVariantType === 'draft') { return { events: addParentToEvents(eventsWithRemoteEdits), nextCursor: nextCursor, loading: loading, error: error, } } return { events: updateVersionEvents(eventsWithRemoteEdits), nextCursor: nextCursor, loading: loading, error: error, } }), // TODO: This is temporal - liveEditEvents will be squashed in the API map((value) => ({...value, events: squashLiveEditEvents(value.events)})), ) }