From 08036f52f65b07b586c517487706e2f283a1df0c Mon Sep 17 00:00:00 2001 From: Konstantin Makaev Date: Thu, 19 Feb 2026 13:28:43 +0300 Subject: [PATCH] =?UTF-8?q?+=D0=BC=D0=BE=D0=B1=D0=B8=D0=BB=D1=8C=D0=BD?= =?UTF-8?q?=D0=B0=D1=8F=20=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/login/page.tsx | 43 +++- src/app/register/page.tsx | 77 ++++++- src/components/AppShell.tsx | 445 +++++++++++++++++++++++++++++------- src/lib/auth.ts | 110 +++++++++ 4 files changed, 596 insertions(+), 79 deletions(-) create mode 100644 src/lib/auth.ts diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx index eef6e31..43aa54b 100644 --- a/src/app/login/page.tsx +++ b/src/app/login/page.tsx @@ -1,6 +1,41 @@ +"use client"; + import Link from "next/link"; +import { FormEvent, useEffect, useState } from "react"; +import { useRouter } from "next/navigation"; +import { isAuthenticated, loginUser, seedDemoUser } from "../../lib/auth"; export default function Login() { + const router = useRouter(); + const [login, setLogin] = useState(""); + const [password, setPassword] = useState(""); + const [error, setError] = useState(""); + + useEffect(() => { + seedDemoUser(); + if (isAuthenticated()) { + router.replace("/"); + } + }, [router]); + + const handleSubmit = (event: FormEvent) => { + event.preventDefault(); + setError(""); + + if (!login.trim() || !password.trim()) { + setError("Заполните логин и пароль"); + return; + } + + const result = loginUser(login, password); + if (!result.ok) { + setError(result.message); + return; + } + + router.push("/"); + }; + return (
@@ -12,7 +47,7 @@ export default function Login() { Используйте телефон или почту, чтобы продолжить.

-
+
+ {error ?

{error}

: null}