POSTERAPP_V1/app/auth/login/LoginForm.tsx

142 lines
4.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

'use client'
import React, { useState } from 'react'
import { signIn } from 'next-auth/react'
import { useRouter } from 'next/navigation'
interface LoginFormProps {
messages: {
common: {
email: string
password: string
}
login: {
emailPlaceholder: string
passwordPlaceholder: string
button: string
loading: string
error: string
invalidCredentials: string
}
}
}
export default function LoginForm({ messages }: LoginFormProps) {
const router = useRouter()
const [error, setError] = useState<string | null>(null)
const [loading, setLoading] = useState(false)
const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault()
setLoading(true)
setError(null)
try {
const formData = new FormData(e.currentTarget)
const email = formData.get('email') as string
const password = formData.get('password') as string
console.log('Giriş denemesi:', email)
const result = await signIn('credentials', {
email,
password,
redirect: false
})
console.log('Giriş sonucu:', result)
if (result?.error) {
console.error('Giriş hatası:', result.error)
setError(messages.login.invalidCredentials)
return
}
if (!result?.ok) {
console.error('Giriş başarısız:', result)
setError(messages.login.error)
return
}
console.log('Giriş başarılı, yönlendiriliyor...')
router.push('/dashboard')
} catch (error) {
console.error('Beklenmeyen giriş hatası:', error)
setError(messages.login.error)
} finally {
setLoading(false)
}
}
return (
<form className="mt-8 space-y-6" onSubmit={handleSubmit}>
<div className="rounded-md shadow-sm -space-y-px">
<div>
<label htmlFor="email" className="sr-only">
{messages.common.email}
</label>
<input
id="email"
name="email"
type="email"
autoComplete="email"
required
className="appearance-none rounded-none relative block w-full px-3 py-2 border border-gray-300 placeholder-gray-500 text-gray-900 rounded-t-md focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 focus:z-10 sm:text-sm"
placeholder={messages.login.emailPlaceholder}
/>
</div>
<div>
<label htmlFor="password" className="sr-only">
{messages.common.password}
</label>
<input
id="password"
name="password"
type="password"
autoComplete="current-password"
required
className="appearance-none rounded-none relative block w-full px-3 py-2 border border-gray-300 placeholder-gray-500 text-gray-900 rounded-b-md focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 focus:z-10 sm:text-sm"
placeholder={messages.login.passwordPlaceholder}
/>
</div>
</div>
{error && (
<div className="rounded-md bg-red-50 p-4">
<div className="flex">
<div className="flex-shrink-0">
<svg className="h-5 w-5 text-red-400" viewBox="0 0 20 20" fill="currentColor">
<path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z" clipRule="evenodd" />
</svg>
</div>
<div className="ml-3">
<p className="text-sm text-red-700">{error}</p>
</div>
</div>
</div>
)}
<div>
<button
type="submit"
disabled={loading}
className={`group relative w-full flex justify-center py-2 px-4 border border-transparent text-sm font-medium rounded-md text-white ${
loading ? 'bg-indigo-400' : 'bg-indigo-600 hover:bg-indigo-700'
} focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500`}
>
{loading ? (
<div className="flex items-center">
<svg className="animate-spin -ml-1 mr-3 h-5 w-5 text-white" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
<circle className="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" strokeWidth="4"></circle>
<path className="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>
</svg>
{messages.login.loading}
</div>
) : (
messages.login.button
)}
</button>
</div>
</form>
)
}