import React, { useState, useEffect } from 'react'; import { Table, Button, Tag, Space, Typography, message, Modal, Card, Popconfirm, Empty } from 'antd'; import { CheckOutlined, DeleteOutlined, EyeOutlined, FilterOutlined, MessageOutlined } from '@ant-design/icons'; import { useAdminStore } from '../store'; import { api } from '../api/client'; import { formatDate } from '../utils/formatDate'; interface ContactRequest { id: string; userId: string; phone: string; companyName: string; industry: string; name: string; message: string | null; isHandled: boolean; createdAt: string; } const AdminContactRequests: React.FC = () => { const [data, setData] = useState([]); const [total, setTotal] = useState(0); const [loading, setLoading] = useState(false); const [page, setPage] = useState(1); const [pageSize, setPageSize] = useState(10); const [isHandledFilter, setIsHandledFilter] = useState(null); const [selectedItem, setSelectedItem] = useState(null); const [detailModalOpen, setDetailModalOpen] = useState(false); const { user } = useAdminStore(); const fetchData = async () => { // if (!user?.isAdmin) return; setLoading(true); try { const query = new URLSearchParams(); query.set('page', String(page)); query.set('page_size', String(pageSize)); if (isHandledFilter !== null) { query.set('is_handled', String(isHandledFilter)); } const res = await api.get<{ items: ContactRequest[]; total: number }>(`/admin/contact-requests?${query.toString()}`); setData(res.items); setTotal(res.total); } catch (err: any) { message.error(err?.message || '获取失败'); } finally { setLoading(false); } }; useEffect(() => { fetchData(); }, [page, pageSize, isHandledFilter]); const handleMarkHandled = async (id: string) => { try { await api.put(`/admin/contact-requests/${id}/handle`); message.success('已标记为处理'); fetchData(); } catch (err: any) { message.error(err?.message || '操作失败'); } }; const handleDelete = async (id: string) => { try { await api.delete(`/admin/contact-requests/${id}`); message.success('已删除'); fetchData(); } catch (err: any) { message.error(err?.message || '删除失败'); } }; const handleViewDetail = (item: ContactRequest) => { setSelectedItem(item); setDetailModalOpen(true); }; const handlePageChange = (p: number, ps: number) => { setPage(p); setPageSize(ps); }; const columns = [ { title: '姓名', dataIndex: 'name', key: 'name', width: 100, render: (v: string) => {v}, }, { title: '手机号', dataIndex: 'phone', key: 'phone', width: 120, }, { title: '公司名称', dataIndex: 'companyName', key: 'companyName', width: 150, ellipsis: true, }, { title: '行业', dataIndex: 'industry', key: 'industry', width: 120, }, { title: '状态', dataIndex: 'isHandled', key: 'isHandled', width: 80, render: (isHandled: boolean) => ( {isHandled ? '已处理' : '待处理'} ), }, { title: '提交时间', dataIndex: 'createdAt', key: 'createdAt', width: 160, render: (date: string) => formatDate(date), }, { title: '操作', key: 'actions', width: 180, render: (_: unknown, record: ContactRequest) => ( {!record.isHandled && ( )} handleDelete(record.id)}> ), }, ]; return (
联系请求管理 共 {total} 条记录
{loading ? (
加载中...
) : data.length === 0 ? ( ) : ( `共 ${t} 条记录`, }} scroll={{ x: 900 }} /> )} 联系请求详情} open={detailModalOpen} onCancel={() => setDetailModalOpen(false)} footer={null} width={500} > {selectedItem && (
{selectedItem.name} {selectedItem.isHandled ? '已处理' : '待处理'}
手机号: {selectedItem.phone} 公司名称: {selectedItem.companyName} 行业: {selectedItem.industry} 提交时间: {formatDate(selectedItem.createdAt)} {selectedItem.message && ( <> 留言: {selectedItem.message} )}
{!selectedItem.isHandled && ( )}
)}
); }; export default AdminContactRequests;