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
JavaScript
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;