From 2f8cf76a828729e3c463548c649330ae6c399dc3 Mon Sep 17 00:00:00 2001 From: Dody Date: Tue, 9 Apr 2024 13:17:30 +0700 Subject: [PATCH] feat: edit phone scene --- src/sale/sale.common.ts | 22 +++++-- src/sale/sale.constant.ts | 2 + src/sale/sale.service.ts | 6 +- src/sale/sale.update.ts | 7 +-- src/sale/scene/about.scene.ts | 11 +++- .../scene/profile/phone/phone_delete.scene.ts | 13 ++-- .../scene/profile/phone/phone_edit.scene.ts | 61 +++++++++---------- src/sale/scene/profile/profile.scene.ts | 11 +++- src/sale/scene/sale.scene.ts | 11 +++- src/sale/scene/tutorial.scene.ts | 11 +++- src/sale/scene/welcome.scene.ts | 20 +++++- 11 files changed, 109 insertions(+), 66 deletions(-) diff --git a/src/sale/sale.common.ts b/src/sale/sale.common.ts index 4a5c4d6..1e3442e 100644 --- a/src/sale/sale.common.ts +++ b/src/sale/sale.common.ts @@ -2,6 +2,7 @@ import { Markup } from 'telegraf'; import { InlineKeyboardButton } from 'telegraf/typings/core/types/typegram'; import { ExtraEditMessageText } from 'telegraf/typings/telegram-types'; import { SceneContext } from 'telegraf/scenes'; +import { FALLBACK_MESSAGE } from './sale.constant'; type Hideable = B & { hide?: boolean }; type HideableIKBtn = Hideable; @@ -16,13 +17,24 @@ const extra = (keyboard: HideableIKBtn[][]): ExtraEditMessageText => { }; }; -export const sendMessage = async ( +export const leaveScene = (ctx: SceneContext): void => { + sendMessageWithoutKeyboard(ctx, FALLBACK_MESSAGE); + ctx.scene.leave(); +}; + +export const sendMessageWithKeyboard = async ( ctx: SceneContext, message: string, keyboard: HideableIKBtn[][], - new_message: boolean = false, ): Promise => { - await (new_message - ? ctx.reply(message, extra(keyboard)) - : ctx.editMessageText(message, extra(keyboard))); + await (ctx.callbackQuery + ? ctx.editMessageText(message, extra(keyboard)) + : ctx.reply(message, extra(keyboard))); +}; + +export const sendMessageWithoutKeyboard = ( + ctx: SceneContext, + message: string, +): void => { + ctx.reply(message); }; diff --git a/src/sale/sale.constant.ts b/src/sale/sale.constant.ts index ad77c0d..72f4e4c 100644 --- a/src/sale/sale.constant.ts +++ b/src/sale/sale.constant.ts @@ -25,3 +25,5 @@ export const RESET_DAY = format( CONF_TZ_OPTION, ); export const TIMEZONE = format(CONF_TIME, CONF_TZ_FORMAT, CONF_TZ_OPTION); +export const FALLBACK_MESSAGE = + 'Wrong input, invalid command or something error.\n\nPlease restart by clicking /start.'; diff --git a/src/sale/sale.service.ts b/src/sale/sale.service.ts index edb7fee..cc9d515 100644 --- a/src/sale/sale.service.ts +++ b/src/sale/sale.service.ts @@ -1,5 +1,5 @@ import { Injectable } from '@nestjs/common'; -import { Cron } from '@nestjs/schedule'; +// import { Cron } from '@nestjs/schedule'; import { PrismaService } from 'src/prisma/prisma.service'; @Injectable() @@ -19,9 +19,9 @@ export class SaleService { }); } - async deletePhone(id: string): Promise { + async editPhone(id: string, phone: string | null): Promise { await this.prismaService.users.update({ - data: { phone: null }, + data: { phone }, where: { id }, }); } diff --git a/src/sale/sale.update.ts b/src/sale/sale.update.ts index c2fb3c5..6ab6e9a 100644 --- a/src/sale/sale.update.ts +++ b/src/sale/sale.update.ts @@ -1,4 +1,4 @@ -import { Hears, Start, Update, Ctx } from 'nestjs-telegraf'; +import { Start, Update, Ctx } from 'nestjs-telegraf'; import { SceneContext } from 'telegraf/scenes'; @Update() @@ -7,9 +7,4 @@ export class SaleUpdate { onStart(@Ctx() ctx: SceneContext): void { ctx.scene.enter('WELCOME_SCENE'); } - - @Hears(/.+/) - onFallback(): string { - return 'Wrong input, invalid command or something error.\n\nPlease restart by clicking /start.'; - } } diff --git a/src/sale/scene/about.scene.ts b/src/sale/scene/about.scene.ts index 84ad429..f3608a9 100644 --- a/src/sale/scene/about.scene.ts +++ b/src/sale/scene/about.scene.ts @@ -1,7 +1,7 @@ -import { Scene, SceneEnter, Ctx, Action } from 'nestjs-telegraf'; +import { Scene, SceneEnter, Ctx, Action, Hears } from 'nestjs-telegraf'; import { SceneContext } from 'telegraf/scenes'; import { Markup } from 'telegraf'; -import { sendMessage } from '../sale.common'; +import { leaveScene, sendMessageWithKeyboard } from '../sale.common'; @Scene('ABOUT_SCENE') export class AboutScene { @@ -28,11 +28,16 @@ export class AboutScene { message += `*License*\n`; message += `This open\\-source project is licensed under [MIT license](https://github.com/dodyagung/telegram-sale-bot/blob/master/LICENSE.md)\\.`; - sendMessage(ctx, message, keyboard); + sendMessageWithKeyboard(ctx, message, keyboard); } @Action('back') onBack(@Ctx() ctx: SceneContext): void { ctx.scene.enter('WELCOME_SCENE'); } + + @Hears(/.+/) + onFallback(@Ctx() ctx: SceneContext): void { + leaveScene(ctx); + } } diff --git a/src/sale/scene/profile/phone/phone_delete.scene.ts b/src/sale/scene/profile/phone/phone_delete.scene.ts index 39984b9..8899c5e 100644 --- a/src/sale/scene/profile/phone/phone_delete.scene.ts +++ b/src/sale/scene/profile/phone/phone_delete.scene.ts @@ -1,7 +1,7 @@ -import { Scene, SceneEnter, Ctx, Action } from 'nestjs-telegraf'; +import { Scene, SceneEnter, Ctx, Action, Hears } from 'nestjs-telegraf'; import { SceneContext } from 'telegraf/scenes'; import { Markup } from 'telegraf'; -import { sendMessage } from 'src/sale/sale.common'; +import { leaveScene, sendMessageWithKeyboard } from 'src/sale/sale.common'; import { SaleService } from 'src/sale/sale.service'; @Scene('PHONE_DELETE_SCENE') @@ -21,12 +21,12 @@ export class PhoneDeleteScene { message += `_You can always enable it again from Edit Phone menu\\._`; - sendMessage(ctx, message, keyboard); + sendMessageWithKeyboard(ctx, message, keyboard); } @Action('phone_delete_confirm') onPhoneDeleteConfirm(@Ctx() ctx: SceneContext): void { - this.saleService.deletePhone(ctx.from!.id.toString()); + this.saleService.editPhone(ctx.from!.id.toString(), null); ctx.scene.enter('PROFILE_SCENE'); } @@ -34,4 +34,9 @@ export class PhoneDeleteScene { onBack(@Ctx() ctx: SceneContext): void { ctx.scene.enter('PROFILE_SCENE'); } + + @Hears(/.+/) + onFallback(@Ctx() ctx: SceneContext): void { + leaveScene(ctx); + } } diff --git a/src/sale/scene/profile/phone/phone_edit.scene.ts b/src/sale/scene/profile/phone/phone_edit.scene.ts index 69f6067..89df8a8 100644 --- a/src/sale/scene/profile/phone/phone_edit.scene.ts +++ b/src/sale/scene/profile/phone/phone_edit.scene.ts @@ -1,7 +1,17 @@ -import { Scene, SceneEnter, Ctx, Action } from 'nestjs-telegraf'; +import { + Scene, + SceneEnter, + Ctx, + Action, + Hears, + Message, +} from 'nestjs-telegraf'; import { SceneContext } from 'telegraf/scenes'; -import { Markup } from 'telegraf'; -import { sendMessage } from 'src/sale/sale.common'; +import { Markup, Scenes } from 'telegraf'; +import { + sendMessageWithKeyboard, + sendMessageWithoutKeyboard, +} from 'src/sale/sale.common'; import { SaleService } from 'src/sale/sale.service'; @Scene('PHONE_EDIT_SCENE') @@ -10,42 +20,27 @@ export class PhoneEditScene { @SceneEnter() async onSceneEnter(@Ctx() ctx: SceneContext): Promise { - const keyboard = [ - [ - Markup.button.callback('✏️ Edit Phone', 'phone_edit'), - Markup.button.callback('❌ Delete Phone', 'phone_delete'), - ], - [Markup.button.callback('👈 Back', 'back')], - ]; + const keyboard = [[Markup.button.callback('👈 Cancel and Back', 'back')]]; - let message: string = `*👤 My Profile*\n\n`; + let message: string = `*✏️ Edit Phone*\n\n`; - message += `This is your account information\\. You can also edit or delete your phone below\\.\n\n`; + message += `Type your phone number below, e\\.g\\. 08123456789\\.`; - message += `*Telegram Info*\n`; - message += `├ ID : \`${ctx.from!.id}\`\n`; - message += `├ Username : \`${ctx.from?.username ?? ''}\`\n`; - message += `├ First Name : \`${ctx.from!.first_name}\`\n`; - message += `└ Last Name : \`${ctx.from?.last_name ?? ''}\`\n\n`; - - message += `*Additional Info*\n`; - message += `└ Phone : \`${(await this.saleService.getPhone(ctx.from!.id.toString()))?.phone ?? ''}\`\n\n`; - - sendMessage(ctx, message, keyboard); - } - - @Action('phone_edit') - onPhoneEdit(@Ctx() ctx: SceneContext): void { - ctx.scene.enter('PHONE_EDIT_SCENE'); - } - - @Action('phone_delete') - onPhoneDelete(@Ctx() ctx: SceneContext): void { - ctx.scene.enter('PHONE_DELETE_SCENE'); + sendMessageWithKeyboard(ctx, message, keyboard); } @Action('back') onBack(@Ctx() ctx: SceneContext): void { - ctx.scene.enter('WELCOME_SCENE'); + ctx.scene.enter('PROFILE_SCENE'); + } + + @Hears(/.+/) + onFallback(@Ctx() ctx: SceneContext, @Message() msg: { text: string }): void { + this.saleService.editPhone(ctx.from!.id.toString(), msg.text); + sendMessageWithoutKeyboard( + ctx, + `Successfuly edited the phone with ${msg.text}!`, + ); + ctx.scene.enter('PROFILE_SCENE'); } } diff --git a/src/sale/scene/profile/profile.scene.ts b/src/sale/scene/profile/profile.scene.ts index 2160ca9..f842eea 100644 --- a/src/sale/scene/profile/profile.scene.ts +++ b/src/sale/scene/profile/profile.scene.ts @@ -1,7 +1,7 @@ -import { Scene, SceneEnter, Ctx, Action } from 'nestjs-telegraf'; +import { Scene, SceneEnter, Ctx, Action, Hears } from 'nestjs-telegraf'; import { SceneContext } from 'telegraf/scenes'; import { Markup } from 'telegraf'; -import { sendMessage } from '../../sale.common'; +import { leaveScene, sendMessageWithKeyboard } from '../../sale.common'; import { SaleService } from '../../sale.service'; @Scene('PROFILE_SCENE') @@ -47,7 +47,7 @@ export class ProfileScene { message += `*Additional Info*\n`; message += `└ Phone : \`${(await this.getPhone(ctx)) ?? ''}\`\n\n`; - sendMessage(ctx, message, keyboard); + sendMessageWithKeyboard(ctx, message, keyboard); } @Action('phone_edit') @@ -64,4 +64,9 @@ export class ProfileScene { onBack(@Ctx() ctx: SceneContext): void { ctx.scene.enter('WELCOME_SCENE'); } + + @Hears(/.+/) + onFallback(@Ctx() ctx: SceneContext): void { + leaveScene(ctx); + } } diff --git a/src/sale/scene/sale.scene.ts b/src/sale/scene/sale.scene.ts index 1a40ff4..3c8d0c6 100644 --- a/src/sale/scene/sale.scene.ts +++ b/src/sale/scene/sale.scene.ts @@ -1,7 +1,7 @@ -import { Scene, SceneEnter, Ctx, Action } from 'nestjs-telegraf'; +import { Scene, SceneEnter, Ctx, Action, Hears } from 'nestjs-telegraf'; import { SceneContext } from 'telegraf/scenes'; import { Markup } from 'telegraf'; -import { sendMessage } from '../sale.common'; +import { leaveScene, sendMessageWithKeyboard } from '../sale.common'; @Scene('SALE_SCENE') export class SaleScene { @@ -10,11 +10,16 @@ export class SaleScene { const keyboard = [[Markup.button.callback('👈 Back', 'back')]]; const message = ' sale scene'; - sendMessage(ctx, message, keyboard); + sendMessageWithKeyboard(ctx, message, keyboard); } @Action('back') onBack(@Ctx() ctx: SceneContext): void { ctx.scene.enter('WELCOME_SCENE'); } + + @Hears(/.+/) + onFallback(@Ctx() ctx: SceneContext): void { + leaveScene(ctx); + } } diff --git a/src/sale/scene/tutorial.scene.ts b/src/sale/scene/tutorial.scene.ts index ce730e9..70770fd 100644 --- a/src/sale/scene/tutorial.scene.ts +++ b/src/sale/scene/tutorial.scene.ts @@ -1,7 +1,7 @@ -import { Scene, SceneEnter, Ctx, Action } from 'nestjs-telegraf'; +import { Scene, SceneEnter, Ctx, Action, Hears } from 'nestjs-telegraf'; import { SceneContext } from 'telegraf/scenes'; import { Markup } from 'telegraf'; -import { sendMessage } from '../sale.common'; +import { leaveScene, sendMessageWithKeyboard } from '../sale.common'; @Scene('TUTORIAL_SCENE') export class TutorialScene { @@ -17,11 +17,16 @@ export class TutorialScene { message += `5\\. The actual view that will be sent to the group can be seen in *Manage Sale*\\.\n\n`; message += `6\\. If there are problems or errors, contact us on the About menu\\.`; - sendMessage(ctx, message, keyboard); + sendMessageWithKeyboard(ctx, message, keyboard); } @Action('back') onBack(@Ctx() ctx: SceneContext): void { ctx.scene.enter('WELCOME_SCENE'); } + + @Hears(/.+/) + onFallback(@Ctx() ctx: SceneContext): void { + leaveScene(ctx); + } } diff --git a/src/sale/scene/welcome.scene.ts b/src/sale/scene/welcome.scene.ts index 213a093..b705334 100644 --- a/src/sale/scene/welcome.scene.ts +++ b/src/sale/scene/welcome.scene.ts @@ -1,14 +1,23 @@ -import { Scene, SceneEnter, Ctx, Action, Sender } from 'nestjs-telegraf'; +import { + Scene, + SceneEnter, + Ctx, + Action, + Sender, + Hears, + Start, +} from 'nestjs-telegraf'; import { SceneContext } from 'telegraf/scenes'; import { Markup } from 'telegraf'; import { ConfigService } from '@nestjs/config'; import { RESET_DAY, SALE_DAY, TIMEZONE, TODAY } from '../sale.constant'; -import { sendMessage } from '../sale.common'; +import { leaveScene, sendMessageWithKeyboard } from '../sale.common'; @Scene('WELCOME_SCENE') export class WelcomeScene { constructor(private configService: ConfigService) {} + @Start() @SceneEnter() async onSceneEnter( @Ctx() ctx: SceneContext, @@ -56,7 +65,7 @@ export class WelcomeScene { message += `├ Joined : \`${user_joined ? 'Yes' : 'No'}\`\n`; message += `└ Link : [Click Here](${this.configService.get('TELEGRAM_GROUP_LINK')})`; - sendMessage(ctx, message, keyboard, !ctx.callbackQuery); + sendMessageWithKeyboard(ctx, message, keyboard); } @Action('sale') @@ -78,4 +87,9 @@ export class WelcomeScene { onAboutAction(@Ctx() ctx: SceneContext): void { ctx.scene.enter('ABOUT_SCENE'); } + + @Hears(/.+/) + onFallback(@Ctx() ctx: SceneContext): void { + leaveScene(ctx); + } }