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 { QuestionCircleOutlined, ReloadOutlined, SearchOutlined } from '@ant-design/icons' import client, { apiPrefix, unwrap, type ApiResponse } from '../../api/client' type NoticeRow = { id: number no?: number title?: string views?: number createdDate?: string authorName?: string contents?: string } type NoticeResult = { total: number list: NoticeRow[] } const initial = { page: 0, size: 10, searchType: '제목', sort: 'id,desc' } as Record export default function CsNoticePage() { const qc = useQueryClient() const [form] = Form.useForm() const [filters, setFilters] = useState>(initial) const [detail, setDetail] = useState(null) const query = useQuery({ queryKey: ['homes-notices', filters], queryFn: async () => { const { data } = await client.get>(`${apiPrefix()}/homes/notices`, { params: { ...filters, q: filters.keyword || undefined } }) return unwrap(data) } }) const openDetail = useMutation({ mutationFn: async (id: number) => { const { data } = await client.get>(`${apiPrefix()}/homes/notices/${id}`) return unwrap(data) }, onSuccess: (row) => { setDetail(row) qc.invalidateQueries({ queryKey: ['homes-notices'] }) }, 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: NoticeRow) => ( ) }, { title: '조회', dataIndex: 'views', width: 90, align: 'center' as const, sorter: true, render: (v?: number) => (v == null ? 0 : Number(v).toLocaleString()) }, { title: '등록일', dataIndex: 'createdDate', width: 120, align: 'center' as const, sorter: true }, ], [], ) return (

공지사항

프로그램 사용에 대한 공지사항이나 업데이트를 알려드립니다.