'use client' import { useState } from 'react' import { useForm } from 'react-hook-form' import { zodResolver } from '@hookform/resolvers/zod' import { useRouter } from 'next/navigation' import { loginSchema, type LoginForm } from 'lib/validations/auth' import { emitAuthChanged } from 'hooks/useAuth' import { getSupabaseBrowserConfig, isSupabaseBrowserConfigured } from 'lib/supabase/publicEnv' export function LoginForm() { const [loading, setLoading] = useState(false) const [error, setError] = useState(null) const supabaseReady = isSupabaseBrowserConfigured() const supabaseEnv = getSupabaseBrowserConfig() const router = useRouter() const { register, handleSubmit, formState: { errors } } = useForm({ resolver: zodResolver(loginSchema) }) const onSubmit = async (data: LoginForm) => { console.info('[login] submit', { supabaseReady, email: data.email, supabaseUrl: supabaseEnv.url }) try { setLoading(true) setError(null) const res = await fetch('/api/auth/login', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data), credentials: 'include' }) const json = await res.json().catch(() => ({})) if (!res.ok) { setError(json?.error || 'Neplatné přihlašovací údaje') return } // store token from public cookie as fallback for environments where HttpOnly cookie isn't sent try { if (typeof window !== 'undefined') { const match = document.cookie.split(';').map(s => s.trim()).find(c => c.startsWith('letschat_session_pub=')) if (match) { const token = match.split('=')[1] window.localStorage.setItem('letschat_session', token) } } } catch (e) { // ignore } emitAuthChanged() router.push('/dashboard') } catch (e: any) { console.error('Login error:', e) setError(e?.message || 'Došlo k neočekávané chybě při přihlášení') } finally { setLoading(false) } } return (
E-mail
{errors.email?.message}
Heslo
{errors.password?.message}
{error ? (
{error}
) : null} console.info('[login] button click', { supabaseReady, supabaseUrl: supabaseEnv.url })} /> {!supabaseReady ? (
Přidejte Supabase klíče do prostředí Space (NEXT_PUBLIC_SUPABASE_URL a NEXT_PUBLIC_SUPABASE_ANON_KEY) a znovu spusťte build.
) : null}
) }