{"version":3,"sources":["../../src/history/MenuHistory.ts","../../src/history/FullHistory.ts","../../src/history/NoHistory.ts","../../src/history/SimpleHistory.ts","../../src/MenuError.ts","../../src/Menu.ts","../../src/MenuPage.ts"],"names":["InteractionCollector","ActionRowBuilder"],"mappings":"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","file":"index.cjs","sourcesContent":["import { Menu } from \"../Menu\";\n\nexport abstract class MenuHistory {\n  public abstract push(menu: Menu<any>): void;\n  public abstract pop(menu: Menu<any>): boolean;\n  public abstract clear(): void;\n}\n","import { Menu } from \"../Menu\";\nimport { MenuPage } from \"../MenuPage\";\nimport { MenuHistory } from \"./MenuHistory\";\n\ninterface FullHistoryEntry {\n  page: MenuPage<any>;\n  state: any;\n}\n\nexport class FullHistory extends MenuHistory {\n  public history: FullHistoryEntry[] = [];\n\n  public push(menu: Menu<any>) {\n    if (!menu.activePage) {\n      throw new Error(\"Menu has no active page\");\n    }\n\n    this.history.push({\n      page: menu.activePage,\n      state: this.copyState(menu.state),\n    });\n  }\n\n  public pop(menu: Menu<any>) {\n    const entry = this.history.pop();\n    if (!entry) {\n      return false;\n    }\n\n    menu.activePage = entry.page;\n    menu.state = entry.state;\n\n    return true;\n  }\n\n  public clear() {\n    this.history = [];\n  }\n\n  protected copyState(state: unknown) {\n    if (typeof state === \"object\" && state !== null) {\n      return {\n        ...state,\n      };\n    } else {\n      return state;\n    }\n  }\n}\n","import { MenuHistory } from \"./MenuHistory\";\n\nexport class NoHistory extends MenuHistory {\n  public push() {}\n\n  public pop() {\n    return false;\n  }\n\n  public clear() {}\n}\n","import { Menu } from \"../Menu\";\nimport { MenuPage } from \"../MenuPage\";\nimport { MenuHistory } from \"./MenuHistory\";\n\nexport class SimpleHistory extends MenuHistory {\n  public history: MenuPage<any>[] = [];\n\n  public push(menu: Menu<any>): void {\n    if (!menu.activePage) {\n      throw new Error(\"Menu has no active page\");\n    }\n\n    this.history.push(menu.activePage);\n  }\n\n  public pop(menu: Menu<any>) {\n    const page = this.history.pop();\n\n    if (page) {\n      menu.activePage = page;\n      return true;\n    }\n\n    return false;\n  }\n\n  public clear(): void {\n    this.history = [];\n  }\n}\n","export class MenuError extends Error {}\n","import {\n  ActionRowBuilder,\n  Awaitable,\n  CollectedInteraction,\n  InteractionCollector,\n  Message,\n  MessageActionRowComponentBuilder,\n  RepliableInteraction,\n} from \"discord.js\";\nimport { MenuError } from \"./MenuError\";\nimport { MenuPage } from \"./MenuPage\";\nimport { MenuHistory } from \"./history/MenuHistory\";\nimport { NoHistory } from \"./history/NoHistory\";\n\nexport type InteractionFilter = (\n  interaction: CollectedInteraction<\"cached\">,\n) => Awaitable<boolean>;\n\nexport interface MenuOptions<State> {\n  state: State;\n  time?: number;\n  ephemeral?: boolean;\n  filter?: InteractionFilter;\n  history?: MenuHistory;\n}\n\nexport class Menu<State> {\n  public state: State;\n  public time: number = 5 * 60 * 1000;\n  public ephemeral: boolean = false;\n  public filter: InteractionFilter;\n\n  public activePage?: MenuPage<State>;\n  public history: MenuHistory;\n\n  public message?: Message;\n  private collector?: InteractionCollector<CollectedInteraction>;\n\n  public constructor(options: MenuOptions<State>) {\n    this.state = options.state;\n\n    if (options.time) {\n      this.time = options.time;\n    }\n\n    if (options.ephemeral) {\n      this.ephemeral = options.ephemeral;\n    }\n\n    if (options.filter) {\n      this.filter = options.filter;\n    } else {\n      this.filter = () => true;\n    }\n\n    if (options.history) {\n      this.history = options.history;\n    } else {\n      this.history = new NoHistory();\n    }\n  }\n\n  public setPage(\n    page: MenuPage<State> | ((menu: Menu<State>) => MenuPage<State>),\n  ) {\n    if (this.activePage) {\n      this.history.push(this);\n    }\n\n    const resolvedPage = typeof page === \"function\" ? page(this) : page;\n\n    this.activePage = resolvedPage;\n\n    return this;\n  }\n\n  public back() {\n    this.history.pop(this);\n\n    return this;\n  }\n\n  async render() {\n    if (!this.activePage) {\n      throw new MenuError(\"There is no active page\");\n    }\n\n    return this.activePage.render();\n  }\n\n  private setupCollector() {\n    if (!this.message) {\n      throw new MenuError(\"Cannot setup collector without a message\");\n    }\n\n    this.collector = new InteractionCollector(this.message.client, {\n      message: this.message,\n      time: this.time,\n    });\n\n    this.collector.on(\"collect\", async (interaction) => {\n      if (!this.activePage || !interaction.inCachedGuild()) return;\n\n      if (!(await this.filter(interaction))) return;\n\n      if (interaction.isButton() && this.activePage.handleButton) {\n        await this.activePage.handleButton(interaction);\n      } else if (\n        interaction.isModalSubmit() &&\n        interaction.isFromMessage() &&\n        this.activePage.handleModal\n      ) {\n        await this.activePage.handleModal(interaction);\n      } else if (\n        interaction.isStringSelectMenu() &&\n        this.activePage.handleStringSelectMenu\n      ) {\n        await this.activePage.handleStringSelectMenu(interaction);\n      } else if (\n        interaction.isUserSelectMenu() &&\n        this.activePage.handleUserSelectMenu\n      ) {\n        await this.activePage.handleUserSelectMenu(interaction);\n      } else if (\n        interaction.isRoleSelectMenu() &&\n        this.activePage.handleRoleSelectMenu\n      ) {\n        await this.activePage.handleRoleSelectMenu(interaction);\n      } else if (\n        interaction.isChannelSelectMenu() &&\n        this.activePage.handleChannelSelectMenu\n      ) {\n        await this.activePage.handleChannelSelectMenu(interaction);\n      } else if (\n        interaction.isMentionableSelectMenu() &&\n        this.activePage.handleMentionableSelectMenu\n      ) {\n        await this.activePage.handleMentionableSelectMenu(interaction);\n      } else if (this.activePage.handle) {\n        await this.activePage.handle(interaction);\n      }\n    });\n\n    this.collector.on(\"end\", async () => {\n      await this.cleanup();\n    });\n  }\n\n  private async cleanup() {\n    if (!this.message) {\n      return;\n    }\n\n    if (!this.message.flags.has(\"Ephemeral\")) {\n      const components = this.message.components.map((row) =>\n        ActionRowBuilder.from<MessageActionRowComponentBuilder>(row),\n      );\n\n      for (const row of components) {\n        for (const component of row.components) {\n          component.setDisabled(true);\n        }\n      }\n\n      this.message.edit({\n        components,\n      });\n    }\n  }\n\n  public async start(interaction: RepliableInteraction) {\n    if (interaction.deferred || interaction.replied) {\n      this.message = await interaction.editReply(await this.render());\n    } else {\n      const response = await interaction.reply({\n        ...(await this.render()),\n        withResponse: true,\n      });\n\n      if (!response.resource?.message) {\n        throw new MenuError(\"Failed to reply to the interaction\");\n      }\n\n      this.message = response.resource.message;\n    }\n\n    this.setupCollector();\n\n    return this;\n  }\n\n  public async stop() {\n    this.collector?.stop(\"stop\");\n  }\n}\n","import type {\n  Awaitable,\n  BaseMessageOptions,\n  ButtonInteraction,\n  ChannelSelectMenuInteraction,\n  CollectedInteraction,\n  InteractionEditReplyOptions,\n  MentionableSelectMenuInteraction,\n  ModalMessageModalSubmitInteraction,\n  RoleSelectMenuInteraction,\n  StringSelectMenuInteraction,\n  UserSelectMenuInteraction,\n} from \"discord.js\";\nimport type { Menu } from \"./Menu\";\n\nexport type MenuPageRenderResult = BaseMessageOptions & {\n  content?: string | undefined;\n};\n\nexport abstract class MenuPage<State = unknown> {\n  public menu: Menu<State>;\n\n  public constructor(menu: Menu<State>) {\n    this.menu = menu;\n  }\n\n  get state() {\n    return this.menu.state;\n  }\n\n  public abstract render(): Awaitable<MenuPageRenderResult>;\n\n  public filter(\n    interaction: CollectedInteraction<\"cached\">,\n  ): Awaitable<boolean> {\n    return true;\n  }\n\n  public handle?(\n    interaction: CollectedInteraction<\"cached\">,\n  ): Awaitable<unknown>;\n\n  public handleButton?(\n    interaction: ButtonInteraction<\"cached\">,\n  ): Awaitable<unknown>;\n\n  public handleModal?(\n    interaction: ModalMessageModalSubmitInteraction<\"cached\">,\n  ): Awaitable<unknown>;\n\n  public handleStringSelectMenu?(\n    interaction: StringSelectMenuInteraction<\"cached\">,\n  ): Awaitable<unknown>;\n\n  public handleUserSelectMenu?(\n    interaction: UserSelectMenuInteraction<\"cached\">,\n  ): Awaitable<unknown>;\n\n  public handleRoleSelectMenu?(\n    interaction: RoleSelectMenuInteraction<\"cached\">,\n  ): Awaitable<unknown>;\n\n  public handleChannelSelectMenu?(\n    interaction: ChannelSelectMenuInteraction<\"cached\">,\n  ): Awaitable<unknown>;\n\n  public handleMentionableSelectMenu?(\n    interaction: MentionableSelectMenuInteraction<\"cached\">,\n  ): Awaitable<unknown>;\n}\n"]}