138 lines
3.9 KiB
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;
|
|
};
|
|
}
|
|
}
|