/** * SponsorSignupCommandModel * * UX-only model for managing sponsor signup state. */ export interface SponsorSignupFormData { companyName: string; contactEmail: string; websiteUrl?: string; industry?: string; } export interface SponsorSignupValidationErrors { companyName?: string; contactEmail?: string; websiteUrl?: string; } export class SponsorSignupCommandModel { private _companyName: string; private _contactEmail: string; private _websiteUrl: string; private _industry: string; constructor(initial: Partial = {}) { this._companyName = initial.companyName || ''; this._contactEmail = initial.contactEmail || ''; this._websiteUrl = initial.websiteUrl || ''; this._industry = initial.industry || ''; } get companyName(): string { return this._companyName; } set companyName(value: string) { this._companyName = value; } get contactEmail(): string { return this._contactEmail; } set contactEmail(value: string) { this._contactEmail = value; } get websiteUrl(): string { return this._websiteUrl; } set websiteUrl(value: string) { this._websiteUrl = value; } get industry(): string { return this._industry; } set industry(value: string) { this._industry = value; } validate(): SponsorSignupValidationErrors { const errors: SponsorSignupValidationErrors = {}; if (!this._companyName.trim()) errors.companyName = 'Company name is required'; if (!this._contactEmail.trim()) { errors.contactEmail = 'Contact email is required'; } else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(this._contactEmail)) { errors.contactEmail = 'Invalid email format'; } if (this._websiteUrl && !this._websiteUrl.startsWith('http')) { errors.websiteUrl = 'Website URL must start with http:// or https://'; } return errors; } toCommand(): SponsorSignupFormData { return { companyName: this._companyName, contactEmail: this._contactEmail, websiteUrl: this._websiteUrl, industry: this._industry, }; } }