@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,
});