From f2fb64a0b7daa6fdf05b8157ee77584d311b1fd4 Mon Sep 17 00:00:00 2001 From: Ruslan Bakiev <572431+veikab@users.noreply.github.com> Date: Fri, 3 Apr 2026 18:25:21 +0700 Subject: [PATCH] feat(profile): show messenger connect success state --- app/composables/useMessengerStart.ts | 4 ++- app/pages/login.vue | 5 +++ app/pages/notifications.vue | 1 + app/pages/profile/notifications.vue | 52 ++++++++++++++++++++++++++++ 4 files changed, 61 insertions(+), 1 deletion(-) diff --git a/app/composables/useMessengerStart.ts b/app/composables/useMessengerStart.ts index a88d68f..f40b1b4 100644 --- a/app/composables/useMessengerStart.ts +++ b/app/composables/useMessengerStart.ts @@ -13,12 +13,13 @@ type MessengerStartInput = { channel: MessengerChannel; baseUrl: string; email?: string; + redirectPath?: string; }; export function useMessengerStart() { const pendingChannel = ref(null); - async function openMessengerBot({ channel, baseUrl, email }: MessengerStartInput) { + async function openMessengerBot({ channel, baseUrl, email, redirectPath }: MessengerStartInput) { pendingChannel.value = channel; const payloadPromise = $fetch('/api/auth/messenger-start', { @@ -26,6 +27,7 @@ export function useMessengerStart() { body: { channel, email, + redirectPath, }, }); payloadPromise.finally(() => { diff --git a/app/pages/login.vue b/app/pages/login.vue index 12e6035..c49b77d 100644 --- a/app/pages/login.vue +++ b/app/pages/login.vue @@ -158,6 +158,11 @@ async function consumeLoginToken(loginToken: string) { return; } await finalizeSession(payload.accessToken); + const nextPath = typeof route.query.next === 'string' ? route.query.next : ''; + if (nextPath.startsWith('/')) { + await navigateTo(nextPath); + return; + } await navigateAfterLogin(payload.user); } diff --git a/app/pages/notifications.vue b/app/pages/notifications.vue index 613c655..adf3ee4 100644 --- a/app/pages/notifications.vue +++ b/app/pages/notifications.vue @@ -72,6 +72,7 @@ async function connectMessenger(channel: 'TELEGRAM' | 'MAX') { await openMessengerBot({ channel, baseUrl, + redirectPath: `/profile/notifications?status=success&connected=${channel.toLowerCase()}`, }); } diff --git a/app/pages/profile/notifications.vue b/app/pages/profile/notifications.vue index 9782687..cd6b76e 100644 --- a/app/pages/profile/notifications.vue +++ b/app/pages/profile/notifications.vue @@ -13,6 +13,7 @@ type MessengerItem = { }; const config = useRuntimeConfig(); +const route = useRoute(); const meQuery = useQuery(MeDocument); const connectionsQuery = useQuery(MyMessengerConnectionsDocument); const { openMessengerBot, pendingChannel } = useMessengerStart(); @@ -40,6 +41,35 @@ function buildBotConnectUrl(baseUrl: string) { const telegramConnectUrl = computed(() => buildBotConnectUrl(config.public.telegramBotUrl || '')); const maxConnectUrl = computed(() => buildBotConnectUrl(config.public.maxBotUrl || '')); +const successChannel = computed(() => { + const raw = String(route.query.connected || '').trim().toLowerCase(); + return raw === 'telegram' || raw === 'max' ? raw : ''; +}); +const showSuccess = computed(() => route.query.status === 'success' && Boolean(successChannel.value)); +const profileName = computed(() => meQuery.result.value?.me?.fullName?.trim() || meQuery.result.value?.me?.email || 'Пользователь'); +const profileInitials = computed(() => + profileName.value + .split(' ') + .filter(Boolean) + .slice(0, 2) + .map((part) => part.charAt(0).toUpperCase()) + .join('') || 'FR', +); +const successTitle = computed(() => + successChannel.value === 'telegram' ? 'Telegram успешно подключен' : 'Max успешно подключен', +); +const successText = computed(() => + successChannel.value === 'telegram' + ? 'Теперь этот Telegram привязан к вашему кабинету, и уведомления будут приходить в него.' + : 'Теперь этот Max привязан к вашему кабинету, и уведомления будут приходить в него.', +); + +onMounted(() => { + if (showSuccess.value) { + void connectionsQuery.refetch(); + void meQuery.refetch(); + } +}); async function connectMessenger(channel: 'TELEGRAM' | 'MAX') { const baseUrl = channel === 'TELEGRAM' ? telegramConnectUrl.value : maxConnectUrl.value; @@ -50,6 +80,7 @@ async function connectMessenger(channel: 'TELEGRAM' | 'MAX') { await openMessengerBot({ channel, baseUrl, + redirectPath: `/profile/notifications?status=success&connected=${channel.toLowerCase()}`, }); } @@ -59,6 +90,27 @@ async function connectMessenger(channel: 'TELEGRAM' | 'MAX') { ← Назад в профиль

Уведомления

+
+
+
+
+ {{ profileInitials }} +
+
+ +
+
Успешно
+

{{ successTitle }}

+

+ {{ profileName }} +

+

+ {{ successText }} +

+
+
+
+

Подключите Telegram и Max, чтобы получать статусы заказов и важные уведомления в удобном канале.