import { InjectionToken } from '@angular/core'; import { AbstractControl, FormControl, FormGroup, ValidationErrors, ValidatorFn, } from '@angular/forms'; export type ControlsOf> = { [K in keyof T]: T[K] extends Record ? FormGroup> : FormControl; }; export const signalFormErrors = { required: 'Este campo es requerido', email: 'El valor ingresado no es un email', acceptTerms: 'Debe aceptar los términos y condiciones', maxLength: (requiredLength: number) => `El campo debe tener una longitud máxima de ${requiredLength}`, }; export class CustomValidators { static matchConfirmation(originalKey: string, confirmKey: string): ValidatorFn { return (control: AbstractControl): ValidationErrors | null => { const original = control.get(originalKey); const confirm = control.get(confirmKey); return original?.value !== confirm?.value ? { notMatchingConfirmation: { original: originalKey } } : null; }; } } const defaultErrors = { invalid: () => `El valor ingresado es inválido`, required: () => `Este campo es requerido`, email: () => `El valor ingresado no es un email`, minlength: ({ requiredLength }: any) => `El campo debe tener una longitud mínima de ${requiredLength}`, maxlength: ({ requiredLength }: any) => `El campo debe tener una longitud máxima de ${requiredLength}`, min: ({ min }: any) => `Este valor no puede ser menor a ${min}`, max: ({ max }: any) => `Este valor no puede ser mayor a ${max}`, pattern: () => 'El valor ingresado es inválido', notMatchingConfirmation: ({ original }: any) => `La confirmación de ${original} no coincide`, }; export const FORM_ERRORS = new InjectionToken('FORM_ERRORS', { providedIn: 'root', factory: () => defaultErrors, });