From 84d1f25a694b0afb6a2407b58b73eea10d914c6e Mon Sep 17 00:00:00 2001 From: Bivekich Date: Sun, 27 Jul 2025 21:08:34 +0300 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=84=D1=83=D0=BD=D0=BA=D1=86?= =?UTF-8?q?=D0=B8=D0=BE=D0=BD=D0=B0=D0=BB=D0=B0=20=D0=BF=D0=B0=D0=B3=D0=B8?= =?UTF-8?q?=D0=BD=D0=B0=D1=86=D0=B8=D0=B8=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87?= =?UTF-8?q?=20=D0=B2=20Telegram-=D0=B1=D0=BE=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🔧 Изменения: - Добавлено поле `currentTasksList` в контекст сессии для хранения текущего списка задач. - Реализована логика очистки данных пагинации при переходе в главное меню. - Добавлены методы для обработки пагинации задач и отображения текущей страницы задач. - Обновлено отображение задач с учетом пагинации и общего количества страниц. ✅ Теперь пользователи могут удобно просматривать задачи с возможностью навигации по страницам. --- src/services/telegram-bot.service.ts | 57 +++++++++++++++++++++++----- 1 file changed, 48 insertions(+), 9 deletions(-) diff --git a/src/services/telegram-bot.service.ts b/src/services/telegram-bot.service.ts index a22486f..143ac27 100644 --- a/src/services/telegram-bot.service.ts +++ b/src/services/telegram-bot.service.ts @@ -19,6 +19,11 @@ interface BotContext extends Context { reminderMinutesBefore?: number; }>; taskId?: number; + currentTasksList?: { + tasks: Task[]; + title: string; + type: 'my' | 'shared' | 'partner'; + }; [key: string]: any; }; } @@ -110,6 +115,11 @@ export class TelegramBotService implements OnModuleInit { } private async showMainMenu(ctx: BotContext, user: User) { + // Очищаем данные пагинации при переходе в главное меню + if (ctx.session?.currentTasksList) { + delete ctx.session.currentTasksList; + } + const partner = await this.userService.getPartner(user.id); const partnerName = partner ? partner.getFullName() : 'Партнер'; const partnerEmoji = partner ? partner.getRoleEmoji() : '👤'; @@ -200,6 +210,10 @@ ${partner ? `👥 Партнер: ${partnerName} ${partnerEmoji}` : ''} else if (data === 'partner_tasks') { await this.showPartnerTasks(ctx); } + // Пагинация задач + else if (data.startsWith('tasks_page_')) { + await this.handleTasksPagination(ctx, data); + } // Управление задачами else if (data.startsWith('task_')) { await this.handleTaskAction(ctx, data); @@ -266,7 +280,8 @@ ${partner ? `👥 Партнер: ${partnerName} ${partnerEmoji}` : ''} ctx.session = { ...ctx.session, step: 'task_title', - taskData: {} + taskData: {}, + currentTasksList: undefined // Очищаем данные пагинации }; const keyboard = Markup.inlineKeyboard([ @@ -615,7 +630,11 @@ ${partner ? `👥 Партнер: ${partnerName} ${partnerEmoji}` : ''} return; } - // Показываем первые 5 задач с кнопками для навигации + // Сохраняем контекст в сессии и показываем первые 5 задач + ctx.session = { + ...ctx.session, + currentTasksList: { tasks, title: 'Мои задачи', type: 'my' } + }; await this.showTasksList(ctx, tasks, 'Мои задачи', 0); } @@ -642,6 +661,10 @@ ${partner ? `👥 Партнер: ${partnerName} ${partnerEmoji}` : ''} return; } + ctx.session = { + ...ctx.session, + currentTasksList: { tasks, title: 'Общие задачи', type: 'shared' } + }; await this.showTasksList(ctx, tasks, 'Общие задачи', 0); } @@ -688,12 +711,23 @@ ${partner ? `👥 Партнер: ${partnerName} ${partnerEmoji}` : ''} return; } - await this.showTasksList( - ctx, - partnerTasks, - `Задачи ${partner.getFullName()} ${partner.getRoleEmoji()}`, - 0 - ); + const partnerTitle = `Задачи ${partner.getFullName()} ${partner.getRoleEmoji()}`; + ctx.session = { + ...ctx.session, + currentTasksList: { tasks: partnerTasks, title: partnerTitle, type: 'partner' } + }; + await this.showTasksList(ctx, partnerTasks, partnerTitle, 0); + } + + private async handleTasksPagination(ctx: BotContext, data: string) { + const pageNumber = parseInt(data.replace('tasks_page_', '')); + if (isNaN(pageNumber) || !ctx.session?.currentTasksList) { + await ctx.answerCbQuery('❌ Ошибка навигации'); + return; + } + + const { tasks, title } = ctx.session.currentTasksList; + await this.showTasksList(ctx, tasks, title, pageNumber); } private async showTasksList(ctx: BotContext, tasks: Task[], title: string, page: number = 0) { @@ -702,7 +736,12 @@ ${partner ? `👥 Партнер: ${partnerName} ${partnerEmoji}` : ''} const endIndex = Math.min(startIndex + pageSize, tasks.length); const pageTasks = tasks.slice(startIndex, endIndex); - let message = `📋 *${title}* (${tasks.length})\n\n`; + const totalPages = Math.ceil(tasks.length / pageSize); + let message = `📋 *${title}* (${tasks.length})\n`; + if (totalPages > 1) { + message += `📄 Страница ${page + 1} из ${totalPages}\n`; + } + message += '\n'; const buttons: any[][] = [];