'use client'; import { useActionState, useEffect, useRef, useState } from 'react'; import { FoxButton } from '@fox/core/components/fox-button'; import { FoxHelperText } from '@fox/core/components/fox-helper-text'; import { FoxInput } from '@fox/core/components/fox-input'; import { FoxModal } from '@fox/core/components/fox-modal'; 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 { useFeedback } from '@/app/_hooks/use-feedback'; import { ANSWER_STATUS_OPTIONS, formatInquiryTypeLabel, formatOptionalValue, type BoardPost, } from '@/lib/domain/board-post'; import { ANSWER_MAX_LENGTH, INITIAL_INQUIRY_ANSWER_FORM_STATE, } from '@/lib/domain/board-post-form'; import { saveInquiryAnswerAction } from '../../_actions'; import { BoardAttachmentField } from '../../_components/board-attachment-field'; import styles from './inquiry-answer-modal.module.scss'; interface InquiryAnswerModalProps { post: BoardPost; onClose: () => void; } const STATUS_HELP_TEXT = '답변완료 선택 시에만 FO(사용자 화면)에 답변 내용 노출, 목록에 답변일도 표시.'; /** * 이슈: 기획의 "답변완료 시 앱푸쉬 전송"은 백엔드 푸시 분기가 빈 블록이라 동작하지 않는다. * 이슈: 백엔드 첨부 필드가 `atchFileId` 하나뿐이라 질문 첨부와 답변 첨부가 같은 자리를 쓴다. */ export function InquiryAnswerModal({ post, onClose }: InquiryAnswerModalProps) { const { showToast } = useFeedback(); const formRef = useRef(null); const [statusCode, setStatusCode] = useState( post.answerStatusCode ?? ANSWER_STATUS_OPTIONS[0].value ); const [state, formAction, isPending] = useActionState( saveInquiryAnswerAction, INITIAL_INQUIRY_ANSWER_FORM_STATE ); useEffect(() => { if (state.status === 'success') { showToast({ variant: 'success', message: '답변을 저장했습니다.' }); onClose(); } }, [state, showToast, onClose]); const errors = state.status === 'error' ? (state.errors ?? {}) : {}; return ( formRef.current?.requestSubmit()} /> } >
submitFormAction(event, formAction)} className={styles.fields} >

게시물의 항목 (조회 전용)

({ value: option.value, label: option.label, }))} value={statusCode} onValueChange={setStatusCode} error={Boolean(errors.answerStatusCode)} hint={errors.answerStatusCode ?? STATUS_HELP_TEXT} />
{state.status === 'error' && state.message && ( )}
); }