'use client'; import { useState, useActionState } from 'react'; import { FoxHelperText } from '@fox/core/components/fox-helper-text'; import { FoxInput } from '@fox/core/components/fox-input'; import { FoxPageHeader } from '@fox/core/components/fox-page-header'; import { FoxRadio } from '@fox/core/components/fox-radio'; import { FoxRadioGroup } from '@fox/core/components/fox-radio-group'; import { FoxSelect } from '@fox/core/components/fox-select'; import { FoxTextArea } from '@fox/core/components/fox-text-area'; import { submitFormAction } from '@/app/_hooks/submit-form-action'; import { ANSWER_MESSAGE_ETC, ANSWER_MESSAGE_OPTIONS, QUIZ_ANSWER_OPTIONS, QUIZ_LEVEL_OPTIONS, type QuizItem, type GradesBySchool, } from '@/lib/domain/content'; import { ANSWER_MESSAGE_MAX_LENGTH, INITIAL_CONTENT_FORM_STATE, MESSAGE_MAX_LENGTH, QUESTION_MAX_LENGTH, } from '@/lib/domain/content-form'; import { contentBreadcrumb, contentListPath } from '@/lib/domain/content-query'; import type { CommonCode } from '@/lib/domain/common-code'; import { createQuizAction, updateQuizAction } from '../../_actions'; import { ContentFormActions } from '../../_components/content-form-actions'; import { ContentFormRow } from '../../_components/content-form-row'; import { ContentGradeField } from '../../_components/content-grade-field'; import { ContentKeywordField } from '../../_components/content-keyword-field'; import { ContentVisibilityField } from '../../_components/content-visibility-field'; import styles from '../../_components/content-form.module.scss'; interface QuizFormProps { schools: readonly CommonCode[]; gradesBySchool: GradesBySchool; item?: QuizItem; } /** * 콘텐츠 등록·수정 (금융OX퀴즈) — 시안 5402:12360. * * 정답여부는 O·X 두 줄이고, 고른 쪽에서만 「사용자에게 노출할 문구」를 정한다(기획 ③). * 「기타」를 고르면 문구를 직접 적는다. */ export function QuizForm({ schools, gradesBySchool, item }: QuizFormProps) { const isEdit = item !== undefined; const [state, formAction, isPending] = useActionState( isEdit ? updateQuizAction : createQuizAction, INITIAL_CONTENT_FORM_STATE ); const [answer, setAnswer] = useState(item?.answer || QUIZ_ANSWER_OPTIONS[0]); const [messageCode, setMessageCode] = useState(ANSWER_MESSAGE_OPTIONS[0].value); const [messageText, setMessageText] = useState(''); const errors = state.status === 'error' ? (state.errors ?? {}) : {}; return ( <>
submitFormAction(event, formAction)} className={styles.form} > {isEdit && } {/* 화면에 입력 칸이 없는 값이라 그대로 돌려보내 지워지지 않게 한다(도메인 주석 참조). */} {isEdit && ( )} {QUIZ_LEVEL_OPTIONS.map((option) => ( ))} {errors.level && }
{QUIZ_ANSWER_OPTIONS.map((option) => (
({ value: message.value, label: message.label, }))} value={messageCode} onValueChange={setMessageCode} disabled={answer !== option} />
{messageCode === ANSWER_MESSAGE_ETC && (
)}
))}
{(errors.answer || errors.answerMessageText) && ( )}
{state.status === 'error' && state.message && ( )} ); }