import { useState } from "react"; export interface ValidationState { enabled: boolean; value: string; } export interface ValidationStates { [fieldName: string]: ValidationState; } export interface UseFormValidationProps { fields: string[]; initialStates?: Partial; } export function useFormValidation({ fields, initialStates = {} }: UseFormValidationProps) { // 검증 상태 초기화 const initValidationStates = (): ValidationStates => { const states: ValidationStates = {}; fields.forEach((field) => { states[field] = initialStates[field] || { enabled: false, value: "" }; }); return states; }; const [validationStates, setValidationStates] = useState(initValidationStates); // 특정 필드의 검증 상태 업데이트 const updateFieldValidation = (fieldName: string, value: string) => { setValidationStates((prev) => ({ ...prev, [fieldName]: { enabled: true, value: value.trim() }, })); }; // onBlur 핸들러 생성 const createBlurHandler = (fieldName: string) => (event: React.FocusEvent) => { const value = event.target.value.trim(); if (value) { updateFieldValidation(fieldName, value); } }; // 모든 필수 필드가 검증되었는지 확인 const areAllFieldsValidated = (requiredFields?: string[]) => { const fieldsToCheck = requiredFields || fields; return fieldsToCheck.every((field) => validationStates[field]?.enabled); }; // 검증 상태 초기화 const resetValidation = (newStates?: Partial) => { if (newStates) { setValidationStates((prev) => { const updated = { ...prev }; Object.entries(newStates).forEach(([key, value]) => { if (value !== undefined) { updated[key] = value; } }); return updated; }); } else { setValidationStates(initValidationStates()); } }; // 특정 필드 검증 상태 확인 const isFieldValidated = (fieldName: string) => validationStates[fieldName]?.enabled || false; // 필드 값 가져오기 const getFieldValue = (fieldName: string) => validationStates[fieldName]?.value || ""; return { // 상태 validationStates, // 액션 updateFieldValidation, resetValidation, // 유틸리티 createBlurHandler, areAllFieldsValidated, isFieldValidated, getFieldValue, }; }