diff --git a/frontend/src/pages/xray/dns/DnsTab.tsx b/frontend/src/pages/xray/dns/DnsTab.tsx index 8ef3f9e4..c0ca4465 100644 --- a/frontend/src/pages/xray/dns/DnsTab.tsx +++ b/frontend/src/pages/xray/dns/DnsTab.tsx @@ -1,49 +1,24 @@ import { useCallback, useEffect, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; -import { Button, Collapse, Dropdown, Empty, Input, InputNumber, Modal, Select, Space, Switch, Table } from 'antd'; -import { PlusOutlined, MoreOutlined, EditOutlined, DeleteOutlined, MenuOutlined } from '@ant-design/icons'; -import type { ColumnsType } from 'antd/es/table'; +import { Button, Collapse, Empty, Input, InputNumber, Modal, Select, Space, Switch, Table } from 'antd'; +import { PlusOutlined, DeleteOutlined, MenuOutlined } from '@ant-design/icons'; import { SettingListItem } from '@/components/ui'; import DnsServerModal from './DnsServerModal'; import type { DnsServerValue } from './DnsServerModal'; import DnsPresetsModal from './DnsPresetsModal'; import type { XraySettingsValue, SetTemplate } from '@/hooks/useXraySetting'; -import { DnsQueryStrategySchema, type DnsObject } from '@/schemas/dns'; import './DnsTab.css'; +import { STRATEGIES, DEFAULT_FAKEDNS } from './helpers'; +import type { DnsConfig, HostRow, FakednsRow } from './types'; +import { useDnsServerColumns, useFakednsColumns } from './useDnsColumns'; + interface DnsTabProps { templateSettings: XraySettingsValue | null; setTemplateSettings: SetTemplate; } -const STRATEGIES = DnsQueryStrategySchema.options; -const DEFAULT_FAKEDNS = () => ({ ipPool: '198.18.0.0/15', poolSize: 65535 }); - -type DnsConfig = Omit & { servers?: DnsServerValue[] }; - -interface HostRow { - domain: string; - values: string[]; -} - -interface FakednsRow { - ipPool: string; - poolSize: number; -} - -function addrFor(server: DnsServerValue): string { - return typeof server === 'string' ? server : server?.address || ''; -} -function domainsFor(server: DnsServerValue): string { - return typeof server === 'object' && server !== null ? (server.domains || []).join(',') : ''; -} -function expectedIPsFor(server: DnsServerValue): string { - if (typeof server !== 'object' || !server) return ''; - const list = server.expectedIPs || server.expectIPs || []; - return Array.isArray(list) ? list.join(',') : ''; -} - export default function DnsTab({ templateSettings, setTemplateSettings }: DnsTabProps) { const { t } = useTranslation(); const [modal, modalContextHolder] = Modal.useModal(); @@ -142,52 +117,7 @@ export default function DnsTab({ templateSettings, setTemplateSettings }: DnsTab return list.map((server, idx) => ({ key: idx, server })); }, [dns?.servers]); - const dnsColumns: ColumnsType<{ key: number; server: DnsServerValue }> = useMemo( - () => [ - { - title: '#', - key: 'action', - align: 'center', - width: 60, - render: (_v, _record, index) => ( - - {index + 1} - {t('edit')}, onClick: () => openEditServer(index) }, - { key: 'del', danger: true, label: <> {t('delete')}, onClick: () => deleteServer(index) }, - ], - }} - > -