diff --git a/src/app/[locale]/register/page.tsx b/src/app/[locale]/register/page.tsx index cfe50a9..15389e5 100644 --- a/src/app/[locale]/register/page.tsx +++ b/src/app/[locale]/register/page.tsx @@ -1,3 +1,4 @@ + 'use client'; import { useState } from 'react'; @@ -10,6 +11,7 @@ import { Label } from '@/components/ui/label'; import { UserPlus } from 'lucide-react'; import { useToast } from "@/hooks/use-toast"; import { useI18n, useCurrentLocale } from '@/locales/client'; +import { registerUser } from '@/app/actions/user'; export default function RegisterPage() { const router = useRouter(); @@ -29,22 +31,33 @@ export default function RegisterPage() { if (password !== confirmPassword) { toast({ - title: "Registration Error", // Translate - description: "Passwords do not match.", // Translate + title: t('register.error_title'), + description: t('register.password_mismatch'), variant: "destructive", }); setIsLoading(false); return; } - await new Promise(resolve => setTimeout(resolve, 1000)); - - localStorage.setItem('isToyShareAuthenticated', 'true'); - toast({ - title: "Registration Successful", // Translate - description: "Your account has been created. Welcome!", // Translate + const result = await registerUser({ name, email }); + + if (result.success && result.user) { + // Mock login after successful registration + localStorage.setItem('isToyShareAuthenticated', 'true'); + localStorage.setItem('userEmail', result.user.email); + toast({ + title: t('register.success_title'), + description: t('register.success_description'), }); - router.push(`/${locale}/dashboard`); + router.push(`/${locale}/dashboard`); + } else { + toast({ + title: t('register.error_title'), + description: result.message, + variant: "destructive", + }); + } + setIsLoading(false); }; @@ -53,7 +66,7 @@ export default function RegisterPage() { return ( <> {parts[0]} - {parts[1]} + {parts[1]} {parts[2]} ); diff --git a/src/app/actions/user.ts b/src/app/actions/user.ts new file mode 100644 index 0000000..6e1ec67 --- /dev/null +++ b/src/app/actions/user.ts @@ -0,0 +1,49 @@ + +'use server'; + +import db from '@/lib/db'; +import type { User } from '@/types'; +import { randomUUID } from 'crypto'; + +interface RegisterUserResult { + success: boolean; + message: string; + user?: User; +} + +export async function registerUser(data: { name: string; email: string; password?: string }): Promise { + const { name, email } = data; + + // Basic validation + if (!name || !email) { + return { success: false, message: 'Name and email are required.' }; + } + + try { + // Check if user already exists + const existingUser = db.prepare('SELECT * FROM users WHERE email = ?').get(email); + if (existingUser) { + return { success: false, message: 'An account with this email already exists.' }; + } + + const newUser: User = { + id: `user-${randomUUID()}`, + name, + email, + role: 'User', + avatarUrl: '', + bio: '' + }; + + const stmt = db.prepare( + 'INSERT INTO users (id, name, email, role, avatarUrl, bio) VALUES (@id, @name, @email, @role, @avatarUrl, @bio)' + ); + + stmt.run(newUser); + + return { success: true, message: 'User registered successfully.', user: newUser }; + } catch (error) { + console.error('Registration error:', error); + return { success: false, message: 'An unexpected error occurred during registration.' }; + } +} diff --git a/src/locales/en.ts b/src/locales/en.ts index f20bcc6..b34d227 100644 --- a/src/locales/en.ts +++ b/src/locales/en.ts @@ -36,6 +36,10 @@ export default { 'register.submit_button': 'Create Account', 'register.loading_button': 'Registering...', 'register.has_account': 'Already have an account? Log in', + 'register.error_title': 'Registration Error', + 'register.password_mismatch': 'Passwords do not match.', + 'register.success_title': 'Registration Successful', + 'register.success_description': 'Your account has been created. Welcome!', 'toy_details.back_to_toys': 'Back to All Toys', 'toy_details.toy_not_found_title': 'Toy Not Found', 'toy_details.toy_not_found_description': 'Sorry, the toy you are looking for does not exist or has been removed.', @@ -272,5 +276,3 @@ export default { 'message_detail.message_from_you': 'You', 'message_detail.message_from_name': 'From {name}', } as const; - - \ No newline at end of file diff --git a/src/locales/zh-TW.ts b/src/locales/zh-TW.ts index e95784a..98e2103 100644 --- a/src/locales/zh-TW.ts +++ b/src/locales/zh-TW.ts @@ -36,6 +36,10 @@ export default { 'register.submit_button': '建立帳戶', 'register.loading_button': '註冊中...', 'register.has_account': '已經有帳戶了? 登入', + 'register.error_title': '註冊錯誤', + 'register.password_mismatch': '密碼不相符。', + 'register.success_title': '註冊成功', + 'register.success_description': '您的帳戶已成功建立,歡迎!', 'toy_details.back_to_toys': '返回所有玩具', 'toy_details.toy_not_found_title': '找不到玩具', 'toy_details.toy_not_found_description': '抱歉,您尋找的玩具不存在或已被移除。', @@ -272,5 +276,3 @@ export default { 'message_detail.message_from_you': '您', 'message_detail.message_from_name': '來自 {name}', } as const; - - \ No newline at end of file