website cleanup

This commit is contained in:
2025-12-25 00:19:36 +01:00
parent d78854a4c6
commit 9486455b9e
82 changed files with 1223 additions and 363 deletions

View File

@@ -2,6 +2,7 @@
import { useState, FormEvent } from 'react';
import { motion, AnimatePresence } from 'framer-motion';
import { useServices } from '@/lib/services/ServiceProvider';
type FeedbackState =
| { type: 'idle' }
@@ -13,6 +14,7 @@ type FeedbackState =
export default function EmailCapture() {
const [email, setEmail] = useState('');
const [feedback, setFeedback] = useState<FeedbackState>({ type: 'idle' });
const { landingService } = useServices();
const handleSubmit = async (e: FormEvent<HTMLFormElement>) => {
e.preventDefault();
@@ -25,39 +27,22 @@ export default function EmailCapture() {
setFeedback({ type: 'loading' });
try {
const response = await fetch('/api/signup', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ email }),
});
const result = await landingService.signup(email);
const data = await response.json();
if (!response.ok) {
if (response.status === 429) {
setFeedback({
type: 'error',
message: data.error,
retryAfter: data.retryAfter
});
} else if (response.status === 409) {
setFeedback({ type: 'info', message: data.error });
setTimeout(() => setFeedback({ type: 'idle' }), 4000);
} else {
setFeedback({
type: 'error',
message: data.error || 'Something broke. Try again?',
canRetry: true
});
}
return;
if (result.status === 'success') {
setFeedback({ type: 'success', message: result.message });
setEmail('');
setTimeout(() => setFeedback({ type: 'idle' }), 5000);
} else if (result.status === 'info') {
setFeedback({ type: 'info', message: result.message });
setTimeout(() => setFeedback({ type: 'idle' }), 4000);
} else {
setFeedback({
type: 'error',
message: result.message,
canRetry: true
});
}
setFeedback({ type: 'success', message: data.message });
setEmail('');
setTimeout(() => setFeedback({ type: 'idle' }), 5000);
} catch (error) {
setFeedback({
type: 'error',