feat: Sprint 1 slice 1 — API signup + web signup/chat shell
Mirror to GitHub / mirror (push) Canceled after 0s

- api: Fastify POST /auth/signup (validation, scrypt hash, in-memory store)
- web: React+Vite SignUp form and chat shell with dev proxy
- 35 tests green (api 5, web 2, e2e 28)
This commit is contained in:
SinachPat
2026-08-15 19:53:13 +01:00
parent 2f53b1901b
commit 9733ba6e3c
21 changed files with 1706 additions and 14 deletions
+42
View File
@@ -0,0 +1,42 @@
import { useState, type FormEvent } from 'react';
type SignUpProps = {
onSignUp: (email: string, password: string) => Promise<void>;
};
export function SignUp({ onSignUp }: SignUpProps) {
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
const [error, setError] = useState<string | null>(null);
const [submitting, setSubmitting] = useState(false);
async function submit(event: FormEvent) {
event.preventDefault();
setError(null);
setSubmitting(true);
try {
await onSignUp(email, password);
} catch (err) {
setError(err instanceof Error ? err.message : 'Something went wrong');
} finally {
setSubmitting(false);
}
}
return (
<form className="wursor-signup" onSubmit={submit}>
<input name="email" type="email" aria-label="Email" value={email} onChange={(e) => setEmail(e.target.value)} />
<input
name="password"
type="password"
aria-label="Password"
value={password}
onChange={(e) => setPassword(e.target.value)}
/>
{error ? <p role="alert">{error}</p> : null}
<button type="submit" disabled={submitting}>
Sign up
</button>
</form>
);
}