| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- /**
- * 认证页面 - 登录/注册
- */
- 'use client';
- import { useState } from 'react';
- import { useAuth } from '@/lib/hooks';
- import { useRouter } from 'next/navigation';
- export default function AuthPage() {
- const [isLogin, setIsLogin] = useState(true);
- const [email, setEmail] = useState('');
- const [username, setUsername] = useState('');
- const [password, setPassword] = useState('');
- const [error, setError] = useState('');
- const { login, register, isLoading } = useAuth();
- const router = useRouter();
- const handleSubmit = async (e: React.FormEvent) => {
- e.preventDefault();
- setError('');
- try {
- console.log('[Auth] Submitting:', { isLogin, email });
- if (isLogin) {
- const response = await login(email, password);
- console.log('[Auth] Login response:', response);
- } else {
- const response = await register(email, username, password);
- console.log('[Auth] Register response:', response);
- }
- console.log('[Auth] Redirecting to home...');
- router.push('/');
- } catch (err) {
- console.error('[Auth] Error:', err);
- setError(err instanceof Error ? err.message : '操作失败');
- }
- };
- return (
- <div className="min-h-screen flex items-center justify-center bg-gray-50 dark:bg-gray-900 px-4">
- <div className="max-w-md w-full bg-white dark:bg-gray-800 rounded-lg shadow-md p-8">
- <h1 className="text-2xl font-bold text-center mb-6 text-gray-800 dark:text-white">
- {isLogin ? '登录' : '注册'} Novel Platform
- </h1>
- {error && (
- <div className="bg-red-100 border border-red-400 text-red-700 px-4 py-3 rounded mb-4">
- {error}
- </div>
- )}
- <form onSubmit={handleSubmit} className="space-y-4">
- <div>
- <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">
- 邮箱
- </label>
- <input
- type="email"
- value={email}
- onChange={(e) => setEmail(e.target.value)}
- required
- className="w-full px-3 py-2 border dark:border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-gray-700 dark:text-white"
- />
- </div>
- {!isLogin && (
- <div>
- <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">
- 用户名
- </label>
- <input
- type="text"
- value={username}
- onChange={(e) => setUsername(e.target.value)}
- required
- className="w-full px-3 py-2 border dark:border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-gray-700 dark:text-white"
- />
- </div>
- )}
- <div>
- <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">
- 密码
- </label>
- <input
- type="password"
- value={password}
- onChange={(e) => setPassword(e.target.value)}
- required
- className="w-full px-3 py-2 border dark:border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-gray-700 dark:text-white"
- />
- </div>
- <button
- type="submit"
- disabled={isLoading}
- className="w-full py-2 px-4 bg-blue-500 text-white rounded-lg hover:bg-blue-600 disabled:bg-gray-300 disabled:cursor-not-allowed transition-colors"
- >
- {isLoading ? '处理中...' : isLogin ? '登录' : '注册'}
- </button>
- </form>
- <div className="mt-4 text-center">
- <button
- type="button"
- onClick={() => setIsLogin(!isLogin)}
- className="text-blue-500 hover:text-blue-600 text-sm"
- >
- {isLogin ? '没有账号?去注册' : '已有账号?去登录'}
- </button>
- </div>
- </div>
- </div>
- );
- }
|