Files
superport/lib/utils/validators.dart

138 lines
3.9 KiB
Dart

/// 폼 필드 검증 함수 및 유틸리티 (SRP, 재사용성, 테스트 용이성 중심)
library;
/// 필수 입력값 검증
String? validateRequired(String? value, String fieldName) {
if (value == null || value.isEmpty) {
return '$fieldName을(를) 입력해주세요';
}
return null;
}
/// 이메일 형식 검증
String? validateEmail(String? value) {
if (value == null || value.isEmpty) {
return '이메일을 입력해주세요';
}
final emailRegex = RegExp(
r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$',
);
if (!emailRegex.hasMatch(value)) {
return '유효한 이메일 주소를 입력해주세요';
}
return null;
}
/// 전화번호 형식 검증 (숫자, 하이픈만 허용)
String? validatePhoneNumber(String? value) {
if (value == null || value.isEmpty) {
return null; // 필수 입력 아님
}
final phoneRegex = RegExp(r'^[0-9\-]+$');
if (!phoneRegex.hasMatch(value)) {
return '전화번호는 숫자와 하이픈(-)만 입력 가능합니다';
}
return null;
}
/// 숫자 검증
String? validateNumber(String? value, String fieldName) {
if (value == null || value.isEmpty) {
return '$fieldName을(를) 입력해주세요';
}
final numberRegex = RegExp(r'^[0-9]+$');
if (!numberRegex.hasMatch(value)) {
return '$fieldName은(는) 숫자만 입력 가능합니다';
}
return null;
}
/// 최소 길이 검증
String? validateMinLength(String? value, String fieldName, int minLength) {
if (value == null || value.isEmpty) {
return '$fieldName을(를) 입력해주세요';
}
if (value.length < minLength) {
return '$fieldName은(는) 최소 $minLength자 이상이어야 합니다';
}
return null;
}
/// 최대 길이 검증
String? validateMaxLength(String? value, String fieldName, int maxLength) {
if (value == null || value.isEmpty) {
return null; // 필수 입력 아님
}
if (value.length > maxLength) {
return '$fieldName은(는) 최대 $maxLength자 이하여야 합니다';
}
return null;
}
/// 시리얼 넘버 검증 (알파벳, 숫자, 하이픈만 허용)
String? validateSerialNumber(String? value) {
if (value == null || value.isEmpty) {
return null; // 필수 입력 아님
}
final serialRegex = RegExp(r'^[a-zA-Z0-9\-]+$');
if (!serialRegex.hasMatch(value)) {
return '시리얼 번호는 알파벳, 숫자, 하이픈(-)만 입력 가능합니다';
}
return null;
}
/// 바코드 검증 (숫자만 허용)
String? validateBarcode(String? value) {
if (value == null || value.isEmpty) {
return null; // 필수 입력 아님
}
final barcodeRegex = RegExp(r'^[0-9]+$');
if (!barcodeRegex.hasMatch(value)) {
return '바코드는 숫자만 입력 가능합니다';
}
return null;
}
/// FormValidator: 폼 필드 검증 유틸리티 클래스
class FormValidator {
/// 필수 입력 검증
static String? Function(String?) required(String errorMessage) {
return (String? value) {
if (value == null || value.trim().isEmpty) {
return errorMessage;
}
return null;
};
}
/// 이메일 형식 검증
static String? Function(String?) email([String? errorMessage]) {
return (String? value) {
if (value == null || value.isEmpty) {
return null; // 빈 값은 허용
}
final bool emailValid = RegExp(
r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$',
).hasMatch(value);
if (!emailValid) {
return errorMessage ?? '유효한 이메일 주소를 입력하세요';
}
return null;
};
}
/// 전화번호 형식 검증
static String? Function(String?) phone([String? errorMessage]) {
return (String? value) {
if (value == null || value.isEmpty) {
return null; // 빈 값은 허용
}
final bool phoneValid = RegExp(r'^[0-9\-\s]+$').hasMatch(value);
if (!phoneValid) {
return errorMessage ?? '유효한 전화번호를 입력하세요';
}
return null;
};
}
}