From 37f51ee88710868a77b4645294cf32862f55e7c4 Mon Sep 17 00:00:00 2001 From: l3wdfut4pwr Date: Tue, 31 Mar 2026 13:52:16 +0300 Subject: add jwt --- src/components/header/authdialog/LoginForm.tsx | 117 ++++++++++++++++++++++--- 1 file changed, 103 insertions(+), 14 deletions(-) (limited to 'src/components/header/authdialog/LoginForm.tsx') diff --git a/src/components/header/authdialog/LoginForm.tsx b/src/components/header/authdialog/LoginForm.tsx index 0a72f67..ceadbcd 100644 --- a/src/components/header/authdialog/LoginForm.tsx +++ b/src/components/header/authdialog/LoginForm.tsx @@ -1,23 +1,112 @@ +'use client'; +import { useState } from 'react'; import { Button } from '@/components/ui/button'; import GoogleIcon from '../../../../public/icons/google.svg'; import { InputField } from '@/components/ui/inputfield'; -import { Input } from '@/components/ui/input'; +import { useAuthContext } from '@/lib/contexts/Auth.context'; + export default function LoginForm() { + const [errors, setErrors] = useState({}); + const [loading, setLoading] = useState(false); + const { setUser } = useAuthContext(); + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + setLoading(true); + setErrors({}); + + const formData = new FormData(e.currentTarget); + const emailOrUsername = + formData.get('emailOrUsername')?.toString() || ''; + const password = formData.get('password')?.toString() || ''; + + const newErrors: any = {}; + if (!emailOrUsername) + newErrors.emailOrUsername = 'Введите никнейм или email'; + if (!password) newErrors.password = 'Введите пароль'; + + if (Object.keys(newErrors).length > 0) { + setErrors(newErrors); + setLoading(false); + return; + } + + const body = new URLSearchParams(); + body.append('username', emailOrUsername); + body.append('password', password); + + try { + const res = await fetch('http://localhost:8000/api/auth/login', { + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + }, + body: body.toString(), + }); + + const data = await res.json(); + + if (!res.ok) { + setErrors({ general: 'Неверный логин или пароль' }); + } else if (data.access_token) { + localStorage.setItem('token', data.access_token); + + const meRes = await fetch('http://localhost:8000/api/me', { + headers: { Authorization: `Bearer ${data.access_token}` }, + }); + const meData = await meRes.json(); + setUser(meData); + } + } finally { + setLoading(false); + } + }; + return ( - <> -
- -
- - +
+ + +
+
+ + {errors.emailOrUsername && ( +

+ {errors.emailOrUsername} +

+ )} +
+ +
+ + {errors.password && ( +

+ {errors.password} +

+ )} + {!errors.password && errors.general && ( +

+ {errors.general} +

+ )}
- - + + +
); } -- cgit v1.3-3-g829e