Skip to content

Commit

Permalink
feat: edit phone scene
Browse files Browse the repository at this point in the history
  • Loading branch information
dodyagung committed Apr 9, 2024
1 parent 83d4fad commit 2f8cf76
Show file tree
Hide file tree
Showing 11 changed files with 109 additions and 66 deletions.
22 changes: 17 additions & 5 deletions src/sale/sale.common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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> = B & { hide?: boolean };
type HideableIKBtn = Hideable<InlineKeyboardButton>;
Expand All @@ -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<void> => {
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);
};
2 changes: 2 additions & 0 deletions src/sale/sale.constant.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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.';
6 changes: 3 additions & 3 deletions src/sale/sale.service.ts
Original file line number Diff line number Diff line change
@@ -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()
Expand All @@ -19,9 +19,9 @@ export class SaleService {
});
}

async deletePhone(id: string): Promise<void> {
async editPhone(id: string, phone: string | null): Promise<void> {
await this.prismaService.users.update({
data: { phone: null },
data: { phone },
where: { id },
});
}
Expand Down
7 changes: 1 addition & 6 deletions src/sale/sale.update.ts
Original file line number Diff line number Diff line change
@@ -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()
Expand All @@ -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.';
}
}
11 changes: 8 additions & 3 deletions src/sale/scene/about.scene.ts
Original file line number Diff line number Diff line change
@@ -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 {
Expand All @@ -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);
}
}
13 changes: 9 additions & 4 deletions src/sale/scene/profile/phone/phone_delete.scene.ts
Original file line number Diff line number Diff line change
@@ -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')
Expand All @@ -21,17 +21,22 @@ 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');
}

@Action('back')
onBack(@Ctx() ctx: SceneContext): void {
ctx.scene.enter('PROFILE_SCENE');
}

@Hears(/.+/)
onFallback(@Ctx() ctx: SceneContext): void {
leaveScene(ctx);
}
}
61 changes: 28 additions & 33 deletions src/sale/scene/profile/phone/phone_edit.scene.ts
Original file line number Diff line number Diff line change
@@ -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')
Expand All @@ -10,42 +20,27 @@ export class PhoneEditScene {

@SceneEnter()
async onSceneEnter(@Ctx() ctx: SceneContext): Promise<void> {
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 ?? '<not set>'}\`\n`;
message += `├ First Name : \`${ctx.from!.first_name}\`\n`;
message += `└ Last Name : \`${ctx.from?.last_name ?? '<not set>'}\`\n\n`;

message += `*Additional Info*\n`;
message += `└ Phone : \`${(await this.saleService.getPhone(ctx.from!.id.toString()))?.phone ?? '<not set>'}\`\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');
}
}
11 changes: 8 additions & 3 deletions src/sale/scene/profile/profile.scene.ts
Original file line number Diff line number Diff line change
@@ -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')
Expand Down Expand Up @@ -47,7 +47,7 @@ export class ProfileScene {
message += `*Additional Info*\n`;
message += `└ Phone : \`${(await this.getPhone(ctx)) ?? '<not set>'}\`\n\n`;

sendMessage(ctx, message, keyboard);
sendMessageWithKeyboard(ctx, message, keyboard);
}

@Action('phone_edit')
Expand All @@ -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);
}
}
11 changes: 8 additions & 3 deletions src/sale/scene/sale.scene.ts
Original file line number Diff line number Diff line change
@@ -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 {
Expand All @@ -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);
}
}
11 changes: 8 additions & 3 deletions src/sale/scene/tutorial.scene.ts
Original file line number Diff line number Diff line change
@@ -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 {
Expand All @@ -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);
}
}
20 changes: 17 additions & 3 deletions src/sale/scene/welcome.scene.ts
Original file line number Diff line number Diff line change
@@ -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,
Expand Down Expand Up @@ -56,7 +65,7 @@ export class WelcomeScene {
message += `├ Joined : \`${user_joined ? 'Yes' : 'No'}\`\n`;
message += `└ Link : [Click Here](${this.configService.get<string>('TELEGRAM_GROUP_LINK')})`;

sendMessage(ctx, message, keyboard, !ctx.callbackQuery);
sendMessageWithKeyboard(ctx, message, keyboard);
}

@Action('sale')
Expand All @@ -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);
}
}

0 comments on commit 2f8cf76

Please sign in to comment.