From f4a4b41dd501e7997012d2524c6cc78f9942619d Mon Sep 17 00:00:00 2001 From: Ruslan Bakiev <572431+veikab@users.noreply.github.com> Date: Thu, 2 Apr 2026 16:12:34 +0700 Subject: [PATCH] refactor(auth): unify messenger bot link flow across login/profile/notifications --- app/composables/useMessengerBotLink.ts | 10 ++++++++++ app/pages/login.vue | 19 +++++++------------ app/pages/notifications.vue | 5 ++--- app/pages/profile.vue | 5 ++--- 4 files changed, 21 insertions(+), 18 deletions(-) create mode 100644 app/composables/useMessengerBotLink.ts diff --git a/app/composables/useMessengerBotLink.ts b/app/composables/useMessengerBotLink.ts new file mode 100644 index 0000000..f2b694a --- /dev/null +++ b/app/composables/useMessengerBotLink.ts @@ -0,0 +1,10 @@ +export function buildMessengerBotStartUrl(baseUrl: string, email: string) { + const normalizedEmail = email.trim().toLowerCase(); + if (!baseUrl || !normalizedEmail) { + return ''; + } + + const payload = encodeURIComponent(`login:${normalizedEmail}`); + const separator = baseUrl.includes('?') ? '&' : '?'; + return `${baseUrl}${separator}start=${payload}`; +} diff --git a/app/pages/login.vue b/app/pages/login.vue index 1c47948..ea9be48 100644 --- a/app/pages/login.vue +++ b/app/pages/login.vue @@ -5,6 +5,7 @@ import { RequestLoginCodeDocument, VerifyLoginCodeDocument, } from '~/composables/graphql/generated'; +import { buildMessengerBotStartUrl } from '~/composables/useMessengerBotLink'; const config = useRuntimeConfig(); const route = useRoute(); @@ -35,18 +36,12 @@ const maxBotUrl = computed(() => config.public.maxBotUrl || ''); const normalizedEmail = computed(() => email.value.trim().toLowerCase()); const isEmailReady = computed(() => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(normalizedEmail.value)); -function buildBotLoginUrl(baseUrl: string) { - if (!isEmailReady.value || !baseUrl) { - return ''; - } - - const payload = encodeURIComponent(`login:${normalizedEmail.value}`); - const separator = baseUrl.includes('?') ? '&' : '?'; - return `${baseUrl}${separator}start=${payload}`; -} - -const telegramLoginUrl = computed(() => buildBotLoginUrl(telegramBotUrl.value)); -const maxLoginUrl = computed(() => buildBotLoginUrl(maxBotUrl.value)); +const telegramLoginUrl = computed(() => + isEmailReady.value ? buildMessengerBotStartUrl(telegramBotUrl.value, normalizedEmail.value) : '', +); +const maxLoginUrl = computed(() => + isEmailReady.value ? buildMessengerBotStartUrl(maxBotUrl.value, normalizedEmail.value) : '', +); async function finalizeSession(accessToken: string) { authCookie.value = accessToken; diff --git a/app/pages/notifications.vue b/app/pages/notifications.vue index 559f479..6837b21 100644 --- a/app/pages/notifications.vue +++ b/app/pages/notifications.vue @@ -6,6 +6,7 @@ import { MyNotificationHistoryDocument, SendTestMessengerMessageDocument, } from '~/composables/graphql/generated'; +import { buildMessengerBotStartUrl } from '~/composables/useMessengerBotLink'; const selectedChannel = ref<'TELEGRAM' | 'MAX'>('TELEGRAM'); const customMessage = ref('Тест канала уведомлений Fregat'); @@ -55,9 +56,7 @@ function buildBotConnectUrl(baseUrl: string) { return ''; } - const payload = encodeURIComponent(`login:${email}`); - const separator = baseUrl.includes('?') ? '&' : '?'; - return `${baseUrl}${separator}start=${payload}`; + return buildMessengerBotStartUrl(baseUrl, email); } const telegramConnectUrl = computed(() => buildBotConnectUrl(config.public.telegramBotUrl || '')); diff --git a/app/pages/profile.vue b/app/pages/profile.vue index daebf8f..9297c0e 100644 --- a/app/pages/profile.vue +++ b/app/pages/profile.vue @@ -1,6 +1,7 @@