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 (
+
+
+
+
+
+
+
+ Давайте познакомимся
+
+ Для использования приложения необходимо поделиться своим номером телефона с ботом
+
+
+
+
+
+
+
+
+
Как поделиться:
+
+ - Вернитесь к Telegram боту
+ -
+ Отправьте команду{' '}
+
/start
+
+ - Нажмите на появившуюся кнопку "Отправить номер телефона"
+ - Закройте и откройте это приложение еще раз
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
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).*)'],
};