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

68 lines (59 loc) 2.32 kB
import {type SanityClient} from '@sanity/client' import {useMemo} from 'react' import {useObservable} from 'react-rx' import {catchError, map, type Observable, of, shareReplay} from 'rxjs' import {useClient} from '../../../hooks/useClient' import {useWorkspace} from '../../../studio/workspace' import {DEFAULT_STUDIO_CLIENT_OPTIONS} from '../../../studioClient' import {type Schedule} from '../../types' export interface HasUsedScheduledPublishing { used: boolean loading: boolean } const HAS_USED_SCHEDULED_PUBLISHING: HasUsedScheduledPublishing = {used: false, loading: true} export const cachedUsedScheduledPublishing = new Map< string, Observable<HasUsedScheduledPublishing> >() function fetchUsedScheduledPublishing( client: SanityClient, ): Observable<HasUsedScheduledPublishing> { const {dataset, projectId} = client.config() return client.observable .request<{ schedules: Schedule[] }>({uri: `/schedules/${projectId}/${dataset}?limit=1`, tag: 'scheduled-publishing-used'}) .pipe( map((res) => { return {used: res.schedules?.length > 0, loading: false} }), catchError(() => of({used: false, loading: false})), ) } export function useHasUsedScheduledPublishing({ explicitEnabled, isWorkspaceEnabled, }: { explicitEnabled?: boolean isWorkspaceEnabled?: boolean }) { const client = useClient(DEFAULT_STUDIO_CLIENT_OPTIONS) const {projectId, dataset} = useWorkspace() const key = `${projectId}-${dataset}` if (!cachedUsedScheduledPublishing.get(key)) { const hasUsed = fetchUsedScheduledPublishing(client).pipe(shareReplay()) cachedUsedScheduledPublishing.set(key, hasUsed) } const hasUsedScheduledPublishing$ = useMemo(() => { // If the feature is explicitly enabled, we don't need to check if it has been used if (explicitEnabled) { return of({used: true, loading: false}) } // If the workspace has turned off the feature is explicitly enabled, we don't need to check if it has been used if (!isWorkspaceEnabled) { return of({used: false, loading: false}) } return cachedUsedScheduledPublishing.get(key) || of(HAS_USED_SCHEDULED_PUBLISHING) }, [key, explicitEnabled, isWorkspaceEnabled]) return useObservable(hasUsedScheduledPublishing$, HAS_USED_SCHEDULED_PUBLISHING) }