import { useState } from 'react' import { Button, Form, Input, Modal, Popconfirm, Space, Tag, Tooltip, message } from 'antd' import type { ColumnsType } from 'antd/es/table' import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query' import { useTranslation } from 'react-i18next' import { ApartmentOutlined } from '@ant-design/icons' import apiClient, { isEnvelope } from '../../api/client' import DataTable from '../../components/DataTable' import EmptyState from '../../components/EmptyState' import type { FwZone } from './types' interface FormValues { name: string description?: string } async function listZones(): Promise { const r = await apiClient.get('/firewall/zones') if (!isEnvelope(r.data)) return [] return (r.data.data as { zones?: FwZone[] }).zones ?? [] } export default function ZonesTab() { const { t } = useTranslation() const qc = useQueryClient() const [editing, setEditing] = useState(null) const [creating, setCreating] = useState(false) const [form] = Form.useForm() const { data, isLoading } = useQuery({ queryKey: ['fw-zones'], queryFn: listZones }) const upsert = useMutation({ mutationFn: async (vals: FormValues) => { if (editing) return (await apiClient.put(`/firewall/zones/${editing.id}`, vals)).data return (await apiClient.post('/firewall/zones', vals)).data }, onSuccess: () => { message.success(t('common.save')) setEditing(null); setCreating(false); form.resetFields() void qc.invalidateQueries({ queryKey: ['fw-zones'] }) }, onError: (e: Error) => message.error(e.message), }) const del = useMutation({ mutationFn: async (id: number) => { await apiClient.delete(`/firewall/zones/${id}`) }, onSuccess: () => { void qc.invalidateQueries({ queryKey: ['fw-zones'] }) }, onError: (e: Error) => message.error(e.message), }) const columns: ColumnsType = [ { title: t('fw.zone.name'), dataIndex: 'name', key: 'name', render: (s: string, row) => row.builtin ? {s}{t('fw.zone.builtin')} : {s}, }, { title: t('fw.zone.description'), dataIndex: 'description', key: 'description', render: (v?: string | null) => v ?? '—' }, { title: t('common.actions'), key: 'actions', render: (_, row) => ( {row.builtin ? : del.mutate(row.id)} > } ), }, ] const openCreate = () => { setCreating(true); form.resetFields() } return ( <> } title={t('fw.zone.emptyTitle')} description={t('fw.zone.emptyDesc')} action={ } /> } /> { setEditing(null); setCreating(false); form.resetFields() }} onOk={() => { void form.submit() }} confirmLoading={upsert.isPending} width={520} >
upsert.mutate(v)}>
) }