File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
export const POINT_MAX = 1_000_000;
export const DESCRIPTION_MAX_LENGTH = 200;
export interface PointStandardValues {
id: string;
point: number;
limitPoint: number;
isDuplicable: boolean;
description: string;
isActive: boolean;
}
export type PointStandardFormErrors = Partial<
Record<'id' | 'point' | 'limitPoint' | 'description', string>
>;
export type PointStandardFormState =
| { status: 'idle' }
| { status: 'error'; message?: string; errors?: PointStandardFormErrors }
| { status: 'success' };
export const INITIAL_POINT_STANDARD_FORM_STATE: PointStandardFormState = {
status: 'idle',
};
type ValidationResult =
| { ok: true; values: PointStandardValues }
| { ok: false; errors: PointStandardFormErrors };
function validatePointNumber(
value: number,
label: string
): { error?: string } {
if (!Number.isInteger(value)) {
return { error: `${label}는 숫자만 입력할 수 있습니다.` };
}
if (value < 0) {
return { error: `${label}는 0 이상으로 입력해 주세요.` };
}
if (value > POINT_MAX) {
return {
error: `${label}는 ${POINT_MAX.toLocaleString('ko-KR')} 이하로 입력해 주세요.`,
};
}
return {};
}
export function validatePointStandard(
values: PointStandardValues
): ValidationResult {
const errors: PointStandardFormErrors = {};
if (!values.id.trim()) {
errors.id = '수정할 대상을 찾을 수 없습니다.';
}
const point = validatePointNumber(values.point, '포인트');
if (point.error) {
errors.point = point.error;
}
const limitPoint = validatePointNumber(values.limitPoint, '제한포인트');
if (limitPoint.error) {
errors.limitPoint = limitPoint.error;
}
const description = values.description.trim();
if (!description) {
errors.description = '이벤트 설명을 입력해 주세요.';
} else if (description.length > DESCRIPTION_MAX_LENGTH) {
errors.description = `이벤트 설명은 ${DESCRIPTION_MAX_LENGTH}자 이내로 입력해 주세요.`;
}
if (Object.keys(errors).length > 0) {
return { ok: false, errors };
}
return {
ok: true,
values: {
id: values.id.trim(),
point: values.point,
limitPoint: values.limitPoint,
isDuplicable: values.isDuplicable,
description,
isActive: values.isActive,
},
};
}