🌟 feat(file/topic): Добавление обработчиков входа по email и телефону.
All checks were successful
Deploy / deploy (push) Successful in 48s

This commit is contained in:
Oscar
2026-06-01 11:29:41 +03:00
parent ed87b2c642
commit a52d7a1706
4 changed files with 39 additions and 4 deletions

View File

@@ -2,7 +2,7 @@ import bot from '@bot'
import prisma from '@prisma' import prisma from '@prisma'
import { debugFunc } from '@/hh/handlers/debug' import { debugFunc } from '@/hh/handlers/debug'
import { handleApply } from './handlers/apply.js' import { handleApply } from './handlers/apply.js'
import { doLogin, handleLogin } from './handlers/auth.js' import { doLogin, handleLogin, handleLoginByEmail, handleLoginByPhone } from './handlers/auth.js'
import { handleSkipped, handleStatus } from './handlers/info.js' import { handleSkipped, handleStatus } from './handlers/info.js'
import { finishOnboarding, showPromptStep, showQueryStep, showResumeInfo } from './handlers/onboarding.js' import { finishOnboarding, showPromptStep, showQueryStep, showResumeInfo } from './handlers/onboarding.js'
import { handleMyResume, handleResumeList, handleResumePick } from './handlers/resume.js' import { handleMyResume, handleResumeList, handleResumePick } from './handlers/resume.js'
@@ -39,6 +39,18 @@ const CALLBACK_HANDLERS: Record<string, CallbackHandler> = {
await bot.deleteMessage(chatId, messageId).catch(() => {}) await bot.deleteMessage(chatId, messageId).catch(() => {})
await handleLogin(chatId) await handleLogin(chatId)
}, },
hh_login_method_email: async (chatId, messageId) => {
const state = getState(chatId)
state.loginMethodMsgId = null
await bot.deleteMessage(chatId, messageId).catch(() => {})
await handleLoginByEmail(chatId)
},
hh_login_method_phone: async (chatId, messageId) => {
const state = getState(chatId)
state.loginMethodMsgId = null
await bot.deleteMessage(chatId, messageId).catch(() => {})
await handleLoginByPhone(chatId)
},
hh_login_use_current: async (chatId, messageId) => { hh_login_use_current: async (chatId, messageId) => {
const state = getState(chatId) const state = getState(chatId)
state.awaitingEmail = false state.awaitingEmail = false
@@ -109,6 +121,7 @@ const CALLBACK_HANDLERS: Record<string, CallbackHandler> = {
async function clearAwaitingState(chatId: number): Promise<void> { async function clearAwaitingState(chatId: number): Promise<void> {
const state = getState(chatId) const state = getState(chatId)
const msgIds = [ const msgIds = [
state.loginMethodMsgId,
state.loginPromptMessageId, state.loginPromptMessageId,
state.queryPromptMessageId, state.queryPromptMessageId,
state.maxPromptMessageId, state.maxPromptMessageId,
@@ -116,11 +129,13 @@ async function clearAwaitingState(chatId: number): Promise<void> {
state.onboardingMsgId, state.onboardingMsgId,
] ]
state.awaitingEmail = false state.awaitingEmail = false
state.awaitingPhone = false
state.awaitingQuery = false state.awaitingQuery = false
state.awaitingMax = false state.awaitingMax = false
state.awaitingPrompt = false state.awaitingPrompt = false
state.onboardingStep = null state.onboardingStep = null
state.onboardingMsgId = null state.onboardingMsgId = null
state.loginMethodMsgId = null
state.loginPromptMessageId = null state.loginPromptMessageId = null
state.queryPromptMessageId = null state.queryPromptMessageId = null
state.maxPromptMessageId = null state.maxPromptMessageId = null
@@ -170,7 +185,7 @@ export function registerHHCommands() {
return return
} }
const isAwaiting = state.awaitingEmail || state.awaitingQuery || state.awaitingMax || state.awaitingPrompt || state.onboardingStep !== null const isAwaiting = state.awaitingEmail || state.awaitingPhone || state.awaitingQuery || state.awaitingMax || state.awaitingPrompt || state.onboardingStep !== null
const isMenuButton = Object.values(BTN).includes(msg.text as typeof BTN[keyof typeof BTN]) const isMenuButton = Object.values(BTN).includes(msg.text as typeof BTN[keyof typeof BTN])
if (isMenuButton && isAwaiting) { if (isMenuButton && isAwaiting) {

View File

@@ -56,6 +56,19 @@ export async function doLogin(chatId: number, email: string): Promise<void> {
} }
export async function handleLogin(chatId: number): Promise<void> { export async function handleLogin(chatId: number): Promise<void> {
const state = getState(chatId)
const msg = await bot.sendMessage(chatId, '🔐 Выбери способ входа:', {
reply_markup: {
inline_keyboard: [[
{ text: '📧 Email', callback_data: 'hh_login_method_email' },
{ text: '📱 Телефон', callback_data: 'hh_login_method_phone' },
]],
},
})
state.loginMethodMsgId = msg.message_id
}
export async function handleLoginByEmail(chatId: number): Promise<void> {
const state = getState(chatId) const state = getState(chatId)
const user = await prisma.user.findUnique({ where: { telegramId: chatId } }) const user = await prisma.user.findUnique({ where: { telegramId: chatId } })
state.awaitingEmail = true state.awaitingEmail = true
@@ -79,3 +92,7 @@ export async function handleLogin(chatId: number): Promise<void> {
state.loginPromptMessageId = prompt.message_id state.loginPromptMessageId = prompt.message_id
} }
} }
export async function handleLoginByPhone(chatId: number): Promise<void> {
await bot.sendMessage(chatId, '📱 Авторизация по телефону — скоро будет доступна')
}

View File

@@ -1,7 +1,6 @@
import bot from '@bot' import bot from '@bot'
import { startOnboarding } from '@/hh/handlers/onboarding'
export async function debugFunc(chatId: number): Promise<void> { export async function debugFunc(chatId: number): Promise<void> {
await bot.sendMessage(chatId, '🌍 Регион — скоро будет доступно') await bot.sendMessage(chatId, '🌍 Регион — скоро будет доступно')
await startOnboarding(chatId) // await startOnboarding(chatId)
} }

View File

@@ -5,10 +5,12 @@ export interface UserState {
autoCron: ScheduledTask | null autoCron: ScheduledTask | null
isApplying: boolean isApplying: boolean
awaitingEmail: boolean awaitingEmail: boolean
awaitingPhone: boolean
awaitingQuery: boolean awaitingQuery: boolean
awaitingMax: boolean awaitingMax: boolean
awaitingPrompt: boolean awaitingPrompt: boolean
pendingResumes: ResumeListItem[] pendingResumes: ResumeListItem[]
loginMethodMsgId: number | null
loginPromptMessageId: number | null loginPromptMessageId: number | null
queryPromptMessageId: number | null queryPromptMessageId: number | null
maxPromptMessageId: number | null maxPromptMessageId: number | null
@@ -23,10 +25,12 @@ function makeUserState(): UserState {
autoCron: null, autoCron: null,
isApplying: false, isApplying: false,
awaitingEmail: false, awaitingEmail: false,
awaitingPhone: false,
awaitingQuery: false, awaitingQuery: false,
awaitingMax: false, awaitingMax: false,
awaitingPrompt: false, awaitingPrompt: false,
pendingResumes: [], pendingResumes: [],
loginMethodMsgId: null,
loginPromptMessageId: null, loginPromptMessageId: null,
queryPromptMessageId: null, queryPromptMessageId: null,
maxPromptMessageId: null, maxPromptMessageId: null,