Collection: Disable prev or next buttons to avoid over/underflow

during collection pagination.
This commit is contained in:
2022-09-04 20:45:47 +02:00
parent 37414bdf7f
commit 91e038d88e

View File

@@ -2,6 +2,8 @@ const { SlashCommandBuilder, EmbedBuilder, ActionRowBuilder, ButtonBuilder, Butt
const { Card, User, Character } = require("../models"); const { Card, User, Character } = require("../models");
const UserUtils = require("../util/users"); const UserUtils = require("../util/users");
const pageSize = 8;
//fetch all cards owned by the user and list them //fetch all cards owned by the user and list them
module.exports = { module.exports = {
data: new SlashCommandBuilder() data: new SlashCommandBuilder()
@@ -21,18 +23,7 @@ module.exports = {
const filter = (i) => i.customId === `previous-${uid}` || i.customId === `next-${uid}`; const filter = (i) => i.customId === `previous-${uid}` || i.customId === `next-${uid}`;
const collector = interaction.channel.createMessageComponentCollector({ filter, time: 60000 }); const collector = interaction.channel.createMessageComponentCollector({ filter, time: 60000 });
//add buttons for pagination let row = this.getPaginateComponents(uid, prev=false);
const row = new ActionRowBuilder();
row.addComponents(
new ButtonBuilder()
.setCustomId(`previous-${uid}`)
.setLabel(`Previous`)
.setStyle(ButtonStyle.Primary),
new ButtonBuilder()
.setCustomId(`next-${uid}`)
.setLabel(`Next`)
.setStyle(ButtonStyle.Primary)
);
let embedMessage = await interaction.reply({ let embedMessage = await interaction.reply({
embeds: [embed], embeds: [embed],
@@ -41,53 +32,71 @@ module.exports = {
fetchReply: true fetchReply: true
}); });
this.updatePageEmbed(embedMessage, user, offset); this.updatePageEmbed(uid, embedMessage, user, offset);
//TODO: magic number 8 has to be refactored
/* BUGBUG: pagination goes past max cards showing empty pages
going lower than the first page throws SQL error
*/
collector.on('collect', async (i) => { collector.on('collect', async (i) => {
i.deferUpdate(); i.deferUpdate();
if (i.customId === `previous-${uid}`) { if (i.customId === `previous-${uid}`) {
//next //next
offset-=8; offset-=pageSize;
} else if (i.customId === `next-${uid}`) { } else if (i.customId === `next-${uid}`) {
//previous //previous
offset+=8; offset+=pageSize;
} }
this.updatePageEmbed(embedMessage, user, offset); this.updatePageEmbed(uid, embedMessage, user, offset);
}); });
collector.on('end', collected => { collector.on('end', collected => {
embedMessage.edit({ components: [] }); embedMessage.edit({ components: [] });
console.log(`Collected ${collected.size} items`); console.log(`Collected ${collected. size} items`);
}); });
}, },
async updatePageEmbed(i, user, offset) { getPaginateComponents(uid, prev=true, next=true) {
const cardsPerPage = 8; //add buttons for pagination
let row = new ActionRowBuilder();
row.addComponents(
new ButtonBuilder()
.setCustomId(`previous-${uid}`)
.setLabel(`Previous`)
.setStyle(ButtonStyle.Primary)
.setDisabled(!prev),
new ButtonBuilder()
.setCustomId(`next-${uid}`)
.setLabel(`Next`)
.setStyle(ButtonStyle.Primary)
.setDisabled(!next)
);
return row;
},
async updatePageEmbed(uid, i, user, offset) {
let cards = await Card.findAndCountAll({ let cards = await Card.findAndCountAll({
where: { where: {
userId: user.id userId: user.id
}, },
limit: cardsPerPage, limit: pageSize,
offset: offset, offset: offset,
include: [{ include: [{
model: Character, model: Character,
}] }]
}); });
let pageStart = offset + 1;
let pageEnd = offset + cards.rows.length;
//create embed using embedBuilder //create embed using embedBuilder
let embed = new EmbedBuilder() let embed = new EmbedBuilder()
.setTitle(`$'s collection`) .setTitle(`$'s collection`)
.setColor(0x00ff00) .setColor(0x00ff00)
.setTimestamp() .setTimestamp()
.setFooter({ text: `Cards ${offset+1} - ${offset + cards.rows.length} / ${cards.count}` }); .setFooter({ text: `Cards ${pageStart} - ${pageEnd} / ${cards.count}` });
//if the user has no cards, tell him //if the user has no cards, tell him
//BUGBUG: no longer working with the new embed flow
if (cards.count === 0) { if (cards.count === 0) {
embed.setTitle("You have no cards in your collection"); embed.setTitle("You have no cards in your collection");
return; return;
@@ -107,7 +116,7 @@ module.exports = {
embed.addFields({ name:'\u200b', value: '\u200b'}); embed.addFields({ name:'\u200b', value: '\u200b'});
} }
} }
let components = this.getPaginateComponents(uid, prev=offset>0, next=pageEnd<cards.count);
await i.edit({ embeds: [embed] }); await i.edit({ embeds: [embed], components: [components] });
} }
} }