export const WORD_MAX_LENGTH = 100; export type BannedWordFormErrors = Partial>; export type BannedWordFormState = | { status: 'idle' } | { status: 'error'; message?: string; errors?: BannedWordFormErrors } | { status: 'success' }; export const INITIAL_BANNED_WORD_FORM_STATE: BannedWordFormState = { status: 'idle', }; /** 기획 SYS_WRD_002 ② — 중복은 백엔드가 판정하고 이 문구로 알린다. */ export const DUPLICATE_WORD_MESSAGE = '중복된 키워드입니다.'; export const REQUIRED_MESSAGE = '필수입력사항을 입력하세요.'; type ValidationResult = | { ok: true; value: string } | { ok: false; errors: BannedWordFormErrors }; export function validateBannedWord(raw: string): ValidationResult { const value = raw.trim(); if (!value) { return { ok: false, errors: { word: REQUIRED_MESSAGE } }; } if (value.length > WORD_MAX_LENGTH) { return { ok: false, errors: { word: `키워드는 ${WORD_MAX_LENGTH}자 이내로 입력해 주세요.` }, }; } return { ok: true, value }; } export type ExcelUploadResult = { successCount: number; errors: string[]; };