initMessageBuilder method

  1. @override
ComponentMessageBuilder initMessageBuilder()
override

Inits ComponentMessageBuilder with buttons needed for pagination. And hooks needed events.

Implementation

@override
ComponentMessageBuilder initMessageBuilder() {
  final firstPageButtonId = "${customPreId}firstPage";
  final firstPageButton = ButtonBuilder(firstLabel, firstPageButtonId, ButtonStyle.secondary, emoji: firstEmoji);

  final previousPageButtonId = "${customPreId}previousPage";
  final previousPageButton = ButtonBuilder(prevLabel, previousPageButtonId, ButtonStyle.secondary, emoji: prevEmoji);

  final nextPageButtonId = "${customPreId}nextPage";
  final nextPageButton = ButtonBuilder(nextLabel, nextPageButtonId, ButtonStyle.secondary, emoji: nextEmoji);

  final lastPageButtonId = "${customPreId}lastPage";
  final lastPageButton = ButtonBuilder(lastLabel, lastPageButtonId, ButtonStyle.secondary, emoji: lastEmoji);

  void updateButtonState() {
    firstPageButton.disabled = currentPage == 1;
    previousPageButton.disabled = currentPage == 1;
    nextPageButton.disabled = currentPage == maxPage;
    lastPageButton.disabled = currentPage == maxPage;
  }

  // TODO: use ButtonInteractionEvent, currently it is not exported from nyxx_interactions
  StreamSubscription<dynamic> subscription = interactions.events.onButtonEvent.listen((event) async {
    if ([firstPageButtonId, previousPageButtonId, nextPageButtonId, lastPageButtonId].contains(event.interaction.customId)) {
      await event.acknowledge();

      if (user != null && (event.interaction.userAuthor ?? event.interaction.memberAuthor!.user as SnowflakeEntity).id != user!.id) {
        await event.respond(this.builder);

        return;
      }

      message = event.interaction.message;

      if (event.interaction.customId == firstPageButtonId) {
        onFirstPageButtonClicked();
      } else if (event.interaction.customId == previousPageButtonId) {
        onPreviousPageButtonClicked();
      } else if (event.interaction.customId == nextPageButtonId) {
        onNextPageButtonClicked();
      } else if (event.interaction.customId == lastPageButtonId) {
        onLastPageButtonClicked();
      }

      updateButtonState();
      updatePage(currentPage, this.builder, event);
    }
  });

  if (timeout != null) {
    Future.delayed(timeout!, () {
      subscription.cancel();

      firstPageButton.disabled = true;
      previousPageButton.disabled = true;
      nextPageButton.disabled = true;
      lastPageButton.disabled = true;

      message?.edit(this.builder);
    });
  }

  updateButtonState();

  final builder = ComponentMessageBuilder()
    ..componentRows = [
      ComponentRowBuilder()
        ..addComponent(firstPageButton)
        ..addComponent(previousPageButton)
        ..addComponent(nextPageButton)
        ..addComponent(lastPageButton),
    ];

  this.builder = initHook(builder);

  return getMessageBuilderForPage(1, this.builder);
}