e9840105a3
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
32 lines
1.2 KiB
TypeScript
32 lines
1.2 KiB
TypeScript
export interface ContactData {
|
|
firstName: string; lastName: string; phone: string;
|
|
email: string; message: string; website: string;
|
|
}
|
|
|
|
const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
|
|
function str(v: unknown, max: number): string {
|
|
return typeof v === 'string' ? v.trim().slice(0, max + 1) : '';
|
|
}
|
|
|
|
export function validateContact(data: unknown):
|
|
| { ok: true; value: ContactData }
|
|
| { ok: false; error: string } {
|
|
if (typeof data !== 'object' || data === null) return { ok: false, error: 'Dati non validi.' };
|
|
const d = data as Record<string, unknown>;
|
|
const value: ContactData = {
|
|
firstName: str(d.firstName, 100),
|
|
lastName: str(d.lastName, 100),
|
|
phone: str(d.phone, 40),
|
|
email: str(d.email, 200),
|
|
message: str(d.message, 5000),
|
|
website: str(d.website, 200),
|
|
};
|
|
if (value.website) return { ok: false, error: 'Richiesta non valida.' };
|
|
if (!value.firstName) return { ok: false, error: 'Il nome è obbligatorio.' };
|
|
if (!EMAIL_RE.test(value.email)) return { ok: false, error: 'Inserisci una e-mail valida.' };
|
|
if (!value.message) return { ok: false, error: 'Il messaggio è obbligatorio.' };
|
|
if (value.message.length > 5000) return { ok: false, error: 'Messaggio troppo lungo.' };
|
|
return { ok: true, value };
|
|
}
|