From dd9f8507bdc08d01a12ec6db5cc4e0c3c8ee0615 Mon Sep 17 00:00:00 2001 From: efim Date: Sun, 12 Apr 2026 16:42:46 +0300 Subject: [PATCH 01/11] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D1=81=D0=BE=D1=81=D1=82=D0=BE=D1=8F=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=20=D0=B4=D0=BB=D1=8F=20firstName=20=D0=B8=20lastName=20=D0=B8?= =?UTF-8?q?=20=D0=BD=D0=B5=D0=B1=D0=BE=D0=BB=D1=8C=D1=88=D0=BE=D0=B9=20?= =?UTF-8?q?=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE=D1=80=D0=B8=D0=BD?= =?UTF-8?q?=D0=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/pages/AuthPage.tsx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/frontend/src/pages/AuthPage.tsx b/frontend/src/pages/AuthPage.tsx index b044f38..263ee33 100644 --- a/frontend/src/pages/AuthPage.tsx +++ b/frontend/src/pages/AuthPage.tsx @@ -4,9 +4,14 @@ import { supabase } from '../lib/supabase'; export default function AuthPage() { const [isLogin, setIsLogin] = useState(true); + + const [firstName, setFirstName] = useState(''); + const [lastName, setLastName] = useState(''); + const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const [confirmPassword, setConfirmPassword] = useState(''); + const [error, setError] = useState(''); const [loading, setLoading] = useState(false); From c8cad8816c3094eaf246beaf6b2ae4226f796a59 Mon Sep 17 00:00:00 2001 From: efim Date: Sun, 12 Apr 2026 16:44:20 +0300 Subject: [PATCH 02/11] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D1=81=D0=B1=D1=80=D0=BE=D1=81=D0=B0=20=D1=81=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D0=BE=D1=8F=D0=BD=D0=B8=D1=8F=20=D1=84=D0=BE=D1=80=D0=BC=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/pages/AuthPage.tsx | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/frontend/src/pages/AuthPage.tsx b/frontend/src/pages/AuthPage.tsx index 263ee33..2d9455f 100644 --- a/frontend/src/pages/AuthPage.tsx +++ b/frontend/src/pages/AuthPage.tsx @@ -34,6 +34,14 @@ export default function AuthPage() { checkSession(); }, [navigate]); + const resetForm = () => { + setFirstName(''); + setLastName(''); + setEmail(''); + setPassword(''); + setConfirmPassword(''); + }; + const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); From 0e3301f9b26d0260378e253c42b643b57c4ded8c Mon Sep 17 00:00:00 2001 From: efim Date: Sun, 12 Apr 2026 16:46:51 +0300 Subject: [PATCH 03/11] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BF=D0=BE=D0=BB=D1=8F=20=D0=B2=20=D1=84=D0=BE=D1=80?= =?UTF-8?q?=D0=BC=D0=B5=20=D0=B4=D0=BB=D1=8F=20=D0=B2=D0=B2=D0=BE=D0=B4?= =?UTF-8?q?=D0=B0=20=D1=84=D0=B0=D0=BC=D0=B8=D0=BB=D0=B8=D0=B8=20=D0=B8=20?= =?UTF-8?q?=D0=B8=D0=BC=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/pages/AuthPage.tsx | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/frontend/src/pages/AuthPage.tsx b/frontend/src/pages/AuthPage.tsx index 2d9455f..bfd2b80 100644 --- a/frontend/src/pages/AuthPage.tsx +++ b/frontend/src/pages/AuthPage.tsx @@ -136,6 +136,7 @@ export default function AuthPage() {

+
+ {!isLogin && ( + <> +
+ + setFirstName(e.target.value)} + required + /> +
+ +
+ + setLastName(e.target.value)} + required + /> +
+ + )} {/* Это поле покажется только если мы на вкладке регистрации */} {!isLogin && ( From ab38fcd987d3d09f67d17c32b03422e5fe116b0a Mon Sep 17 00:00:00 2001 From: efim Date: Sun, 12 Apr 2026 16:48:28 +0300 Subject: [PATCH 04/11] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D1=83=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=81=D0=BB=D1=83=D1=87=D0=B0=D0=B9=20=D0=BE?= =?UTF-8?q?=D1=82=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=BD=D0=B5=D0=B7=D0=B0=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=BD=D1=8B=D1=85=20=D0=BF=D0=BE=D0=BB=D0=B5=D0=B9=20=D1=82?= =?UTF-8?q?=D0=B0=D0=BA=D0=B6=D0=B5=20=D0=B4=D0=BB=D1=8F=20firstName=20?= =?UTF-8?q?=D0=B8=20lastName?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/pages/AuthPage.tsx | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/frontend/src/pages/AuthPage.tsx b/frontend/src/pages/AuthPage.tsx index bfd2b80..bc9a588 100644 --- a/frontend/src/pages/AuthPage.tsx +++ b/frontend/src/pages/AuthPage.tsx @@ -58,6 +58,21 @@ export default function AuthPage() { return; } + if (!firstName.trim()) { + setError('Введите имя'); + return; + } + + if (!lastName.trim()) { + setError('Введите фамилию'); + return; + } + + if (!confirmPassword.trim()) { + setError('Повторите пароль'); + return; + } + if (password !== confirmPassword) { setError('Пароли не совпадают'); return; From 1951c0f15c30b30e061bbe513bac53bcfae620a9 Mon Sep 17 00:00:00 2001 From: efim Date: Sun, 12 Apr 2026 16:50:55 +0300 Subject: [PATCH 05/11] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D1=87=D1=82=D0=BE=20=D0=B2=20signUp=20=D1=82=D0=B0?= =?UTF-8?q?=D0=BA=D0=B6=D0=B5=20=D0=BE=D1=82=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D1=8F=D1=8E=D1=82=D1=81=D1=8F=20firstName=20=D0=B8=20lastName?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/pages/AuthPage.tsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/frontend/src/pages/AuthPage.tsx b/frontend/src/pages/AuthPage.tsx index bc9a588..2faa6d8 100644 --- a/frontend/src/pages/AuthPage.tsx +++ b/frontend/src/pages/AuthPage.tsx @@ -84,6 +84,12 @@ export default function AuthPage() { const { data, error } = await supabase.auth.signUp({ email: email.trim(), password, + options: { + data: { + first_name: firstName.trim(), + last_name: lastName.trim(), + }, + }, }); if (error) { From fe3cfccb44cd8b8bd0618ffda9ac778c1553c2c1 Mon Sep 17 00:00:00 2001 From: efim Date: Sun, 12 Apr 2026 16:52:20 +0300 Subject: [PATCH 06/11] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BE=D1=87=D0=B8=D1=81=D1=82=D0=BA=D1=83=20=D1=84?= =?UTF-8?q?=D0=BE=D1=80=D0=BC=D1=8B=20=D1=87=D0=B5=D1=80=D0=B5=D0=B7=20?= =?UTF-8?q?=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=20resetForm()=20=D0=BF=D0=BE?= =?UTF-8?q?=D1=81=D0=BB=D0=B5=20=D1=83=D1=81=D0=BF=D0=B5=D1=88=D0=BD=D0=BE?= =?UTF-8?q?=D0=B9=20=D1=80=D0=B5=D0=B3=D0=B8=D1=81=D1=82=D1=80=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=B8,=20=D0=B2=D1=85=D0=BE=D0=B4=D0=B0=20=D0=B8=20?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B8=20=D0=BC=D0=B5=D0=B6=D0=B4=D1=83=20=D0=B2=D1=85?= =?UTF-8?q?=D0=BE=D0=B4=D0=BE=D0=BC=20=D0=B8=20=D1=80=D0=B5=D0=B3=D0=B8?= =?UTF-8?q?=D1=81=D1=82=D1=80=D0=B0=D1=86=D0=B8=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/pages/AuthPage.tsx | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/frontend/src/pages/AuthPage.tsx b/frontend/src/pages/AuthPage.tsx index 2faa6d8..28e5285 100644 --- a/frontend/src/pages/AuthPage.tsx +++ b/frontend/src/pages/AuthPage.tsx @@ -98,9 +98,7 @@ export default function AuthPage() { } if (data.user) { - setEmail(''); - setPassword(''); - setConfirmPassword(''); + resetForm(); navigate('/courses'); } } catch (err) { @@ -136,9 +134,7 @@ export default function AuthPage() { } if (data.session) { - setEmail(''); - setPassword(''); - setConfirmPassword(''); + resetForm(); navigate('/courses'); } } catch (err) { @@ -234,7 +230,7 @@ export default function AuthPage() { onClick={() => { setIsLogin(!isLogin); setError(''); - setConfirmPassword(''); + resetForm(); }} > {isLogin ? 'Создать' : 'Войти'} From 6ed67427802672792204b1be4d16f9d6b5cf35cb Mon Sep 17 00:00:00 2001 From: efim Date: Sun, 12 Apr 2026 16:56:37 +0300 Subject: [PATCH 07/11] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D1=81=D1=82?= =?UTF-8?q?=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=BC=D0=B5=D1=81=D1=82=D0=B0=D0=BC?= =?UTF-8?q?=D0=B8=20=D0=BF=D0=BE=D0=BB=D1=8F=20=D0=B2=20=D1=84=D0=BE=D1=80?= =?UTF-8?q?=D0=BC=D0=B5=20=D0=B4=D0=BB=D1=8F=20lastName=20=D0=B8=20firstNa?= =?UTF-8?q?me=20=D1=81=20email=20=D0=B8=20password=20(=D0=B2=D1=80=D0=BE?= =?UTF-8?q?=D0=B4=D0=B5=20=D0=BE=D0=B1=D1=8B=D1=87=D0=BD=D0=BE=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D1=8F=20=D0=B4=D0=BB=D1=8F=20=D0=BD=D0=B8=D1=85=20?= =?UTF-8?q?=D0=B2=20=D0=BD=D0=B0=D1=87=D0=B0=D0=BB=D0=B5=20=D1=81=D1=82?= =?UTF-8?q?=D0=B0=D0=B2=D1=8F=D1=82)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/pages/AuthPage.tsx | 43 ++++++++++++++++----------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/frontend/src/pages/AuthPage.tsx b/frontend/src/pages/AuthPage.tsx index 28e5285..6498948 100644 --- a/frontend/src/pages/AuthPage.tsx +++ b/frontend/src/pages/AuthPage.tsx @@ -153,28 +153,6 @@ export default function AuthPage() {

- -
- - setEmail(e.target.value)} - required - /> -
- -
- - setPassword(e.target.value)} - required - /> -
{!isLogin && ( <>
@@ -200,6 +178,27 @@ export default function AuthPage() {
)} +
+ + setEmail(e.target.value)} + required + /> +
+ +
+ + setPassword(e.target.value)} + required + /> +
{/* Это поле покажется только если мы на вкладке регистрации */} {!isLogin && ( From 1aeb77f52407131b519f2131b97ffcb03eb24033 Mon Sep 17 00:00:00 2001 From: efim Date: Sun, 12 Apr 2026 17:00:02 +0300 Subject: [PATCH 08/11] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B0=D0=B2=D1=82=D0=BE=D0=B7=D0=B0=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B4=D0=BB=D1=8F=20=D0=B2?= =?UTF-8?q?=D1=81=D0=B5=D1=85=20=D0=BF=D0=BE=D0=BB=D0=B5=D0=B9=20=D0=B2=20?= =?UTF-8?q?=D1=84=D0=BE=D1=80=D0=BC=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/pages/AuthPage.tsx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/frontend/src/pages/AuthPage.tsx b/frontend/src/pages/AuthPage.tsx index 6498948..cef1442 100644 --- a/frontend/src/pages/AuthPage.tsx +++ b/frontend/src/pages/AuthPage.tsx @@ -162,6 +162,7 @@ export default function AuthPage() { placeholder="Имя" value={firstName} onChange={(e) => setFirstName(e.target.value)} + autoComplete="given-name" required /> @@ -173,6 +174,7 @@ export default function AuthPage() { placeholder="Фамилия" value={lastName} onChange={(e) => setLastName(e.target.value)} + autoComplete="family-name" required /> @@ -185,6 +187,7 @@ export default function AuthPage() { placeholder="Email" value={email} onChange={(e) => setEmail(e.target.value)} + autoComplete="email" required /> @@ -196,6 +199,7 @@ export default function AuthPage() { placeholder="Пароль" value={password} onChange={(e) => setPassword(e.target.value)} + autoComplete={isLogin ? 'current-password' : 'new-password'} required /> @@ -209,6 +213,7 @@ export default function AuthPage() { placeholder="Повторите пароль" value={confirmPassword} onChange={(e) => setConfirmPassword(e.target.value)} + autoComplete="new-password" required /> From f149f566a16365d1ac8bea2354f6df43d07d2a5b Mon Sep 17 00:00:00 2001 From: efim Date: Sun, 12 Apr 2026 17:03:12 +0300 Subject: [PATCH 09/11] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D1=83=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=81=D0=BB=D1=83=D1=87=D0=B0=D0=B9=20=D0=B5?= =?UTF-8?q?=D1=81=D0=BB=D0=B8=20=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D1=82=D0=B5=D0=BB=D1=8C=20=D1=81=D0=BE=D0=B7=D0=B4=D0=B0?= =?UTF-8?q?=D0=BD,=20=D0=BD=D0=BE=20=D0=BD=D0=B5=20=D0=BF=D0=BE=D0=B4?= =?UTF-8?q?=D1=82=D0=B2=D0=B5=D1=80=D0=B6=D0=B4=D0=B5=D0=BD=D0=B0=20=D0=BF?= =?UTF-8?q?=D0=BE=D1=87=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/pages/AuthPage.tsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/frontend/src/pages/AuthPage.tsx b/frontend/src/pages/AuthPage.tsx index cef1442..263c04c 100644 --- a/frontend/src/pages/AuthPage.tsx +++ b/frontend/src/pages/AuthPage.tsx @@ -97,9 +97,15 @@ export default function AuthPage() { return; } - if (data.user) { + if (data.session) { resetForm(); navigate('/courses'); + return; + } + + if (data.user) { + resetForm(); + setError('Проверьте почту и подтвердите регистрацию'); } } catch (err) { setError(err instanceof Error ? err.message : 'Ошибка регистрации'); From b1dc5c3f7f4dd81aa530c805c799841c294c57df Mon Sep 17 00:00:00 2001 From: efim Date: Sun, 12 Apr 2026 18:09:40 +0300 Subject: [PATCH 10/11] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D1=82=D0=B5=D0=BA=D1=81=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/pages/AuthPage.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frontend/src/pages/AuthPage.tsx b/frontend/src/pages/AuthPage.tsx index 263c04c..e477f6c 100644 --- a/frontend/src/pages/AuthPage.tsx +++ b/frontend/src/pages/AuthPage.tsx @@ -105,8 +105,10 @@ export default function AuthPage() { if (data.user) { resetForm(); - setError('Проверьте почту и подтвердите регистрацию'); + setError('Если аккаунт новый, подтвердите регистрацию через почту. Если такой email уже зарегистрирован, просто войдите.'); + return; } + } catch (err) { setError(err instanceof Error ? err.message : 'Ошибка регистрации'); } finally { From 5b6341f1f54aa9aa7bfed8fd6c54018cfde0d124 Mon Sep 17 00:00:00 2001 From: efim Date: Sun, 12 Apr 2026 18:41:30 +0300 Subject: [PATCH 11/11] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BE=D1=82=D0=BE=D0=B1=D1=80=D0=B0=D0=B6=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D1=84=D0=B0=D0=BC=D0=B8=D0=BB=D0=B8=D0=B8=20?= =?UTF-8?q?=D0=B8=20=D0=B8=D0=BC=D0=B5=D0=BD=D0=B8=20=D0=B2=20=D1=88=D0=B0?= =?UTF-8?q?=D0=BF=D0=BA=D0=B5=20=D1=81=D0=B0=D0=B9=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/App.tsx | 60 ++++++++++++++++++++++++++++++++------------ 1 file changed, 44 insertions(+), 16 deletions(-) diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index fc8a7ed..7dec856 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -7,11 +7,15 @@ import TaskDetails from './pages/TaskDetails'; import CalendarPage from './pages/CalendarPage'; import { supabase } from './lib/supabase'; import ProtectedRoute from './components/ProtectedRoute'; +import {useEffect, useState} from "react"; function Navigation() { - const location = useLocation(); + + const location = useLocation(); const navigate = useNavigate(); + const [fullName, setFullName] = useState(''); + const handleLogout = async () => { const { error } = await supabase.auth.signOut(); @@ -23,6 +27,25 @@ function Navigation() { navigate('/'); }; + useEffect(() => { + const loadUser = async () => { + const { data, error } = await supabase.auth.getUser(); + + if (error) { + console.error('Ошибка получения пользователя:', error.message); + return; + } + + const firstName = data.user?.user_metadata?.first_name ?? ''; + const lastName = data.user?.user_metadata?.last_name ?? ''; + + const name = `${firstName} ${lastName}`.trim(); + setFullName(name); + console.log(name); + }; + + loadUser(); + }, []); // Если мы на странице авторизации, шапку не показываем if (location.pathname === '/') return null; @@ -31,21 +54,26 @@ function Navigation() {

UniFlow