'use client' import { useInquiry } from '@/hooks/useInquiry' import { useSessionStore } from '@/store/session' import { InquiryRequest } from '@/types/Inquiry' import { useEffect, useState } from 'react' import { useRouter } from 'next/navigation' import { CONFIRM_MESSAGE, ERROR_MESSAGE, SUCCESS_MESSAGE, useAlertMsg, WARNING_MESSAGE } from '@/hooks/useAlertMsg' import { useInquiryFilterStore } from '@/store/inquiryFilterStore' export default function RegistForm() { const { saveInquiry, isSavingInquiry, commonCodeList } = useInquiry(undefined, false) const { showErrorAlert, showSuccessAlert, showConfirm } = useAlertMsg() const { session } = useSessionStore() const router = useRouter() const { setIsMyInquiry } = useInquiryFilterStore() const [inquiryRequest, setInquiryRequest] = useState({ compCd: '5200', siteTpCd: 'QC', qnaClsLrgCd: '', qnaClsMidCd: '', qnaClsSmlCd: null, title: '', contents: '', regId: '', regUserNm: '', regUserTelNo: null, storeId: '', qstMail: '', }) const requiredFieldNames = [ { id: 'qnaClsLrgCd', name: 'お問い合わせタイプ' }, { id: 'qnaClsMidCd', name: 'お問い合わせタイプ' }, { id: 'regUserNm', name: '名前' }, { id: 'qstMail', name: 'E-mail' }, { id: 'title', name: 'お問い合わせタイトル' }, { id: 'contents', name: 'お問い合わせ内容' }, ] useEffect(() => { if (session?.isLoggedIn) { setInquiryRequest({ ...inquiryRequest, regId: session?.userId ?? '', regUserNm: session?.userNm ?? '', storeId: session?.storeId ?? '', qstMail: session?.email ?? '', }) } }, [session]) const [attachedFiles, setAttachedFiles] = useState([]) /** 파일 첨부 처리 */ const handleFileChange = (e: React.ChangeEvent) => { const files = e.target.files if (files && files.length > 0) { setAttachedFiles(attachedFiles.concat(Array.from(files))) } e.target.value = '' } /** 파일 삭제 처리 */ const handleRemoveFile = (index: number) => { setAttachedFiles(attachedFiles.filter((_, i) => i !== index)) } /** 필수 필드 포커스 처리 */ const focusOnRequiredField = (fieldId: string) => { const element = document.getElementById(fieldId) if (element) element.focus() } /** 제출 처리 */ const handleSubmit = async () => { const emptyField = requiredFieldNames.find((field) => inquiryRequest[field.id as keyof InquiryRequest] === '') if (emptyField) { showErrorAlert(WARNING_MESSAGE.REQUIRED_FIELD_IS_EMPTY, emptyField?.name) focusOnRequiredField(emptyField?.id ?? '') return } const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/ if (!emailRegex.test(inquiryRequest.qstMail)) { showErrorAlert(WARNING_MESSAGE.EMAIL_PREFIX_IS_INVALID) focusOnRequiredField('qstMail') return } if (inquiryRequest.title.length > 100) { showErrorAlert(WARNING_MESSAGE.TITLE_MAX_LENGTH) focusOnRequiredField('title') return } if (inquiryRequest.contents.length > 2000) { showErrorAlert(WARNING_MESSAGE.CONTENTS_MAX_LENGTH) focusOnRequiredField('contents') return } const formData = new FormData() attachedFiles.forEach((file) => { formData.append('files', file) }) Object.entries(inquiryRequest).forEach(([key, value]) => { formData.append(key, value ?? '') }) showConfirm( CONFIRM_MESSAGE.SAVE_INQUIRY_CONFIRM, async () => { try { const res = await saveInquiry(formData) showSuccessAlert(SUCCESS_MESSAGE.SAVE_SUCCESS) router.push(`/inquiry/${res.qnaNo}`) } catch (error) { showErrorAlert(ERROR_MESSAGE.SERVER_ERROR) } }, () => null, ) } const handlePhoneNumberChange = (e: React.ChangeEvent) => { const value = e.target.value.replace(/[^\d]/g, '') let formattedNumber = '' if (value.length <= 3) { formattedNumber = value } else if (value.length <= 7) { formattedNumber = `${value.slice(0, 3)}-${value.slice(3)}` } else { formattedNumber = `${value.slice(0, 3)}-${value.slice(3, 7)}-${value.slice(7, 11)}` } setInquiryRequest({ ...inquiryRequest, regUserTelNo: formattedNumber }) } return ( <>
お問い合わせタイプ *
{commonCodeList.filter((code) => code.refChar1 === inquiryRequest.qnaClsLrgCd).length > 0 && (
)} {commonCodeList.filter((code) => code.refChar1 === inquiryRequest.qnaClsMidCd).length > 0 && (
)}
名前 *
setInquiryRequest({ ...inquiryRequest, regUserNm: e.target.value })} value={inquiryRequest.regUserNm} id="regUserNm" />
電話番号
E-mail *
setInquiryRequest({ ...inquiryRequest, qstMail: e.target.value })} id="qstMail" />
お問い合わせタイトル *
{ if (e.target.value.length >= 100) { showErrorAlert(WARNING_MESSAGE.TITLE_MAX_LENGTH) return } setInquiryRequest({ ...inquiryRequest, title: e.target.value }) }} maxLength={100} id="title" />
お問い合わせ内容 *
添付ファイル{attachedFiles.length}
    {attachedFiles.map((file, index) => (
  • {file.name}
  • ))}
) }