@gramio/pagination
Version:
Pagination library for telegram bots
105 lines (101 loc) • 4.32 kB
TypeScript
import { CallbackData, InferDataUnpack } from '@gramio/callback-data';
import { InlineKeyboard as InlineKeyboard$1 } from '@gramio/keyboards';
import { InlineKeyboard, ContextType, Bot } from 'gramio';
interface PaginationDataInput<Payload extends CallbackData<any, any> | never = never> {
offset: number;
limit: number;
payload: Payload extends CallbackData<any, any> ? InferDataUnpack<Payload> : undefined;
}
type PaginationDataFunction<Data, Payload extends CallbackData<any, any> | never = never> = (input: PaginationDataInput<Payload>) => Promise<Data[]>;
interface PaginationItemOutput {
title: string;
id: string | number;
}
type PaginationItemFunction<Data> = (data: Data) => PaginationItemOutput;
interface PaginationOnSelectInput<Payload extends CallbackData<any, any> | never = never> {
id: string | number;
context: ContextType<Bot, "callback_query">;
payload: Payload extends CallbackData<any, any> ? InferDataUnpack<Payload> : undefined;
}
type PaginationOnSelectFunction<Data, Payload extends CallbackData<any, any> | never = never> = (data: PaginationOnSelectInput<Payload>) => void;
type PaginationGetCountFunction = () => Promise<number>;
interface PaginationPageInfo {
totalPages: number;
currentPage: number;
}
type IsNever<T> = [T] extends [never] ? true : false;
type PaginationSelectCallbackDataFunction<Data, Payload extends CallbackData<any, any> | never = never> = (data: {
id: string | number;
payload: Payload extends CallbackData<any, any> ? InferDataUnpack<Payload> : undefined;
offset: number;
limit: number;
}) => string;
type WrapKeyboardFunction<Data, Payload extends CallbackData<any, any> | never = never> = (data: {
keyboard: InlineKeyboard;
pagination: {
hasNext: boolean;
hasPrevious: boolean;
};
offset: number;
limit: number;
data: Data[];
payload: Payload extends CallbackData<any, any> ? InferDataUnpack<Payload> : undefined;
}) => InlineKeyboard;
type AnyPagination = Pagination<any, any>;
declare class Pagination<Data, Payload extends CallbackData<any, any> | never = never> {
private name;
private getData;
private limitValue;
private columnsValue;
private itemDataIterator;
private onSelectCallback;
private getCount;
private pageInfoFormat;
private firstLastPage;
private wrapKeyboardHandler;
private callbackData;
private selectCallbackDataFunction;
private payloadInstance;
constructor(name: string, func: PaginationDataFunction<Data, Payload>);
constructor(name: string, payload: Payload, func: PaginationDataFunction<Data, Payload>);
payload<T extends CallbackData<any, any>>(payload: T): Pagination<Data, T>;
wrapKeyboard(func: WrapKeyboardFunction<Data, Payload>): this;
limit(count: number): this;
count(func: PaginationGetCountFunction): this;
item(item: PaginationItemFunction<Data>): this;
columns(count: number): this;
onSelect(callback: PaginationOnSelectFunction<Data, Payload>): this;
selectCallbackData(callback: PaginationSelectCallbackDataFunction<Data, Payload>): this;
withPageInfo(format: (data: PaginationPageInfo) => string): this;
withFirstLastPage(): this;
getDataWithPaginationInfo(offset: number, ...args: IsNever<Payload> extends true ? [] : [payload: InferDataUnpack<Payload>]): Promise<{
data: Data[];
pagination: {
hasNext: boolean;
hasPrevious: boolean;
};
} | {
data: Data[];
pagination: {
totalPages: number;
currentPage: number;
hasNext: boolean;
hasPrevious: boolean;
};
}>;
getKeyboardWithData(offset?: number, ...args: IsNever<Payload> extends true ? [] : [payload: InferDataUnpack<Payload>]): Promise<{
keyboard: InlineKeyboard$1;
data: Data[];
pagination: {
totalPages: number;
currentPage: number;
hasNext: boolean;
hasPrevious: boolean;
} | {
hasNext: boolean;
hasPrevious: boolean;
};
}>;
getKeyboard(offset?: number, ...args: IsNever<Payload> extends true ? [] : [payload: InferDataUnpack<Payload>]): Promise<InlineKeyboard$1>;
}
export { type AnyPagination, Pagination };