UNPKG

refine-sanity

Version:

Data provider for refine with sanity. refine is a React-based framework for building internal tools, rapidly. Sanity is headless CMS.

91 lines (90 loc) 3.32 kB
import { q } from 'groqd'; import { generateFilter } from "./utils/generateFilter"; import { generateSelect } from "./utils/generateSelect"; import { generateSort } from "./utils/generateSort"; export const dataProvider = (client) => { return { async getList({ resource, pagination, sorters, filters, meta }) { const { current = 1, pageSize = 10, } = pagination ?? {}; const start = (current - 1) * pageSize; const end = start + pageSize - 1; let dataQuery = q("*").filterByType(resource); const filterStr = generateFilter(filters); if (filterStr) { dataQuery = dataQuery.filter(filterStr); // Apply filters if any result's achieved } const totalQuery = dataQuery.query; // Separate query to avoid sliced total if (sorters?.length) { dataQuery = dataQuery.order(...generateSort(sorters)); } dataQuery = dataQuery.slice(start, end); const paginatedQuery = q(`{ "data": ${dataQuery.query}${generateSelect(meta?.fields)}, "total": count(${totalQuery}._id) }`); const response = await client.fetch(paginatedQuery.query); return { data: response.data, total: response.total }; }, async getOne({ resource, id, meta }) { const { query } = q("*").filterByType(resource).filter(`_id == "${id}"`).slice(0); const dataQuery = q(`{ "data": ${query}${generateSelect(meta?.fields)} }`); // const data = await client.getDocument(id as string); const response = await client.fetch(dataQuery.query); return { data: response.data }; }, async create({ resource, variables }) { const response = await client.create({ _type: resource, ...variables }, { autoGenerateArrayKeys: true }); return { data: { ...response, id: response._id } }; }, async update({ id, variables }) { const response = await client .patch(id) .set({ _id: id, ...variables, }) .commit({ autoGenerateArrayKeys: true }); return { data: { ...response, id: response._id, }, }; }, async deleteOne({ id }) { const response = await client.delete(id); return { data: response }; }, async deleteMany({ ids, resource, meta }) { const idsStr = ids.map((id) => `"${id}"`).join(", "); const { query } = q(`*[_id in [${idsStr}]]${generateSelect(meta?.fields)}`).filterByType(resource); const response = await client.delete({ query }); return { data: response, }; }, getApiUrl() { throw Error("Not implemented on refine-sanity data provider."); }, }; }; export default dataProvider;