diff --git a/src/app/api/qna/file/route.ts b/src/app/api/qna/file/route.ts index 2c4556a..13a9232 100644 --- a/src/app/api/qna/file/route.ts +++ b/src/app/api/qna/file/route.ts @@ -6,10 +6,19 @@ export async function GET(request: Request) { const encodeFileNo = searchParams.get('encodeFileNo') if (!encodeFileNo) { - return NextResponse.json({ error: 'fileNo is required' }, { status: 400 }) + return NextResponse.json({ error: 'encodeFileNo is required' }, { status: 400 }) } - const response = await axios.get(`${process.env.NEXT_PUBLIC_INQUIRY_API_URL}/api/file/downloadFile?encodeFileNo=${encodeFileNo}`) - console.log('response.data:: ', response.data) + try { + const response = await axios.get(`${process.env.NEXT_PUBLIC_INQUIRY_API_URL}/api/file/downloadFile`, { + params: { + encodeFileNo, + }, + }) + console.log('response.data:: ', response.data) - return NextResponse.json(response.data) + return NextResponse.json(response.data) + } catch (error: any) { + console.error(error.response) + return NextResponse.json({ error: error.response.data }, { status: 500 }) + } } diff --git a/src/app/api/qna/list/route.ts b/src/app/api/qna/list/route.ts index 901aa20..2f7a52a 100644 --- a/src/app/api/qna/list/route.ts +++ b/src/app/api/qna/list/route.ts @@ -21,7 +21,6 @@ export async function GET(request: Request) { if (response.status === 200) { return NextResponse.json(response.data) } - return NextResponse.json({ error: 'Failed to fetch qna list' }, { status: response.status }) } catch (error: any) { console.error('Error fetching qna list:', error.response.data) diff --git a/src/app/api/qna/save/route.ts b/src/app/api/qna/save/route.ts index dd4edaa..00633bd 100644 --- a/src/app/api/qna/save/route.ts +++ b/src/app/api/qna/save/route.ts @@ -4,12 +4,9 @@ import { NextResponse } from 'next/server' export async function POST(request: Request) { const formData = await request.formData() console.log('formData:: ', formData) - // const body = await request.json() - // console.log('body:: ', body) try { const response = await axios.post(`${process.env.NEXT_PUBLIC_INQUIRY_API_URL}/api/qna/save`, formData) - console.log('response.data:: ', response.data) if (response.status === 200) { return NextResponse.json(response.data) diff --git a/src/app/inquiry/list/page.tsx b/src/app/inquiry/list/page.tsx index 7e7654e..3e69749 100644 --- a/src/app/inquiry/list/page.tsx +++ b/src/app/inquiry/list/page.tsx @@ -1,11 +1,9 @@ -import ListForm from '@/components/inquiry/list/ListForm' import ListTable from '@/components/inquiry/list/ListTable' export default function page() { return ( <>
-
diff --git a/src/components/inquiry/Detail.tsx b/src/components/inquiry/Detail.tsx index d068be3..9bb22b4 100644 --- a/src/components/inquiry/Detail.tsx +++ b/src/components/inquiry/Detail.tsx @@ -3,19 +3,13 @@ import Answer from './Answer' import { useInquiry } from '@/hooks/useInquiry' import { useParams, useRouter } from 'next/navigation' -import { useState } from 'react' export default function Detail() { - //todo: 답변 완료 표시를 위해 임시로 추가 해 놓은 state - // 추후에 api 작업 완료후 삭제 - // 답변 완료 클래스 & 하단 답변내용 출력도 - const params = useParams() const id = params.id const { inquiryDetail, downloadFile } = useInquiry(Number(id), '5200') const router = useRouter() - const [inquiry, setInquiry] = useState(true) return ( <> @@ -39,15 +33,7 @@ export default function Detail() { 作者 - Hong gi - - - 名前 - Kim - - - 番号 - 070-1234-5678 + {inquiryDetail?.regNm} 販売店 @@ -66,17 +52,9 @@ export default function Detail() {
- 屋根 - 適合性 - 屋根材 -
-
屋根材適合性確認依頼
-
- 入力した内容が表示されます. -
- インストール可能であることを確認してください. -
- 屋根の写真を添付しました. + {inquiryDetail?.qnaClsLrgCd} + {inquiryDetail?.qnaClsMidCd} + {inquiryDetail?.qnaClsSmlCd}
{inquiryDetail?.qstTitle}
{inquiryDetail?.qstContents}
@@ -91,6 +69,11 @@ export default function Detail() { ))} +
  • + +
  • diff --git a/src/components/inquiry/RegistForm.tsx b/src/components/inquiry/RegistForm.tsx index 09599ea..1e97130 100644 --- a/src/components/inquiry/RegistForm.tsx +++ b/src/components/inquiry/RegistForm.tsx @@ -4,7 +4,7 @@ import { useInquiry } from '@/hooks/useInquiry' import { useSessionStore } from '@/store/session' import { InquiryRequest } from '@/types/Inquiry' -import { useEffect, useState } from 'react' +import { useState } from 'react' import { useRouter } from 'next/navigation' export default function RegistForm() { const { saveInquiry, isSavingInquiry } = useInquiry() @@ -20,14 +20,15 @@ export default function RegistForm() { compCd: '5200', siteTpCd: 'QC', qnaClsLrgCd: '', - qnaClsMidCd: 'B02', + qnaClsMidCd: '', qnaClsSmlCd: null, title: '', - contents: null, + contents: '', regId: 'X112', regUserNm: 'TEST', regUserTelNo: null, - storeId: null, + storeId: 'X112', + qstMail: '', }) const [attachedFiles, setAttachedFiles] = useState([]) @@ -45,12 +46,30 @@ export default function RegistForm() { } const handleSubmit = async () => { - if (confirm('お問い合わせを登録しますか? Hanwha Japanの担当者にお問い合わせメールが送信されます。')) { - const res = await saveInquiry({ inquiryRequest, files: attachedFiles }) - alert('保存されました。') - router.push(`/inquiry/${res.qnaNo}`) - } - return + const formData = new FormData() + attachedFiles.forEach((file) => { + formData.append('files', file) + }) + Object.entries(inquiryRequest).forEach(([key, value]) => { + formData.append(key, value ?? '') + }) + + // FormData를 객체로 변환하여 확인 + const formDataObj: Record = {} + formData.forEach((value, key) => { + formDataObj[key] = value + }) + console.log('formData contents:', formDataObj) + + window.neoConfirm( + 'お問い合わせを登録しますか? Hanwha Japanの担当者にお問い合わせメールが送信されます。', + async () => { + const res = await saveInquiry(formData) + alert('保存されました。') + router.push(`/inquiry/${res.qnaNo}`) + }, + () => null, + ) } return ( @@ -62,30 +81,42 @@ export default function RegistForm() { お問い合わせタイプ *
    - setInquiryRequest({ ...inquiryRequest, qnaClsLrgCd: e.target.value })} + > + + +
    - setInquiryRequest({ ...inquiryRequest, qnaClsMidCd: e.target.value })} + > + + +
    - setInquiryRequest({ ...inquiryRequest, qnaClsSmlCd: e.target.value })} + > + + +
    @@ -94,27 +125,36 @@ export default function RegistForm() { 名前 *
    - + setInquiryRequest({ ...inquiryRequest, regUserNm: e.target.value })} + />
    電話番号
    - + setInquiryRequest({ ...inquiryRequest, regUserTelNo: e.target.value })} + />
    - 名前 * + E-mail *
    - -
    -
    -
    -
    電話番号
    -
    - + setInquiryRequest({ ...inquiryRequest, qstMail: e.target.value })} + />
    @@ -122,7 +162,12 @@ export default function RegistForm() { お問い合わせタイトル *
    - + setInquiryRequest({ ...inquiryRequest, title: e.target.value })} + />
    diff --git a/src/components/inquiry/list/ListForm.tsx b/src/components/inquiry/list/ListForm.tsx index d22d424..0118f58 100644 --- a/src/components/inquiry/list/ListForm.tsx +++ b/src/components/inquiry/list/ListForm.tsx @@ -5,8 +5,8 @@ import { useState } from 'react' export default function ListForm() { const router = useRouter() - const [searchKeyword, setSearchKeyword] = useState('') const { inquiryListRequest, setInquiryListRequest } = useInquiryFilterStore() + const [searchKeyword, setSearchKeyword] = useState(inquiryListRequest.schTitle ?? '') const handleSearch = () => { if (searchKeyword.length >= 2) { diff --git a/src/components/inquiry/list/ListTable.tsx b/src/components/inquiry/list/ListTable.tsx index 9598117..eed1d34 100644 --- a/src/components/inquiry/list/ListTable.tsx +++ b/src/components/inquiry/list/ListTable.tsx @@ -7,6 +7,7 @@ import { InquiryList } from '@/types/Inquiry' import { useRouter } from 'next/navigation' import { useInquiryFilterStore } from '@/store/inquiryFilterStore' import { useSessionStore } from '@/store/session' +import ListForm from './ListForm' const badgeStyle = [ { @@ -29,14 +30,23 @@ export default function ListTable() { const { inquiryList } = useInquiry() const { inquiryListRequest, setInquiryListRequest } = useInquiryFilterStore() + const [heldInquiryList, setHeldInquiryList] = useState([]) + const { session } = useSessionStore() useEffect(() => { - if (inquiryList.length !== 0) { - const hasMoreItems = inquiryList[0].totCnt > offset + 10 - setHasMore(hasMoreItems) + if (inquiryList.length > 0) { + if (offset === 0) { + setHeldInquiryList(inquiryList) + } else { + const remainingList = heldInquiryList.slice(offset, offset + 10) + if (JSON.stringify(remainingList) !== JSON.stringify(inquiryList)) { + setHeldInquiryList((prev) => [...prev, ...inquiryList]) + } + } + setHasMore(inquiryList.length > offset + 10) } else { - setHasMore(false) + setHeldInquiryList([]) } }, [inquiryList, offset]) @@ -49,8 +59,19 @@ export default function ListTable() { setInquiryListRequest({ ...inquiryListRequest, startRow: offset, endRow: offset + 10 }) } + const handleFilter = (e: React.ChangeEvent) => { + console.log(e.target.value) + setHeldInquiryList(inquiryList.filter((inquiry: InquiryList) => inquiry.answerYn === e.target.value)) + if (e.target.value === '') { + setHeldInquiryList(inquiryList) + } + } + + console.log('heldInquiryList:: ', heldInquiryList) + return ( <> +
    @@ -60,7 +81,7 @@ export default function ListTable() {
    - handleFilter(e)}> @@ -69,11 +90,11 @@ export default function ListTable() {
    - 合計 {inquiryList.length}個 + 合計 {heldInquiryList.length > 0 ? heldInquiryList[0].totCnt : 0}
      - {inquiryList.length > 0 && - inquiryList.map((inquiry: InquiryList) => ( + {heldInquiryList.length > 0 && + heldInquiryList.map((inquiry: InquiryList) => (
    • router.push(`/inquiry/${inquiry.qnaNo}`)}>
      {inquiry.qnaClsLrgCd}
      diff --git a/src/hooks/useInquiry.ts b/src/hooks/useInquiry.ts index 1314dee..0e698b1 100644 --- a/src/hooks/useInquiry.ts +++ b/src/hooks/useInquiry.ts @@ -12,10 +12,10 @@ export function useInquiry( inquiryDetail: Inquiry | null isLoadingInquiryDetail: boolean isSavingInquiry: boolean - saveInquiry: (params: { inquiryRequest: InquiryRequest; files: File[] }) => Promise + saveInquiry: (formData: FormData) => Promise downloadFile: (encodeFileNo: number) => Promise } { - const { session } = useSessionStore() + // const { session } = useSessionStore() const queryClient = useQueryClient() const { inquiryListRequest } = useInquiryFilterStore() @@ -41,6 +41,7 @@ export function useInquiry( const resp = await axiosInstance(null).get<{ data: Inquiry }>(`/api/qna/detail`, { params: { qnoNo, compCd, langCd: 'JA', loginId: 'x112' }, }) + console.log('resp.data.data:: ', resp.data.data) return resp.data.data } catch (error: any) { console.error(error.response) @@ -51,15 +52,7 @@ export function useInquiry( }) const { mutateAsync: saveInquiry, isPending: isSavingInquiry } = useMutation({ - mutationFn: async ({ inquiryRequest, files }: { inquiryRequest: InquiryRequest; files: File[] }) => { - const formData = new FormData() - Object.entries(inquiryRequest).forEach(([key, value]) => { - formData.append(key, value ?? '') - }) - files.forEach((file) => { - formData.append('files', file) - }) - + mutationFn: async (formData: FormData) => { const resp = await axiosInstance(null).post<{ data: InquirySaveResponse }>('/api/qna/save', formData) return resp.data.data }, diff --git a/src/types/Inquiry.ts b/src/types/Inquiry.ts index 96a6fff..c876020 100644 --- a/src/types/Inquiry.ts +++ b/src/types/Inquiry.ts @@ -75,11 +75,12 @@ export type InquiryRequest = { qnaClsMidCd: string //qna CLS Mid Code qnaClsSmlCd: string | null //qna CLS Small Code title: string //title - contents: string | null //contents + contents: string //contents regId: string //registration Userid - storeId: string | null //store id + storeId: string //store id regUserNm: string //registration User name regUserTelNo: string | null //registration User tel number + qstMail: string //mail } export type InquirySaveResponse = {