--- lib/domain/content-form.ts
+++ lib/domain/content-form.ts
... | ... | @@ -11,6 +11,7 @@ |
| 11 | 11 |
QUIZ_LEVEL_OPTIONS, |
| 12 | 12 |
gradesOf, |
| 13 | 13 |
type ContentKeyword, |
| 14 |
+ type QuizAnswerMessage, |
|
| 14 | 15 |
type GradesBySchool, |
| 15 | 16 |
} from '@/lib/domain/content'; |
| 16 | 17 |
import type { CommonCode } from '@/lib/domain/common-code';
|
... | ... | @@ -81,8 +82,8 @@ |
| 81 | 82 |
keywords: ContentKeyword[]; |
| 82 | 83 |
question: string; |
| 83 | 84 |
answer: string; |
| 84 |
- answerMessageCode: string; |
|
| 85 |
- answerMessageText: string; |
|
| 85 |
+ /** O·X 두 줄의 노출 문구. 정답이 아닌 쪽도 함께 보낸다(사용자 확정). */ |
|
| 86 |
+ answerMessages: QuizAnswerMessage[]; |
|
| 86 | 87 |
explanation: string; |
| 87 | 88 |
isVisible: boolean; |
| 88 | 89 |
}; |
... | ... | @@ -245,14 +246,6 @@ |
| 245 | 246 |
if (!(QUIZ_ANSWER_OPTIONS as readonly string[]).includes(values.answer)) {
|
| 246 | 247 |
errors.answer = '정답을 선택해 주세요.'; |
| 247 | 248 |
} |
| 248 |
- if ( |
|
| 249 |
- values.answerMessageCode !== '' && |
|
| 250 |
- !ANSWER_MESSAGE_OPTIONS.some( |
|
| 251 |
- (option) => option.value === values.answerMessageCode |
|
| 252 |
- ) |
|
| 253 |
- ) {
|
|
| 254 |
- errors.answerMessageCode = '노출 문구를 다시 선택해 주세요.'; |
|
| 255 |
- } |
|
| 256 | 249 |
|
| 257 | 250 |
const question = requireText( |
| 258 | 251 |
values.question, |
... | ... | @@ -269,16 +262,27 @@ |
| 269 | 262 |
errors |
| 270 | 263 |
); |
| 271 | 264 |
|
| 272 |
- let answerMessageText = values.answerMessageText |
|
| 273 |
- .trim() |
|
| 274 |
- .slice(0, ANSWER_MESSAGE_MAX_LENGTH); |
|
| 275 |
- if (values.answerMessageCode === ANSWER_MESSAGE_ETC) {
|
|
| 276 |
- if (answerMessageText === '') {
|
|
| 277 |
- errors.answerMessageText = '노출할 문구를 입력해 주세요.'; |
|
| 265 |
+ // O·X 두 줄을 각각 검사한다 — 정답이 아닌 쪽도 보내므로 둘 다 유효해야 한다. |
|
| 266 |
+ const answerMessages = values.answerMessages.map((message) => {
|
|
| 267 |
+ if ( |
|
| 268 |
+ message.code !== '' && |
|
| 269 |
+ !ANSWER_MESSAGE_OPTIONS.some((option) => option.value === message.code) |
|
| 270 |
+ ) {
|
|
| 271 |
+ errors[`answerMessage${message.answer}Code`] =
|
|
| 272 |
+ '노출 문구를 다시 선택해 주세요.'; |
|
| 278 | 273 |
} |
| 279 |
- } else {
|
|
| 280 |
- answerMessageText = ''; |
|
| 281 |
- } |
|
| 274 |
+ |
|
| 275 |
+ let text = message.text.trim().slice(0, ANSWER_MESSAGE_MAX_LENGTH); |
|
| 276 |
+ if (message.code === ANSWER_MESSAGE_ETC) {
|
|
| 277 |
+ if (text === '') {
|
|
| 278 |
+ errors[`answerMessage${message.answer}Text`] =
|
|
| 279 |
+ `${message.answer}에 노출할 문구를 입력해 주세요.`;
|
|
| 280 |
+ } |
|
| 281 |
+ } else {
|
|
| 282 |
+ text = ''; |
|
| 283 |
+ } |
|
| 284 |
+ return { ...message, text };
|
|
| 285 |
+ }); |
|
| 282 | 286 |
|
| 283 | 287 |
const keywords = normalizeKeywords(values.keywords); |
| 284 | 288 |
validateKeywords(keywords, errors); |
... | ... | @@ -288,6 +292,6 @@ |
| 288 | 292 |
} |
| 289 | 293 |
return {
|
| 290 | 294 |
ok: true, |
| 291 |
- values: { ...values, question, explanation, answerMessageText, keywords },
|
|
| 295 |
+ values: { ...values, question, explanation, answerMessages, keywords },
|
|
| 292 | 296 |
}; |
| 293 | 297 |
} |
Delete comment
Once you delete this comment, you won't be able to recover it. Are you sure you want to delete this comment?