@salty-coder/discordjs-pagination
Version:
An updated pagination module for Discord.js v14
214 lines • 8.44 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.pagination = void 0;
const discord_js_1 = require("discord.js");
const pagination_i_1 = require("./pagination.i");
const defaultEmojis = {
first: "⬅️",
previous: "◀️",
next: "▶️",
last: "➡️",
number: "#️⃣",
check: "✅",
cross: "❌",
};
const defaultStyles = {
first: pagination_i_1.ButtonStyles.Secondary,
previous: pagination_i_1.ButtonStyles.Danger,
next: pagination_i_1.ButtonStyles.Success,
last: pagination_i_1.ButtonStyles.Secondary,
number: pagination_i_1.ButtonStyles.Success
};
const pagination = async (options) => {
const { client, interaction, message, ephemeral, author, disableButtons, deleteAtEnd, embeds, buttons, time, max, customFilter, fastSkip, pageTravel } = options;
let currentPage = 1;
const disableB = disableButtons || false;
const ephemeralMessage = ephemeral !== null ? ephemeral : false;
if (!interaction && !message)
throw new Error("Pagination requires either an interaction or a message object");
const type = interaction ? 'interaction' : 'message';
const getButtonData = (type) => {
return buttons?.find((btn) => btn.type === type);
};
const resolveButtonName = (type) => {
return Object.keys(pagination_i_1.ButtonTypes).find((key) => {
return pagination_i_1.ButtonTypes[key] === type;
});
};
const generateButtons = (state) => {
const checkState = (type) => {
if (([1, 2]).includes(type) && currentPage === 1)
return true;
if (([5]).includes(type) && currentPage === 1 && embeds.length === 1)
return true;
return ([3, 4]).includes(type) && currentPage === embeds.length;
};
let names = [2, 3];
if (fastSkip)
names = [1, ...names, 4];
if (pageTravel)
names.push(5);
return names.reduce((accumulator, type) => {
let embed = new discord_js_1.ButtonBuilder()
.setCustomId(type.toString())
.setDisabled(state || checkState(type))
.setStyle(getButtonData(type)?.style || defaultStyles[resolveButtonName(type)]);
if (getButtonData(type)?.emoji !== null)
embed.setEmoji(getButtonData(type)?.emoji || defaultEmojis[resolveButtonName(type)]);
if (getButtonData(type)?.label)
embed.setLabel(getButtonData(type)?.label);
accumulator.push(embed);
return accumulator;
}, []);
};
const components = (state) => [
new discord_js_1.ActionRowBuilder().addComponents(generateButtons(state))
];
const changeFooter = () => {
const embed = embeds[currentPage - 1];
const embedJSON = embed.toJSON();
const newEmbed = new discord_js_1.EmbedBuilder(embedJSON);
if (Object.prototype.hasOwnProperty.call(embedJSON, 'footer')) {
return newEmbed.setFooter({
text: `Page ${currentPage} / ${embeds.length} - ${embedJSON.footer.text}`,
iconURL: embedJSON.footer.icon_url
});
}
return newEmbed.setFooter({
text: `Page ${currentPage} / ${embeds.length}`
});
};
let initialMessage;
let channel = message?.channel || interaction?.channel;
if (type === 'interaction' && channel) {
await interaction.deferReply({ ...(ephemeralMessage ? { flags: [discord_js_1.MessageFlags.Ephemeral] } : {}) }).catch(() => ({}));
initialMessage = await interaction.editReply({
embeds: [changeFooter()],
components: components()
});
}
else {
initialMessage = await channel.send({
embeds: [changeFooter()],
components: components()
});
}
const defaultFilter = (interaction) => {
return interaction.user.id === author.id && parseInt(interaction.customId) <= 4;
};
const collectorOptions = (filter) => {
const opt = {
filter: filter || customFilter || defaultFilter,
componentType: discord_js_1.ComponentType.Button
};
if (max)
opt["max"] = max;
if (time)
opt["time"] = time;
return opt;
};
const collector = initialMessage.createMessageComponentCollector(collectorOptions());
let collectorModal;
if (pageTravel) {
collectorModal = initialMessage.createMessageComponentCollector(collectorOptions((_i) => _i.user.id === author.id && parseInt(_i.customId) === 5));
collectorModal.on("collect", async (btnInteraction) => {
// Show modal
const modal = new discord_js_1.ModalBuilder()
.setCustomId('choose_page_modal')
.setTitle('Choose Page');
const inputPageNumber = new discord_js_1.TextInputBuilder()
.setCustomId('page_number')
.setLabel('Enter Page Number')
.setStyle(discord_js_1.TextInputStyle.Short);
const buildModal = new discord_js_1.ActionRowBuilder().addComponents(inputPageNumber);
modal.addComponents(buildModal);
await btnInteraction.showModal(modal);
await btnInteraction.awaitModalSubmit({
filter: (_i) => _i.user.id === author.id && _i.customId === 'choose_page_modal',
time: 30000,
}).then(async (i) => {
const page_number = i.fields.getTextInputValue('page_number');
const int = parseInt(page_number);
if (isNaN(int)) {
return i.followUp({
content: `${i.member.user}, Please enter a valid page number!\n\`${page_number}\` is not a valid page number!`,
...(ephemeralMessage ? { flags: [discord_js_1.MessageFlags.Ephemeral] } : {})
});
}
;
if (int > embeds.length) {
currentPage = embeds.length;
}
else {
if (int <= 0) {
currentPage = 1;
}
else {
currentPage = int;
}
}
await i.update({
embeds: [changeFooter()],
components: components(),
...(ephemeralMessage ? { flags: [discord_js_1.MessageFlags.Ephemeral] } : {})
});
});
});
}
collector.on("collect", async (btnInteraction) => {
const btnType = parseInt(btnInteraction.customId);
switch (btnType) {
case 1:
currentPage = 1;
break;
case 2:
currentPage--;
break;
case 3:
currentPage++;
break;
case 4:
currentPage = embeds.length;
break;
}
await btnInteraction.update({
embeds: [changeFooter()],
components: components()
});
});
collector.on("end", async () => {
try {
if (deleteAtEnd) {
if (type === 'message') {
await initialMessage.delete();
}
else {
await interaction.deleteReply();
}
}
else {
// If deleteAtEnd is false, just remove the buttons
if (type === 'message') {
await initialMessage.edit({
components: disableB ? components(true) : []
});
}
else {
await interaction.editReply({
components: disableB ? components(true) : []
});
}
}
}
catch (error) {
if (error.code === 10008) {
console.warn('Failed to delete/edit message: Message was already deleted or not found.');
}
else {
console.error('Error deleting/editing message:', error);
}
}
});
};
exports.pagination = pagination;
//# sourceMappingURL=pagination.js.map