aboutsummaryrefslogtreecommitdiffstats
path: root/frontend/src/app/(auth)/signup
diff options
context:
space:
mode:
Diffstat (limited to 'frontend/src/app/(auth)/signup')
-rw-r--r--frontend/src/app/(auth)/signup/page.tsx116
1 files changed, 116 insertions, 0 deletions
diff --git a/frontend/src/app/(auth)/signup/page.tsx b/frontend/src/app/(auth)/signup/page.tsx
new file mode 100644
index 0000000..af25031
--- /dev/null
+++ b/frontend/src/app/(auth)/signup/page.tsx
@@ -0,0 +1,116 @@
+'use client';
+
+import { useState } from 'react';
+import { useRouter } from 'next/navigation';
+import Link from 'next/link';
+import { Button } from '@/components/ui/button';
+import { Input } from '@/components/ui/input';
+import { Label } from '@/components/ui/label';
+import { authApi } from '@/lib/api';
+import { useNotification } from '@/components/shared/NotificationContext';
+
+export default function SignupPage() {
+ const router = useRouter();
+ const { showNotification } = useNotification();
+ const [name, setName] = useState('');
+ const [email, setEmail] = useState('');
+ const [password, setPassword] = useState('');
+ const [confirmPassword, setConfirmPassword] = useState('');
+ const [error, setError] = useState('');
+ const [isLoading, setIsLoading] = useState(false);
+
+ const handleSubmit = async (e: React.FormEvent) => {
+ e.preventDefault();
+ setError('');
+
+ // Validate passwords match
+ if (password !== confirmPassword) {
+ setError('Passwords do not match');
+ return;
+ }
+
+ setIsLoading(true);
+
+ try {
+ await authApi.signup(name, email, password);
+ // Show success notification
+ showNotification('success', `Your email ${email} has been successfully registered!`);
+ // Redirect to login after successful signup with a slight delay to see the notification
+ setTimeout(() => {
+ router.push('/login?signup=success');
+ }, 1500);
+ } catch (err: any) {
+ setError(err.message || 'Signup failed');
+ } finally {
+ setIsLoading(false);
+ }
+ };
+
+ return (
+ <div>
+ <form onSubmit={handleSubmit} className="space-y-4">
+ <div className="space-y-2">
+ <Label htmlFor="name">Name</Label>
+ <Input
+ id="name"
+ placeholder="Your Name"
+ value={name}
+ onChange={(e) => setName(e.target.value)}
+ required
+ />
+ </div>
+
+ <div className="space-y-2">
+ <Label htmlFor="email">Email</Label>
+ <Input
+ id="email"
+ type="email"
+ placeholder="your@email.com"
+ value={email}
+ onChange={(e) => setEmail(e.target.value)}
+ required
+ />
+ </div>
+
+ <div className="space-y-2">
+ <Label htmlFor="password">Password</Label>
+ <Input
+ id="password"
+ type="password"
+ value={password}
+ onChange={(e) => setPassword(e.target.value)}
+ required
+ />
+ </div>
+
+ <div className="space-y-2">
+ <Label htmlFor="confirmPassword">Confirm Password</Label>
+ <Input
+ id="confirmPassword"
+ type="password"
+ value={confirmPassword}
+ onChange={(e) => setConfirmPassword(e.target.value)}
+ required
+ />
+ </div>
+
+ {error && (
+ <div className="text-sm text-red-500">
+ {error}
+ </div>
+ )}
+
+ <Button type="submit" className="w-full" disabled={isLoading}>
+ {isLoading ? 'Creating Account...' : 'Create Account'}
+ </Button>
+ </form>
+
+ <div className="mt-4 text-center text-sm">
+ Already have an account?{' '}
+ <Link href="/login" className="text-primary underline underline-offset-2">
+ Login
+ </Link>
+ </div>
+ </div>
+ );
+} \ No newline at end of file