/** * Signup ViewModel * * Client-side state management for signup flow. * Immutable, class-based, contains only UI state. */ export interface SignupFormField { value: string; error?: string; touched: boolean; validating: boolean; } export interface SignupFormState { fields: { firstName: SignupFormField; lastName: SignupFormField; email: SignupFormField; password: SignupFormField; confirmPassword: SignupFormField; }; isValid: boolean; isSubmitting: boolean; submitError?: string; submitCount: number; } export interface SignupUIState { showPassword: boolean; showConfirmPassword: boolean; } export class SignupViewModel { constructor( public readonly returnTo: string, public readonly formState: SignupFormState, public readonly uiState: SignupUIState, public readonly mutationPending: boolean = false, public readonly mutationError: string | null = null ) {} withFormState(formState: SignupFormState): SignupViewModel { return new SignupViewModel( this.returnTo, formState, this.uiState, this.mutationPending, this.mutationError ); } withUIState(uiState: SignupUIState): SignupViewModel { return new SignupViewModel( this.returnTo, this.formState, uiState, this.mutationPending, this.mutationError ); } withMutationState(pending: boolean, error: string | null): SignupViewModel { return new SignupViewModel( this.returnTo, this.formState, this.uiState, pending, error ); } get isSubmitting(): boolean { return this.formState.isSubmitting || this.mutationPending; } get submitError(): string | undefined { return this.formState.submitError || this.mutationError || undefined; } }