Skip to content

Instantly share code, notes, and snippets.

@mikield
Created December 10, 2024 19:19
Show Gist options
  • Save mikield/4ad57ec5b276267f8a94ba61cc3f35ea to your computer and use it in GitHub Desktop.
Save mikield/4ad57ec5b276267f8a94ba61cc3f35ea to your computer and use it in GitHub Desktop.
Laracord Pagination example
/**
* @throws Exception
*/
public static function paginate(callable $transformer, BuilderContract $builder, ?int $page = 1, ?int $perPage = 15): Message
{
$paginator = $builder->paginate(perPage: $perPage, page: $page);
$message = self::buildMessage(self::transform(collect($paginator->items()), $transformer));
$message->button('⏮️', self::buildPrevButton($perPage, $page, $builder, $transformer), disabled: $paginator->previousPageUrl() === null);
$message->button('⏭️', self::buildNextButton($perPage, $page, $builder, $transformer), disabled: $paginator->nextPageUrl() === null);
$message->footerText('Сторінка: ' . $page . '/' . $paginator->lastPage());
return $message;
}
private static function transform(Collection $items, callable $transformer): string
{
return $items->transform(fn($item) => "**" . $item->id . ".** " . $transformer($item))->implode("\n\n");
}
/**
* @throws Exception
*/
private static function buildMessage(string $content): Message
{
return Message::make(self::$bot)->content($content);
}
private static function buildNextButton(int $perPage, int $page, BuilderContract $builder, callable $transformer): callable
{
return static function (Interaction $interaction) use ($builder, $page, $perPage, $transformer) {
$interaction->updateMessage(
self::paginate($transformer, $builder, $page + 1, $perPage)->build()
);
};
}
private static function buildPrevButton(int $perPage, int $page, BuilderContract $builder, callable $transformer): callable
{
return static function (Interaction $interaction) use ($builder, $page, $perPage, $transformer) {
$interaction->updateMessage(
self::paginate($transformer, $builder, $page - 1, $perPage)->build()
);
};
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment