Some checks failed
Build & Deploy KLZ Cables / build-and-deploy (push) Failing after 1m32s
131 lines
4.9 KiB
TypeScript
131 lines
4.9 KiB
TypeScript
'use client';
|
|
|
|
import React, { useState } from 'react';
|
|
import { useTranslations } from 'next-intl';
|
|
import { Button, Heading, Card, Input, Textarea, Label } from '@/components/ui';
|
|
import { sendContactFormAction } from '@/app/actions/contact';
|
|
import { useAnalytics } from '@/components/analytics/useAnalytics';
|
|
|
|
export default function ContactForm() {
|
|
const t = useTranslations('Contact');
|
|
const { trackEvent } = useAnalytics();
|
|
const [status, setStatus] = useState<'idle' | 'submitting' | 'success' | 'error'>('idle');
|
|
|
|
async function handleSubmit(e: React.FormEvent<HTMLFormElement>) {
|
|
e.preventDefault();
|
|
setStatus('submitting');
|
|
|
|
const formData = new FormData(e.currentTarget);
|
|
const email = formData.get('email') as string;
|
|
|
|
try {
|
|
const result = await sendContactFormAction(formData);
|
|
if (result.success) {
|
|
trackEvent('contact_form_submission', {
|
|
form_type: 'general',
|
|
email,
|
|
});
|
|
setStatus('success');
|
|
(e.target as HTMLFormElement).reset();
|
|
} else {
|
|
console.error('Contact form submission failed:', { email, error: result.error });
|
|
setStatus('error');
|
|
}
|
|
} catch (error) {
|
|
console.error('Contact form submission error:', { email, error });
|
|
setStatus('error');
|
|
}
|
|
}
|
|
|
|
if (status === 'success') {
|
|
return (
|
|
<Card className="p-6 md:p-12 rounded-2xl md:rounded-[40px] border-none shadow-2xl text-center">
|
|
<div className="w-20 h-20 bg-accent rounded-full flex items-center justify-center mx-auto mb-6 shadow-lg shadow-accent/20">
|
|
<svg className="w-10 h-10 text-primary-dark" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={3} d="M5 13l4 4L19 7" />
|
|
</svg>
|
|
</div>
|
|
<Heading level={3} className="mb-4">
|
|
{t('form.successTitle') || 'Message Sent!'}
|
|
</Heading>
|
|
<p className="text-text-secondary text-lg mb-8">
|
|
{t('form.successDesc') || 'Thank you for your message. We will get back to you as soon as possible.'}
|
|
</p>
|
|
<Button onClick={() => setStatus('idle')} variant="saturated">
|
|
{t('form.sendAnother') || 'Send another message'}
|
|
</Button>
|
|
</Card>
|
|
);
|
|
}
|
|
|
|
return (
|
|
<Card className="p-6 md:p-12 rounded-2xl md:rounded-[40px] border-none shadow-2xl animate-slide-up">
|
|
<Heading level={3} subtitle={t('form.subtitle')} className="mb-6 md:mb-10">
|
|
{t('form.title')}
|
|
</Heading>
|
|
<form onSubmit={handleSubmit} className="grid grid-cols-1 md:grid-cols-2 gap-4 md:gap-8">
|
|
<div className="space-y-1 md:space-y-2">
|
|
<Label htmlFor="name">{t('form.name')}</Label>
|
|
<Input
|
|
type="text"
|
|
id="name"
|
|
name="name"
|
|
autoComplete="name"
|
|
enterKeyHint="next"
|
|
placeholder={t('form.namePlaceholder')}
|
|
required
|
|
/>
|
|
</div>
|
|
<div className="space-y-1 md:space-y-2">
|
|
<Label htmlFor="email">{t('form.email')}</Label>
|
|
<Input
|
|
type="email"
|
|
id="email"
|
|
name="email"
|
|
autoComplete="email"
|
|
inputMode="email"
|
|
enterKeyHint="next"
|
|
placeholder={t('form.emailPlaceholder')}
|
|
required
|
|
/>
|
|
</div>
|
|
<div className="md:col-span-2 space-y-1 md:space-y-2">
|
|
<Label htmlFor="message">{t('form.message')}</Label>
|
|
<Textarea
|
|
id="message"
|
|
name="message"
|
|
rows={4}
|
|
enterKeyHint="send"
|
|
placeholder={t('form.messagePlaceholder')}
|
|
required
|
|
/>
|
|
</div>
|
|
{status === 'error' && (
|
|
<div className="md:col-span-2 text-red-500 text-sm font-bold">
|
|
{t('form.error') || 'An error occurred. Please try again later.'}
|
|
</div>
|
|
)}
|
|
<div className="md:col-span-2 pt-2 md:pt-4">
|
|
<Button
|
|
type="submit"
|
|
variant="saturated"
|
|
size="lg"
|
|
disabled={status === 'submitting'}
|
|
className="w-full shadow-xl shadow-saturated/20 md:h-16 md:px-10 md:text-xl active:scale-[0.98] transition-transform"
|
|
>
|
|
{status === 'submitting' ? (
|
|
<span className="flex items-center gap-2">
|
|
<svg className="animate-spin h-5 w-5 text-white" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
|
|
<circle className="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" strokeWidth="4"></circle>
|
|
<path className="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>
|
|
</svg>
|
|
{t('form.submitting') || 'Sending...'}
|
|
</span>
|
|
) : t('form.submit')}
|
|
</Button>
|
|
</div>
|
|
</form>
|
|
</Card>
|
|
);
|
|
}
|