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
82 lines (69 loc) • 2.27 kB
text/typescript
import {type SanityClient} from '@sanity/client'
import {useMemo} from 'react'
import {useClient} from '../../hooks/useClient'
import {type Schedule} from '../types'
import {debugWithName} from '../utils/debug'
const debug = debugWithName('useScheduleOperation')
export function useScheduleApi(): ReturnType<typeof createScheduleApi> {
const client = useClient({apiVersion: '2022-09-01'})
return useMemo(() => createScheduleApi(client), [client])
}
function createScheduleApi(client: SanityClient) {
const {dataset, projectId} = client.config()
function _create({date, documentId}: {date: string; documentId: string}) {
debug('_create:', documentId)
// Round date to nearest second (mutate)
const roundedDate = new Date(date)
roundedDate.setSeconds(0)
roundedDate.setMilliseconds(0)
return client.request<Schedule>({
body: {
documents: [{documentId}],
executeAt: roundedDate,
name: roundedDate,
},
method: 'POST',
uri: `/schedules/${projectId}/${dataset}`,
})
}
function _delete({scheduleId}: {scheduleId: string}) {
debug('_delete:', scheduleId)
return client.request<void>({
method: 'DELETE',
uri: `/schedules/${projectId}/${dataset}/${scheduleId}`,
})
}
function _deleteMultiple({scheduleIds}: {scheduleIds: string[]}) {
debug('_deleteMultiple:', scheduleIds)
const requests = scheduleIds.map((scheduleId) => _delete({scheduleId}))
return Promise.allSettled(requests)
}
function _publish({scheduleId}: {scheduleId: string}) {
debug('_publish:', scheduleId)
return client.request<{transactionId: string}>({
method: 'POST',
uri: `/schedules/${projectId}/${dataset}/${scheduleId}/publish`,
})
}
function _update({
documentSchedule,
scheduleId,
}: {
documentSchedule: Partial<Schedule>
scheduleId: string
}) {
debug('_update:', scheduleId, documentSchedule)
return client.request<{transactionId: string}>({
body: documentSchedule,
method: 'PATCH',
uri: `/schedules/${projectId}/${dataset}/${scheduleId}`,
})
}
return {
create: _create,
delete: _delete,
deleteMultiple: _deleteMultiple,
publish: _publish,
update: _update,
}
}