From b2660d43ebfd04b385aa1b929eceb9b2d1fff0a2 Mon Sep 17 00:00:00 2001 From: MHSanaei Date: Sat, 30 May 2026 20:52:57 +0200 Subject: [PATCH] refactor(frontend): break down DnsTab columns/helpers/types Extract DnsTab's pure pieces into the dns/ folder: helpers.ts (STRATEGIES/DEFAULT_FAKEDNS + addr/domains/expectedIPs accessors), types.ts (DnsConfig/HostRow/FakednsRow), and useDnsColumns.tsx (useDnsServerColumns + useFakednsColumns table-column hooks taking their row handlers as params). DnsTab stays the orchestrator for dns state, mutate, hosts sync and the Collapse panels, and drops from 539 to 424 lines. No behavior change. --- frontend/src/pages/xray/dns/DnsTab.tsx | 131 ++---------------- frontend/src/pages/xray/dns/helpers.ts | 19 +++ frontend/src/pages/xray/dns/types.ts | 14 ++ frontend/src/pages/xray/dns/useDnsColumns.tsx | 122 ++++++++++++++++ 4 files changed, 163 insertions(+), 123 deletions(-) create mode 100644 frontend/src/pages/xray/dns/helpers.ts create mode 100644 frontend/src/pages/xray/dns/types.ts create mode 100644 frontend/src/pages/xray/dns/useDnsColumns.tsx 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) }, - ], - }} - > -