import { useMemo, useState } from 'react' import Modal from '../../components/DraggableModal' import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query' import { Button, Card, Form, Input, Select, Space, Typography, message } from 'antd' import CareTable from '../../components/CareTable' import { EditOutlined, PlusSquareOutlined, QuestionCircleOutlined, ReloadOutlined, SearchOutlined } from '@ant-design/icons' import client, { apiPrefix, unwrap, type ApiResponse } from '../../api/client' type QuestionRow = { id: number no?: number title?: string answer?: string status?: string authorName?: string createdDate?: string content?: string reply?: string } type QuestionResult = { total: number list: QuestionRow[] } const initial = { page: 0, size: 10, searchType: '제목', sort: 'id,desc' } as Record export default function CsQuestionPage() { const qc = useQueryClient() const [form] = Form.useForm() const [editForm] = Form.useForm() const [filters, setFilters] = useState>(initial) const [open, setOpen] = useState(false) const [detail, setDetail] = useState(null) const query = useQuery({ queryKey: ['homes-questions', filters], queryFn: async () => { const { data } = await client.get>(`${apiPrefix()}/homes/questions`, { params: { ...filters, q: filters.keyword || undefined } }) return unwrap(data) } }) const refresh = () => qc.invalidateQueries({ queryKey: ['homes-questions'] }) const createMut = useMutation({ mutationFn: async (values: Record) => { const { data } = await client.post(`${apiPrefix()}/homes/questions`, { title: values.title, content: values.content, status: '접수' }) return unwrap(data as ApiResponse) }, onSuccess: () => { message.success('사용문의를 등록했습니다.') setOpen(false) editForm.resetFields() refresh() }, onError: (e: Error) => message.error(e.message) }) const openDetail = useMutation({ mutationFn: async (id: number) => { const { data } = await client.get>(`${apiPrefix()}/homes/questions/${id}`) return unwrap(data) }, onSuccess: (row) => setDetail(row), onError: (e: Error) => message.error(e.message) }) const onSearch = (values: Record) => { setFilters({ ...initial, searchType: values.searchType || '제목', keyword: values.keyword || undefined, page: 0, size: Number(values.size ?? filters.size ?? 10), sort: filters.sort }) } const onReset = () => { form.resetFields() form.setFieldsValue({ searchType: '제목', size: 10 }) setFilters(initial) } const columns = useMemo( () => [ { title: '번호', dataIndex: 'no', width: 90, align: 'center' as const, sorter: true }, { title: '제목', dataIndex: 'title', ellipsis: true, render: (v: string, row: QuestionRow) => ( ) }, { title: '답변', dataIndex: 'answer', width: 120, align: 'center' as const, sorter: true, render: (v?: string) => v || '' }, { title: '작성자', dataIndex: 'authorName', width: 100, align: 'center' as const, sorter: true }, { title: '등록일', dataIndex: 'createdDate', width: 120, align: 'center' as const, sorter: true }, ], [], ) return (

사용문의

궁금하신 사항이나 사용상 문제가 있으시면 언제든지 내용을 남겨주세요. 담당자 확인 후 답변드리겠습니다.

setDetail(null)} footer={} width={640} destroyOnHidden centered > {detail ? (
{detail.title}
작성자 {detail.authorName || '-'} 등록일 {detail.createdDate || '-'} {detail.answer || '미답변'}
문의내용
{(detail.content || '') .split('\n') .map((line, idx) => (

{line || '\u00A0'}

))}
{detail.reply ? (
답변
{detail.reply .split('\n') .map((line, idx) => (

{line || '\u00A0'}

))}
) : null}
) : null}
) }