diff --git a/apps/web/app/(auth)/browser/page.tsx b/apps/web/app/(auth)/browser/page.tsx index 3a431db..83115d1 100644 --- a/apps/web/app/(auth)/browser/page.tsx +++ b/apps/web/app/(auth)/browser/page.tsx @@ -23,6 +23,17 @@ export default function Auth() { callbackUrl: '/profile', redirect: false, telegramId: user?.id?.toString(), + }).then((result) => { + if ( + result?.error && + (result?.error?.includes('CredentialsSignin') || + result?.error?.includes('UNREGISTERED')) + ) { + // Пользователь не зарегистрирован + redirect('/unregistered'); + } else if (result?.ok) { + redirect('/profile'); + } }); }); } diff --git a/apps/web/app/(auth)/telegram/page.tsx b/apps/web/app/(auth)/telegram/page.tsx index bc07766..e3a09dc 100644 --- a/apps/web/app/(auth)/telegram/page.tsx +++ b/apps/web/app/(auth)/telegram/page.tsx @@ -30,7 +30,17 @@ function useAuth() { callbackUrl: '/profile', redirect: false, telegramId: initDataUser.id.toString(), - }).then(() => redirect('/profile')); + }).then((result) => { + if ( + result?.error && + (result?.error?.includes('CredentialsSignin') || result?.error?.includes('UNREGISTERED')) + ) { + // Пользователь не зарегистрирован + redirect('/unregistered'); + } else if (result?.ok) { + redirect('/profile'); + } + }); } }, [initDataUser?.id, status]); } diff --git a/apps/web/app/(auth)/unregistered/page.tsx b/apps/web/app/(auth)/unregistered/page.tsx new file mode 100644 index 0000000..eed47ee --- /dev/null +++ b/apps/web/app/(auth)/unregistered/page.tsx @@ -0,0 +1,54 @@ +import { UnregisteredClient } from './unregistered-client'; +import { Container } from '@/components/layout'; +import { env } from '@/config/env'; +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from '@repo/ui/components/ui/card'; +import { Bot, MessageCircle } from 'lucide-react'; + +export default function UnregisteredPage() { + return ( + +
+ + +
+ +
+ Давайте познакомимся + + Для использования приложения необходимо поделиться своим номером телефона с ботом + +
+ +
+
+
+ +
+

Как поделиться:

+
    +
  1. Вернитесь к Telegram боту
  2. +
  3. + Отправьте команду{' '} + /start +
  4. +
  5. Нажмите на появившуюся кнопку "Отправить номер телефона"
  6. +
  7. Закройте и откройте это приложение еще раз
  8. +
+
+
+
+
+ + +
+
+
+
+ ); +} diff --git a/apps/web/app/(auth)/unregistered/unregistered-client.tsx b/apps/web/app/(auth)/unregistered/unregistered-client.tsx new file mode 100644 index 0000000..5405052 --- /dev/null +++ b/apps/web/app/(auth)/unregistered/unregistered-client.tsx @@ -0,0 +1,37 @@ +'use client'; + +import { Button } from '@repo/ui/components/ui/button'; +import { Bot, ExternalLink } from 'lucide-react'; +import Link from 'next/link'; +import { signOut } from 'next-auth/react'; + +type UnregisteredClientProps = { + readonly botUrl: string; +}; + +export function UnregisteredClient({ botUrl }: UnregisteredClientProps) { + const handleSignOut = () => { + signOut({ callbackUrl: '/' }); + }; + const handleRefresh = () => { + window.location.reload(); + }; + + return ( +
+ + + +
+ ); +} diff --git a/apps/web/config/auth.ts b/apps/web/config/auth.ts index 315c629..e854bf0 100644 --- a/apps/web/config/auth.ts +++ b/apps/web/config/auth.ts @@ -1,3 +1,5 @@ +import { getClientWithToken } from '@repo/graphql/apollo/client'; +import * as GQL from '@repo/graphql/types'; import { type AuthOptions } from 'next-auth'; import CredentialsProvider from 'next-auth/providers/credentials'; @@ -32,7 +34,29 @@ export const authOptions: AuthOptions = { throw new TypeError('Invalid Telegram ID format'); } - return { id: parsedTelegramId.toString(), telegramId: parsedTelegramId }; + try { + // Проверяем, зарегистрирован ли пользователь + const { query } = await getClientWithToken(); + const result = await query({ + query: GQL.GetCustomerDocument, + variables: { telegramId: parsedTelegramId }, + }); + + const customer = result.data.customers.at(0); + + if (!customer) { + // Пользователь не зарегистрирован - перенаправляем на страницу регистрации + throw new Error('UNREGISTERED'); + } + + return { id: parsedTelegramId.toString(), telegramId: parsedTelegramId }; + } catch (error) { + if (error instanceof Error && error.message.includes('UNREGISTERED')) { + throw error; + } + + throw new Error('Authentication failed'); + } }, credentials: { telegramId: { label: 'Telegram ID', type: 'text' }, diff --git a/apps/web/middleware.ts b/apps/web/middleware.ts index 5c304c0..50f7d58 100644 --- a/apps/web/middleware.ts +++ b/apps/web/middleware.ts @@ -11,5 +11,5 @@ export default withAuth({ }); export const config = { - matcher: ['/((?!auth|browser|telegram|api|_next/static|_next/image|favicon.ico).*)'], + matcher: ['/((?!auth|browser|telegram|unregistered|api|_next/static|_next/image|favicon.ico).*)'], };