user management page could not list registered users

This commit is contained in:
Indigo Tang 2025-07-06 12:18:44 +00:00
parent a7f4242ecc
commit a5e472498e
4 changed files with 80 additions and 14 deletions

View File

@ -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));
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: "Registration Successful", // Translate
description: "Your account has been created. Welcome!", // Translate
title: t('register.success_title'),
description: t('register.success_description'),
});
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]}
<Link href="/login" className="text-primary font-semibold hover:underline">{parts[1]}</Link>
<Link href={`/${locale}/login`} className="text-primary font-semibold hover:underline">{parts[1]}</Link>
{parts[2]}
</>
);

49
src/app/actions/user.ts Normal file
View File

@ -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<RegisterUserResult> {
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.' };
}
}

View File

@ -36,6 +36,10 @@ export default {
'register.submit_button': 'Create Account',
'register.loading_button': 'Registering...',
'register.has_account': 'Already have an account? <link>Log in</link>',
'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;

View File

@ -36,6 +36,10 @@ export default {
'register.submit_button': '建立帳戶',
'register.loading_button': '註冊中...',
'register.has_account': '已經有帳戶了? <link>登入</link>',
'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;