@void-snippets/react
Custom API Adapters
Override fromList and fromSingle when your API shape differs.
#When you need a custom adapter
If your API returns data in a different shape from the default, provide your own adapter pair to createResourceHooks. Adapters run on every response before the data reaches any hook.
#Full example
typescript
// contacts/contacts.adapters.ts
// Imagine your API returns this for list requests:
// {
// "results": [...],
// "meta": { "currentPage": 1, "perPage": 20, "lastPage": 5, "total": 94 }
// }
//
// And this for single items:
// { "contact": { "_id": "…", "name": "…", ... } }
import type { VSAdapters, VSListResult } from '@void-snippets/core';
import type { Contact } from './contacts.types';
type ApiListResponse = { results: Contact.Base[]; meta: { currentPage: number; perPage: number; lastPage: number; total: number } };
type ApiSingleResponse = { contact: Contact.Detail };
const contactAdapters: VSAdapters<ApiListResponse, Contact.Base, ApiSingleResponse, Contact.Detail> = {
fromList(raw): VSListResult<Contact.Base> {
return {
items: raw.results,
pagination: {
page: raw.meta.currentPage,
limit: raw.meta.perPage,
totalPages: raw.meta.lastPage,
totalDocuments: raw.meta.total,
},
};
},
fromSingle(raw): Contact.Detail {
return raw.contact;
},
};
// Pass the adapters to createResourceHooks
export const contactHooks = createResourceHooks('contacts', ContactsApis, {
adapters: contactAdapters,
});