CursorPaginator

Source
import { CursorPaginator } from "@prestojs/util";

Cursor based paginator

Expects a nextCursor, previousCursor and optional pageSize key in the response. See getPaginationState for how to customise this if your backend implementation differs.

API

new CursorPaginator(currentStatePair,internalStatePair)

Source
ParameterTypeDescription
*currentStatePairnull
*internalStatePairnull

Methods

Go to the first page.

void

Return the state for the first page

Does not transition state. To transition state call first instead.

CursorPaginationState
KeyTypeDescription
cursorstring
pageSizenumber
ParameterTypeDescription
*props.optionsoptions
*props.queryany
PaginatorRequestOptions
KeyTypeDescription
headersHeadersInit|Record

Any headers to add to the request. You can unset default headers that might be specified in the default Endpoint.defaultConfig.requestInit by setting the value to undefined.

queryRecord

Any query request parameters

urlArgsRecord

Any arguments for the URL

Returns true if there's more results after the current page

boolean

Go to the next page.

If the last next is not yet known because results haven't been returned this function does nothing.

void

Return the state for the first page. If the next page isn't yet known (eg. results haven't yet been returned) then null will be returned.

Does not transition state. To transition state call next instead.

One of the following:

CursorPaginationState
KeyTypeDescription
cursorstring
pageSizenumber

OR

null

Return the state for the specified page size

Does not transition state. To transition state call setPageSize instead.

ParameterTypeDescription
*pageSizenumber|null
CursorPaginationState
KeyTypeDescription
cursorstring
pageSizenumber

Go to the previous page.

If the previous page is not yet known because results haven't been returned this function does nothing.

void

Return the state for the previous page. If the previous page isn't yet known (eg. results haven't yet been returned) then null will be returned.

Does not transition state. To transition state call previous instead.

One of the following:

CursorPaginationState
KeyTypeDescription
cursorstring
pageSizenumber

OR

null

Set the page size

ParameterTypeDescription
*pageSizenull|number
void

Sets the internal data based on response. Expects nextCursor, previousCursor and optionally pageSize to be in response data.

See getPaginationState for how to customise this if your backend implementation differs.

ParameterTypeDescription
*props.nextCursorundefined|null|string
*props.pageSizenumber
*props.previousCursorundefined|null|string
void

Static Methods

Expected pagination state in the shape: { next: null|'http://example.com/?cursor=abc123', previous: null|'http://example.com/?cursor=abc123', results: Array }

ParameterTypeDescription
requestDetails.decodedBodyany

The value returned by decodedBody. See Endpoint.execute.

This may be a sub-key of the data returned by Endpoint.execute, eg. if the path option is used in paginationMiddleware. eg. If decodedBody from the Endpoint was

{
users: {
count: 10,
results: [...],
}
extraDetails: {...}
}

and paginationMiddleware was used with path: 'users' then decodedBody would be:

{
count: 10,
results: [...]
}
requestDetails.queryRecord

Any query string parameters

requestDetails.responseResponse

The Response object, if available

*requestDetails.urlstring

Resolved URL

requestDetails.urlArgsRecord

Any arguments used to resolve URL

One of the following:

Record

OR

false

Properties

The current cursor. This will be null before the first response is received.

The next cursor (if any)

The current page size, if known

THe previous cursor (if any)

Inherited Methods

Paginator receives 2 tuples of a state and state setter pair. This is expected to match the same interface as useState in React. The following is a valid simple usage:

const paginator = new Paginator(useState(), useState());

Note that we can also pass the state controllers in via replaceStateControllers rather than in the constructor. This is so we can memoize the Paginator instance which is desirable when using the paginator as a dependency to React hooks.

As state is passed in and managed external to the class be aware that any data stored on the class instance will be lost unless written with setCurrentState or setInternalState. This design is a compromise between allowing a clear interface for how paginators should be defined and allowing the state to be managed externally (eg. using React state).

ParameterTypeDescription
*currentStatePairany

The state object and setter (eg. from useState) that is used to store and transition pagination state. Using this you can do things like easily store state in the URL (eg. using useUrlQueryState) or other data sources.

*internalStatePairany

The state object and setter that is used for internal state. Internal state is stored separately as it does not need to be restored (eg. if you refresh the page). It is used to store things like the total number of results or the current cursor. Passing useState here is fine.

void

Inherited Properties

True once setResponse has been called and pagination state is known.