Paginação
Trabalhe com respostas paginadas da API.
Paginação Básica
A maioria dos endpoints de lista suporta paginação:
const events = await sdk.events.list({
page: 1,
limit: 20,
});Parâmetros de Paginação
interface PaginationParams {
page?: number;
limit?: number;
offset?: number;
}Formato da Resposta
Respostas paginadas incluem metadados:
interface PaginatedResponse<T> {
data: T[];
pagination: {
page: number;
limit: number;
total: number;
totalPages: number;
hasNext: boolean;
hasPrev: boolean;
};
}Buscando Todas as Páginas
async function fetchAllEvents() {
const allEvents = [];
let page = 1;
let hasNext = true;
while (hasNext) {
const response = await sdk.events.list({ page, limit: 100 });
allEvents.push(...response.data);
hasNext = response.pagination.hasNext;
page++;
}
return allEvents;
}Com React Query
import { useEvents } from '@meaple/react-query'
function EventsList() {
const [page, setPage] = useState(1)
const { data, isLoading } = useEvents({
page,
limit: 20
})
return (
<div>
{data?.data.map(event => (
<div key={event.id}>{event.name}</div>
))}
<button
disabled={!data?.pagination.hasPrev}
onClick={() => setPage(p => p - 1)}
>
Anterior
</button>
<button
disabled={!data?.pagination.hasNext}
onClick={() => setPage(p => p + 1)}
>
Próximo
</button>
</div>
)
}Scroll Infinito
import { useInfiniteQuery } from '@tanstack/react-query'
function InfiniteEventsList() {
const {
data,
fetchNextPage,
hasNextPage,
isFetchingNextPage
} = useInfiniteQuery({
queryKey: ['events'],
queryFn: ({ pageParam = 1 }) =>
sdk.events.list({ page: pageParam, limit: 20 }),
getNextPageParam: (lastPage) =>
lastPage.pagination.hasNext
? lastPage.pagination.page + 1
: undefined
})
return (
<div>
{data?.pages.map(page =>
page.data.map(event => (
<div key={event.id}>{event.name}</div>
))
)}
{hasNextPage && (
<button onClick={() => fetchNextPage()}>
{isFetchingNextPage ? 'Carregando...' : 'Carregar Mais'}
</button>
)}
</div>
)
}Paginação Baseada em Cursor
Alguns endpoints suportam paginação baseada em cursor:
interface CursorParams {
cursor?: string;
limit?: number;
}
const response = await sdk.events.list({
cursor: 'next_cursor_token',
limit: 20,
});
const nextCursor = response.pagination.nextCursor;