From 06d0ae947d6749c9ba071a9f5e73cbaf2ba7d057 Mon Sep 17 00:00:00 2001 From: MHSanaei Date: Sat, 30 May 2026 14:59:56 +0200 Subject: [PATCH] refactor(frontend): reorganize components & pages into feature folders No behavior change; pure file relocation + import path updates. --- .../components/{ => feedback}/PromptModal.tsx | 0 .../components/{ => feedback}/TextModal.tsx | 0 frontend/src/components/feedback/index.ts | 2 ++ .../components/{ => form}/DateTimePicker.css | 0 .../components/{ => form}/DateTimePicker.tsx | 0 .../components/{ => form}/HeaderMapEditor.tsx | 2 +- .../src/components/{ => form}/JsonEditor.css | 0 .../src/components/{ => form}/JsonEditor.tsx | 0 frontend/src/components/form/index.ts | 3 +++ .../src/components/{ => ui}/InfinityIcon.tsx | 0 .../src/components/{ => ui}/InputAddon.css | 0 .../src/components/{ => ui}/InputAddon.tsx | 0 .../components/{ => ui}/SettingListItem.css | 0 .../components/{ => ui}/SettingListItem.tsx | 0 frontend/src/components/ui/index.ts | 3 +++ .../components/{ => utility}/LazyMount.tsx | 0 frontend/src/components/utility/index.ts | 1 + .../src/components/{ => viz}/Sparkline.css | 0 .../src/components/{ => viz}/Sparkline.tsx | 0 frontend/src/components/viz/index.ts | 1 + .../{components => layouts}/AppSidebar.css | 0 .../{components => layouts}/AppSidebar.tsx | 0 .../shared}/HysteriaMasqueradeForm.tsx | 2 +- .../lib/xray/forms/protocols/shared/index.ts | 1 + .../xray/forms/transport}/FinalMaskForm.tsx | 0 .../src/lib/xray/forms/transport/index.ts | 1 + frontend/src/pages/api-docs/ApiDocsPage.tsx | 2 +- .../src/pages/clients/ClientBulkAddModal.tsx | 2 +- .../src/pages/clients/ClientFormModal.tsx | 2 +- .../src/pages/clients/ClientInfoModal.tsx | 2 +- frontend/src/pages/clients/ClientQrModal.tsx | 2 +- frontend/src/pages/clients/ClientsPage.tsx | 4 ++-- frontend/src/pages/groups/GroupsPage.tsx | 4 ++-- frontend/src/pages/inbounds/InboundsPage.tsx | 22 +++++++++---------- .../{ => clients}/AddClientsToGroupModal.tsx | 0 .../{ => clients}/AttachClientsModal.tsx | 2 +- .../{ => clients}/DetachClientsModal.tsx | 0 frontend/src/pages/inbounds/clients/index.ts | 3 +++ .../inbounds/{ => form}/InboundFormModal.css | 0 .../inbounds/{ => form}/InboundFormModal.tsx | 12 +++++----- frontend/src/pages/inbounds/form/index.ts | 1 + .../inbounds/{ => info}/InboundInfoModal.css | 0 .../inbounds/{ => info}/InboundInfoModal.tsx | 4 ++-- frontend/src/pages/inbounds/info/index.ts | 1 + .../pages/inbounds/{ => list}/InboundList.css | 0 .../pages/inbounds/{ => list}/InboundList.tsx | 2 +- frontend/src/pages/inbounds/list/index.ts | 1 + .../pages/inbounds/{ => qr}/QrCodeModal.tsx | 2 +- .../src/pages/inbounds/{ => qr}/QrPanel.css | 0 .../src/pages/inbounds/{ => qr}/QrPanel.tsx | 0 frontend/src/pages/inbounds/qr/index.ts | 2 ++ frontend/src/pages/index/IndexPage.tsx | 6 ++--- .../src/pages/index/SystemHistoryModal.tsx | 2 +- frontend/src/pages/index/XrayMetricsModal.tsx | 2 +- frontend/src/pages/nodes/NodeHistoryPanel.tsx | 2 +- frontend/src/pages/nodes/NodesPage.tsx | 2 +- frontend/src/pages/settings/GeneralTab.tsx | 2 +- frontend/src/pages/settings/SecurityTab.tsx | 2 +- frontend/src/pages/settings/SettingsPage.tsx | 2 +- .../pages/settings/SubscriptionFormatsTab.tsx | 2 +- .../pages/settings/SubscriptionGeneralTab.tsx | 2 +- frontend/src/pages/settings/TelegramTab.tsx | 2 +- frontend/src/pages/xray/XrayPage.tsx | 17 +++++++------- .../{ => balancers}/BalancerFormModal.tsx | 2 +- .../xray/{ => balancers}/BalancersTab.tsx | 2 +- frontend/src/pages/xray/balancers/index.ts | 2 ++ .../src/pages/xray/{ => basics}/BasicsTab.css | 0 .../src/pages/xray/{ => basics}/BasicsTab.tsx | 2 +- frontend/src/pages/xray/basics/index.ts | 1 + .../pages/xray/{ => dns}/DnsPresetsModal.css | 0 .../pages/xray/{ => dns}/DnsPresetsModal.tsx | 0 .../pages/xray/{ => dns}/DnsServerModal.tsx | 2 +- frontend/src/pages/xray/{ => dns}/DnsTab.css | 0 frontend/src/pages/xray/{ => dns}/DnsTab.tsx | 2 +- frontend/src/pages/xray/dns/index.ts | 3 +++ .../{ => outbounds}/OutboundFormModal.css | 0 .../{ => outbounds}/OutboundFormModal.tsx | 10 ++++----- .../xray/{ => outbounds}/OutboundsTab.css | 0 .../xray/{ => outbounds}/OutboundsTab.tsx | 0 frontend/src/pages/xray/outbounds/index.ts | 2 ++ .../pages/xray/{ => overrides}/NordModal.css | 0 .../pages/xray/{ => overrides}/NordModal.tsx | 0 .../pages/xray/{ => overrides}/WarpModal.css | 0 .../pages/xray/{ => overrides}/WarpModal.tsx | 0 frontend/src/pages/xray/overrides/index.ts | 2 ++ .../pages/xray/{ => routing}/RoutingTab.css | 0 .../pages/xray/{ => routing}/RoutingTab.tsx | 0 .../xray/{ => routing}/RuleFormModal.tsx | 2 +- frontend/src/pages/xray/routing/index.ts | 2 ++ 89 files changed, 97 insertions(+), 66 deletions(-) rename frontend/src/components/{ => feedback}/PromptModal.tsx (100%) rename frontend/src/components/{ => feedback}/TextModal.tsx (100%) create mode 100644 frontend/src/components/feedback/index.ts rename frontend/src/components/{ => form}/DateTimePicker.css (100%) rename frontend/src/components/{ => form}/DateTimePicker.tsx (100%) rename frontend/src/components/{ => form}/HeaderMapEditor.tsx (98%) rename frontend/src/components/{ => form}/JsonEditor.css (100%) rename frontend/src/components/{ => form}/JsonEditor.tsx (100%) create mode 100644 frontend/src/components/form/index.ts rename frontend/src/components/{ => ui}/InfinityIcon.tsx (100%) rename frontend/src/components/{ => ui}/InputAddon.css (100%) rename frontend/src/components/{ => ui}/InputAddon.tsx (100%) rename frontend/src/components/{ => ui}/SettingListItem.css (100%) rename frontend/src/components/{ => ui}/SettingListItem.tsx (100%) create mode 100644 frontend/src/components/ui/index.ts rename frontend/src/components/{ => utility}/LazyMount.tsx (100%) create mode 100644 frontend/src/components/utility/index.ts rename frontend/src/components/{ => viz}/Sparkline.css (100%) rename frontend/src/components/{ => viz}/Sparkline.tsx (100%) create mode 100644 frontend/src/components/viz/index.ts rename frontend/src/{components => layouts}/AppSidebar.css (100%) rename frontend/src/{components => layouts}/AppSidebar.tsx (100%) rename frontend/src/{components => lib/xray/forms/protocols/shared}/HysteriaMasqueradeForm.tsx (98%) create mode 100644 frontend/src/lib/xray/forms/protocols/shared/index.ts rename frontend/src/{components => lib/xray/forms/transport}/FinalMaskForm.tsx (100%) create mode 100644 frontend/src/lib/xray/forms/transport/index.ts rename frontend/src/pages/inbounds/{ => clients}/AddClientsToGroupModal.tsx (100%) rename frontend/src/pages/inbounds/{ => clients}/AttachClientsModal.tsx (99%) rename frontend/src/pages/inbounds/{ => clients}/DetachClientsModal.tsx (100%) create mode 100644 frontend/src/pages/inbounds/clients/index.ts rename frontend/src/pages/inbounds/{ => form}/InboundFormModal.css (100%) rename frontend/src/pages/inbounds/{ => form}/InboundFormModal.tsx (99%) create mode 100644 frontend/src/pages/inbounds/form/index.ts rename frontend/src/pages/inbounds/{ => info}/InboundInfoModal.css (100%) rename frontend/src/pages/inbounds/{ => info}/InboundInfoModal.tsx (99%) create mode 100644 frontend/src/pages/inbounds/info/index.ts rename frontend/src/pages/inbounds/{ => list}/InboundList.css (100%) rename frontend/src/pages/inbounds/{ => list}/InboundList.tsx (99%) create mode 100644 frontend/src/pages/inbounds/list/index.ts rename frontend/src/pages/inbounds/{ => qr}/QrCodeModal.tsx (98%) rename frontend/src/pages/inbounds/{ => qr}/QrPanel.css (100%) rename frontend/src/pages/inbounds/{ => qr}/QrPanel.tsx (100%) create mode 100644 frontend/src/pages/inbounds/qr/index.ts rename frontend/src/pages/xray/{ => balancers}/BalancerFormModal.tsx (99%) rename frontend/src/pages/xray/{ => balancers}/BalancersTab.tsx (99%) create mode 100644 frontend/src/pages/xray/balancers/index.ts rename frontend/src/pages/xray/{ => basics}/BasicsTab.css (100%) rename frontend/src/pages/xray/{ => basics}/BasicsTab.tsx (99%) create mode 100644 frontend/src/pages/xray/basics/index.ts rename frontend/src/pages/xray/{ => dns}/DnsPresetsModal.css (100%) rename frontend/src/pages/xray/{ => dns}/DnsPresetsModal.tsx (100%) rename frontend/src/pages/xray/{ => dns}/DnsServerModal.tsx (99%) rename frontend/src/pages/xray/{ => dns}/DnsTab.css (100%) rename frontend/src/pages/xray/{ => dns}/DnsTab.tsx (99%) create mode 100644 frontend/src/pages/xray/dns/index.ts rename frontend/src/pages/xray/{ => outbounds}/OutboundFormModal.css (100%) rename frontend/src/pages/xray/{ => outbounds}/OutboundFormModal.tsx (99%) rename frontend/src/pages/xray/{ => outbounds}/OutboundsTab.css (100%) rename frontend/src/pages/xray/{ => outbounds}/OutboundsTab.tsx (100%) create mode 100644 frontend/src/pages/xray/outbounds/index.ts rename frontend/src/pages/xray/{ => overrides}/NordModal.css (100%) rename frontend/src/pages/xray/{ => overrides}/NordModal.tsx (100%) rename frontend/src/pages/xray/{ => overrides}/WarpModal.css (100%) rename frontend/src/pages/xray/{ => overrides}/WarpModal.tsx (100%) create mode 100644 frontend/src/pages/xray/overrides/index.ts rename frontend/src/pages/xray/{ => routing}/RoutingTab.css (100%) rename frontend/src/pages/xray/{ => routing}/RoutingTab.tsx (100%) rename frontend/src/pages/xray/{ => routing}/RuleFormModal.tsx (99%) create mode 100644 frontend/src/pages/xray/routing/index.ts diff --git a/frontend/src/components/PromptModal.tsx b/frontend/src/components/feedback/PromptModal.tsx similarity index 100% rename from frontend/src/components/PromptModal.tsx rename to frontend/src/components/feedback/PromptModal.tsx diff --git a/frontend/src/components/TextModal.tsx b/frontend/src/components/feedback/TextModal.tsx similarity index 100% rename from frontend/src/components/TextModal.tsx rename to frontend/src/components/feedback/TextModal.tsx diff --git a/frontend/src/components/feedback/index.ts b/frontend/src/components/feedback/index.ts new file mode 100644 index 00000000..f24deac9 --- /dev/null +++ b/frontend/src/components/feedback/index.ts @@ -0,0 +1,2 @@ +export { default as PromptModal } from './PromptModal'; +export { default as TextModal } from './TextModal'; diff --git a/frontend/src/components/DateTimePicker.css b/frontend/src/components/form/DateTimePicker.css similarity index 100% rename from frontend/src/components/DateTimePicker.css rename to frontend/src/components/form/DateTimePicker.css diff --git a/frontend/src/components/DateTimePicker.tsx b/frontend/src/components/form/DateTimePicker.tsx similarity index 100% rename from frontend/src/components/DateTimePicker.tsx rename to frontend/src/components/form/DateTimePicker.tsx diff --git a/frontend/src/components/HeaderMapEditor.tsx b/frontend/src/components/form/HeaderMapEditor.tsx similarity index 98% rename from frontend/src/components/HeaderMapEditor.tsx rename to frontend/src/components/form/HeaderMapEditor.tsx index c630c851..86d769c4 100644 --- a/frontend/src/components/HeaderMapEditor.tsx +++ b/frontend/src/components/form/HeaderMapEditor.tsx @@ -2,7 +2,7 @@ import { useEffect, useRef, useState } from 'react'; import { Button, Input, Space } from 'antd'; import { MinusOutlined, PlusOutlined } from '@ant-design/icons'; -import InputAddon from '@/components/InputAddon'; +import { InputAddon } from '@/components/ui'; // Reusable header-map editor. Handles the two wire shapes Xray uses for // HTTP-style header maps: diff --git a/frontend/src/components/JsonEditor.css b/frontend/src/components/form/JsonEditor.css similarity index 100% rename from frontend/src/components/JsonEditor.css rename to frontend/src/components/form/JsonEditor.css diff --git a/frontend/src/components/JsonEditor.tsx b/frontend/src/components/form/JsonEditor.tsx similarity index 100% rename from frontend/src/components/JsonEditor.tsx rename to frontend/src/components/form/JsonEditor.tsx diff --git a/frontend/src/components/form/index.ts b/frontend/src/components/form/index.ts new file mode 100644 index 00000000..9f3e3713 --- /dev/null +++ b/frontend/src/components/form/index.ts @@ -0,0 +1,3 @@ +export { default as DateTimePicker } from './DateTimePicker'; +export { default as JsonEditor } from './JsonEditor'; +export { default as HeaderMapEditor } from './HeaderMapEditor'; diff --git a/frontend/src/components/InfinityIcon.tsx b/frontend/src/components/ui/InfinityIcon.tsx similarity index 100% rename from frontend/src/components/InfinityIcon.tsx rename to frontend/src/components/ui/InfinityIcon.tsx diff --git a/frontend/src/components/InputAddon.css b/frontend/src/components/ui/InputAddon.css similarity index 100% rename from frontend/src/components/InputAddon.css rename to frontend/src/components/ui/InputAddon.css diff --git a/frontend/src/components/InputAddon.tsx b/frontend/src/components/ui/InputAddon.tsx similarity index 100% rename from frontend/src/components/InputAddon.tsx rename to frontend/src/components/ui/InputAddon.tsx diff --git a/frontend/src/components/SettingListItem.css b/frontend/src/components/ui/SettingListItem.css similarity index 100% rename from frontend/src/components/SettingListItem.css rename to frontend/src/components/ui/SettingListItem.css diff --git a/frontend/src/components/SettingListItem.tsx b/frontend/src/components/ui/SettingListItem.tsx similarity index 100% rename from frontend/src/components/SettingListItem.tsx rename to frontend/src/components/ui/SettingListItem.tsx diff --git a/frontend/src/components/ui/index.ts b/frontend/src/components/ui/index.ts new file mode 100644 index 00000000..1e8121b5 --- /dev/null +++ b/frontend/src/components/ui/index.ts @@ -0,0 +1,3 @@ +export { default as InputAddon } from './InputAddon'; +export { default as InfinityIcon } from './InfinityIcon'; +export { default as SettingListItem } from './SettingListItem'; diff --git a/frontend/src/components/LazyMount.tsx b/frontend/src/components/utility/LazyMount.tsx similarity index 100% rename from frontend/src/components/LazyMount.tsx rename to frontend/src/components/utility/LazyMount.tsx diff --git a/frontend/src/components/utility/index.ts b/frontend/src/components/utility/index.ts new file mode 100644 index 00000000..6a3e0176 --- /dev/null +++ b/frontend/src/components/utility/index.ts @@ -0,0 +1 @@ +export { default as LazyMount } from './LazyMount'; diff --git a/frontend/src/components/Sparkline.css b/frontend/src/components/viz/Sparkline.css similarity index 100% rename from frontend/src/components/Sparkline.css rename to frontend/src/components/viz/Sparkline.css diff --git a/frontend/src/components/Sparkline.tsx b/frontend/src/components/viz/Sparkline.tsx similarity index 100% rename from frontend/src/components/Sparkline.tsx rename to frontend/src/components/viz/Sparkline.tsx diff --git a/frontend/src/components/viz/index.ts b/frontend/src/components/viz/index.ts new file mode 100644 index 00000000..1b402935 --- /dev/null +++ b/frontend/src/components/viz/index.ts @@ -0,0 +1 @@ +export { default as Sparkline } from './Sparkline'; diff --git a/frontend/src/components/AppSidebar.css b/frontend/src/layouts/AppSidebar.css similarity index 100% rename from frontend/src/components/AppSidebar.css rename to frontend/src/layouts/AppSidebar.css diff --git a/frontend/src/components/AppSidebar.tsx b/frontend/src/layouts/AppSidebar.tsx similarity index 100% rename from frontend/src/components/AppSidebar.tsx rename to frontend/src/layouts/AppSidebar.tsx diff --git a/frontend/src/components/HysteriaMasqueradeForm.tsx b/frontend/src/lib/xray/forms/protocols/shared/HysteriaMasqueradeForm.tsx similarity index 98% rename from frontend/src/components/HysteriaMasqueradeForm.tsx rename to frontend/src/lib/xray/forms/protocols/shared/HysteriaMasqueradeForm.tsx index 788ba4bc..26c59847 100644 --- a/frontend/src/components/HysteriaMasqueradeForm.tsx +++ b/frontend/src/lib/xray/forms/protocols/shared/HysteriaMasqueradeForm.tsx @@ -2,7 +2,7 @@ import { useTranslation } from 'react-i18next'; import { Form, Input, InputNumber, Select, Switch } from 'antd'; import type { FormInstance } from 'antd'; -import HeaderMapEditor from '@/components/HeaderMapEditor'; +import { HeaderMapEditor } from '@/components/form'; const MASQ_PATH = ['streamSettings', 'hysteriaSettings', 'masquerade']; diff --git a/frontend/src/lib/xray/forms/protocols/shared/index.ts b/frontend/src/lib/xray/forms/protocols/shared/index.ts new file mode 100644 index 00000000..3b831677 --- /dev/null +++ b/frontend/src/lib/xray/forms/protocols/shared/index.ts @@ -0,0 +1 @@ +export { default as HysteriaMasqueradeForm } from './HysteriaMasqueradeForm'; diff --git a/frontend/src/components/FinalMaskForm.tsx b/frontend/src/lib/xray/forms/transport/FinalMaskForm.tsx similarity index 100% rename from frontend/src/components/FinalMaskForm.tsx rename to frontend/src/lib/xray/forms/transport/FinalMaskForm.tsx diff --git a/frontend/src/lib/xray/forms/transport/index.ts b/frontend/src/lib/xray/forms/transport/index.ts new file mode 100644 index 00000000..d2ab3e39 --- /dev/null +++ b/frontend/src/lib/xray/forms/transport/index.ts @@ -0,0 +1 @@ +export { default as FinalMaskForm } from './FinalMaskForm'; diff --git a/frontend/src/pages/api-docs/ApiDocsPage.tsx b/frontend/src/pages/api-docs/ApiDocsPage.tsx index 8841c707..d2e90c0e 100644 --- a/frontend/src/pages/api-docs/ApiDocsPage.tsx +++ b/frontend/src/pages/api-docs/ApiDocsPage.tsx @@ -4,7 +4,7 @@ import SwaggerUI from 'swagger-ui-react'; import 'swagger-ui-react/swagger-ui.css'; import { useTheme } from '@/hooks/useTheme'; -import AppSidebar from '@/components/AppSidebar'; +import AppSidebar from '@/layouts/AppSidebar'; import './ApiDocsPage.css'; const basePath = window.X_UI_BASE_PATH || ''; diff --git a/frontend/src/pages/clients/ClientBulkAddModal.tsx b/frontend/src/pages/clients/ClientBulkAddModal.tsx index d86e44a9..a317119a 100644 --- a/frontend/src/pages/clients/ClientBulkAddModal.tsx +++ b/frontend/src/pages/clients/ClientBulkAddModal.tsx @@ -7,7 +7,7 @@ import type { Dayjs } from 'dayjs'; import { RandomUtil, SizeFormatter } from '@/utils'; import { TLS_FLOW_CONTROL } from '@/schemas/primitives'; -import DateTimePicker from '@/components/DateTimePicker'; +import { DateTimePicker } from '@/components/form'; import { useClients, type InboundOption } from '@/hooks/useClients'; import { ClientBulkAddFormSchema, type ClientBulkAddFormValues } from '@/schemas/client'; diff --git a/frontend/src/pages/clients/ClientFormModal.tsx b/frontend/src/pages/clients/ClientFormModal.tsx index 4f1f575e..cc953285 100644 --- a/frontend/src/pages/clients/ClientFormModal.tsx +++ b/frontend/src/pages/clients/ClientFormModal.tsx @@ -20,7 +20,7 @@ import dayjs from 'dayjs'; import type { Dayjs } from 'dayjs'; import { HttpUtil, RandomUtil } from '@/utils'; -import DateTimePicker from '@/components/DateTimePicker'; +import { DateTimePicker } from '@/components/form'; import { TLS_FLOW_CONTROL } from '@/schemas/primitives'; import type { ClientRecord, InboundOption } from '@/hooks/useClients'; import { ClientFormSchema, ClientCreateFormSchema } from '@/schemas/client'; diff --git a/frontend/src/pages/clients/ClientInfoModal.tsx b/frontend/src/pages/clients/ClientInfoModal.tsx index f422064e..fd4cb7d8 100644 --- a/frontend/src/pages/clients/ClientInfoModal.tsx +++ b/frontend/src/pages/clients/ClientInfoModal.tsx @@ -7,7 +7,7 @@ import { ClipboardManager, HttpUtil, IntlUtil, SizeFormatter } from '@/utils'; import { useDatepicker } from '@/hooks/useDatepicker'; import type { ClientRecord, InboundOption } from '@/hooks/useClients'; import { isPostQuantumLink } from '@/lib/xray/inbound-link'; -import QrPanel from '@/pages/inbounds/QrPanel'; +import { QrPanel } from '@/pages/inbounds/qr'; import './ClientInfoModal.css'; const PROTOCOL_COLORS: Record = { diff --git a/frontend/src/pages/clients/ClientQrModal.tsx b/frontend/src/pages/clients/ClientQrModal.tsx index 0cd9e56c..da6b11e1 100644 --- a/frontend/src/pages/clients/ClientQrModal.tsx +++ b/frontend/src/pages/clients/ClientQrModal.tsx @@ -3,7 +3,7 @@ import { useTranslation } from 'react-i18next'; import { Collapse, Modal, Spin } from 'antd'; import { HttpUtil } from '@/utils'; import { isPostQuantumLink } from '@/lib/xray/inbound-link'; -import QrPanel from '@/pages/inbounds/QrPanel'; +import { QrPanel } from '@/pages/inbounds/qr'; import type { ClientRecord } from '@/hooks/useClients'; interface SubSettings { diff --git a/frontend/src/pages/clients/ClientsPage.tsx b/frontend/src/pages/clients/ClientsPage.tsx index fc476973..44ca73e7 100644 --- a/frontend/src/pages/clients/ClientsPage.tsx +++ b/frontend/src/pages/clients/ClientsPage.tsx @@ -51,10 +51,10 @@ import { useWebSocket } from '@/hooks/useWebSocket'; import { useClients } from '@/hooks/useClients'; import { useDatepicker } from '@/hooks/useDatepicker'; import type { ClientRecord, InboundOption } from '@/hooks/useClients'; -import AppSidebar from '@/components/AppSidebar'; +import AppSidebar from '@/layouts/AppSidebar'; import { IntlUtil, SizeFormatter } from '@/utils'; import { setMessageInstance } from '@/utils/messageBus'; -import LazyMount from '@/components/LazyMount'; +import { LazyMount } from '@/components/utility'; const ClientFormModal = lazy(() => import('./ClientFormModal')); const ClientInfoModal = lazy(() => import('./ClientInfoModal')); const ClientQrModal = lazy(() => import('./ClientQrModal')); diff --git a/frontend/src/pages/groups/GroupsPage.tsx b/frontend/src/pages/groups/GroupsPage.tsx index 12690c0f..4b1882cd 100644 --- a/frontend/src/pages/groups/GroupsPage.tsx +++ b/frontend/src/pages/groups/GroupsPage.tsx @@ -42,8 +42,8 @@ import { usePageTitle } from '@/hooks/usePageTitle'; import { useClients } from '@/hooks/useClients'; import { HttpUtil } from '@/utils'; import { setMessageInstance } from '@/utils/messageBus'; -import AppSidebar from '@/components/AppSidebar'; -import LazyMount from '@/components/LazyMount'; +import AppSidebar from '@/layouts/AppSidebar'; +import { LazyMount } from '@/components/utility'; import { keys } from '@/api/queryKeys'; import { ClientRecordSchema, diff --git a/frontend/src/pages/inbounds/InboundsPage.tsx b/frontend/src/pages/inbounds/InboundsPage.tsx index 1592a536..eca49ac7 100644 --- a/frontend/src/pages/inbounds/InboundsPage.tsx +++ b/frontend/src/pages/inbounds/InboundsPage.tsx @@ -28,19 +28,19 @@ import { useTheme } from '@/hooks/useTheme'; import { useMediaQuery } from '@/hooks/useMediaQuery'; import { useWebSocket } from '@/hooks/useWebSocket'; import { useNodesQuery } from '@/api/queries/useNodesQuery'; -import AppSidebar from '@/components/AppSidebar'; -const TextModal = lazy(() => import('@/components/TextModal')); -const PromptModal = lazy(() => import('@/components/PromptModal')); +import AppSidebar from '@/layouts/AppSidebar'; +const TextModal = lazy(() => import('@/components/feedback/TextModal')); +const PromptModal = lazy(() => import('@/components/feedback/PromptModal')); import { useInbounds } from './useInbounds'; -import InboundList from './InboundList'; -import LazyMount from '@/components/LazyMount'; -const InboundFormModal = lazy(() => import('./InboundFormModal')); -const InboundInfoModal = lazy(() => import('./InboundInfoModal')); -const QrCodeModal = lazy(() => import('./QrCodeModal')); -const AttachClientsModal = lazy(() => import('./AttachClientsModal')); -const DetachClientsModal = lazy(() => import('./DetachClientsModal')); -const AddClientsToGroupModal = lazy(() => import('./AddClientsToGroupModal')); +import { InboundList } from './list'; +import { LazyMount } from '@/components/utility'; +const InboundFormModal = lazy(() => import('./form/InboundFormModal')); +const InboundInfoModal = lazy(() => import('./info/InboundInfoModal')); +const QrCodeModal = lazy(() => import('./qr/QrCodeModal')); +const AttachClientsModal = lazy(() => import('./clients/AttachClientsModal')); +const DetachClientsModal = lazy(() => import('./clients/DetachClientsModal')); +const AddClientsToGroupModal = lazy(() => import('./clients/AddClientsToGroupModal')); type RowAction = | 'edit' diff --git a/frontend/src/pages/inbounds/AddClientsToGroupModal.tsx b/frontend/src/pages/inbounds/clients/AddClientsToGroupModal.tsx similarity index 100% rename from frontend/src/pages/inbounds/AddClientsToGroupModal.tsx rename to frontend/src/pages/inbounds/clients/AddClientsToGroupModal.tsx diff --git a/frontend/src/pages/inbounds/AttachClientsModal.tsx b/frontend/src/pages/inbounds/clients/AttachClientsModal.tsx similarity index 99% rename from frontend/src/pages/inbounds/AttachClientsModal.tsx rename to frontend/src/pages/inbounds/clients/AttachClientsModal.tsx index bbf6f414..1c1308a5 100644 --- a/frontend/src/pages/inbounds/AttachClientsModal.tsx +++ b/frontend/src/pages/inbounds/clients/AttachClientsModal.tsx @@ -5,7 +5,7 @@ import type { ColumnsType } from 'antd/es/table'; import { HttpUtil } from '@/utils'; import { coerceInboundJsonField, type DBInbound } from '@/models/dbinbound'; -import { isInboundMultiUser } from './InboundList'; +import { isInboundMultiUser } from '../list'; interface AttachClientsModalProps { open: boolean; diff --git a/frontend/src/pages/inbounds/DetachClientsModal.tsx b/frontend/src/pages/inbounds/clients/DetachClientsModal.tsx similarity index 100% rename from frontend/src/pages/inbounds/DetachClientsModal.tsx rename to frontend/src/pages/inbounds/clients/DetachClientsModal.tsx diff --git a/frontend/src/pages/inbounds/clients/index.ts b/frontend/src/pages/inbounds/clients/index.ts new file mode 100644 index 00000000..11bb410d --- /dev/null +++ b/frontend/src/pages/inbounds/clients/index.ts @@ -0,0 +1,3 @@ +export { default as AttachClientsModal } from './AttachClientsModal'; +export { default as DetachClientsModal } from './DetachClientsModal'; +export { default as AddClientsToGroupModal } from './AddClientsToGroupModal'; diff --git a/frontend/src/pages/inbounds/InboundFormModal.css b/frontend/src/pages/inbounds/form/InboundFormModal.css similarity index 100% rename from frontend/src/pages/inbounds/InboundFormModal.css rename to frontend/src/pages/inbounds/form/InboundFormModal.css diff --git a/frontend/src/pages/inbounds/InboundFormModal.tsx b/frontend/src/pages/inbounds/form/InboundFormModal.tsx similarity index 99% rename from frontend/src/pages/inbounds/InboundFormModal.tsx rename to frontend/src/pages/inbounds/form/InboundFormModal.tsx index 609717bf..6216cd5e 100644 --- a/frontend/src/pages/inbounds/InboundFormModal.tsx +++ b/frontend/src/pages/inbounds/form/InboundFormModal.tsx @@ -80,12 +80,12 @@ import { WsStreamSettingsSchema } from '@/schemas/protocols/stream/ws'; import { GrpcStreamSettingsSchema } from '@/schemas/protocols/stream/grpc'; import { HttpUpgradeStreamSettingsSchema } from '@/schemas/protocols/stream/httpupgrade'; import { XHttpStreamSettingsSchema } from '@/schemas/protocols/stream/xhttp'; -import DateTimePicker from '@/components/DateTimePicker'; -import FinalMaskForm from '@/components/FinalMaskForm'; -import HeaderMapEditor from '@/components/HeaderMapEditor'; -import HysteriaMasqueradeForm from '@/components/HysteriaMasqueradeForm'; -import InputAddon from '@/components/InputAddon'; -import JsonEditor from '@/components/JsonEditor'; +import { DateTimePicker } from '@/components/form'; +import { FinalMaskForm } from '@/lib/xray/forms/transport'; +import { HeaderMapEditor } from '@/components/form'; +import { HysteriaMasqueradeForm } from '@/lib/xray/forms/protocols/shared'; +import { InputAddon } from '@/components/ui'; +import { JsonEditor } from '@/components/form'; import './InboundFormModal.css'; import type { FormInstance } from 'antd'; import type { NamePath } from 'antd/es/form/interface'; diff --git a/frontend/src/pages/inbounds/form/index.ts b/frontend/src/pages/inbounds/form/index.ts new file mode 100644 index 00000000..2cc83712 --- /dev/null +++ b/frontend/src/pages/inbounds/form/index.ts @@ -0,0 +1 @@ +export { default as InboundFormModal } from './InboundFormModal'; diff --git a/frontend/src/pages/inbounds/InboundInfoModal.css b/frontend/src/pages/inbounds/info/InboundInfoModal.css similarity index 100% rename from frontend/src/pages/inbounds/InboundInfoModal.css rename to frontend/src/pages/inbounds/info/InboundInfoModal.css diff --git a/frontend/src/pages/inbounds/InboundInfoModal.tsx b/frontend/src/pages/inbounds/info/InboundInfoModal.tsx similarity index 99% rename from frontend/src/pages/inbounds/InboundInfoModal.tsx rename to frontend/src/pages/inbounds/info/InboundInfoModal.tsx index b8e05fa0..e34fa4da 100644 --- a/frontend/src/pages/inbounds/InboundInfoModal.tsx +++ b/frontend/src/pages/inbounds/info/InboundInfoModal.tsx @@ -13,7 +13,7 @@ import { FileManager, } from '@/utils'; import { Protocols } from '@/schemas/primitives'; -import InfinityIcon from '@/components/InfinityIcon'; +import { InfinityIcon } from '@/components/ui'; import { useDatepicker } from '@/hooks/useDatepicker'; import { coerceInboundJsonField } from '@/models/dbinbound'; import { @@ -27,7 +27,7 @@ import { genWireguardLinks, } from '@/lib/xray/inbound-link'; import { inboundFromDb } from '@/lib/xray/inbound-from-db'; -import type { SubSettings } from './useInbounds'; +import type { SubSettings } from '../useInbounds'; import './InboundInfoModal.css'; const LINK_PROTOCOLS: ReadonlySet = new Set([ diff --git a/frontend/src/pages/inbounds/info/index.ts b/frontend/src/pages/inbounds/info/index.ts new file mode 100644 index 00000000..2355abb8 --- /dev/null +++ b/frontend/src/pages/inbounds/info/index.ts @@ -0,0 +1 @@ +export { default as InboundInfoModal } from './InboundInfoModal'; diff --git a/frontend/src/pages/inbounds/InboundList.css b/frontend/src/pages/inbounds/list/InboundList.css similarity index 100% rename from frontend/src/pages/inbounds/InboundList.css rename to frontend/src/pages/inbounds/list/InboundList.css diff --git a/frontend/src/pages/inbounds/InboundList.tsx b/frontend/src/pages/inbounds/list/InboundList.tsx similarity index 99% rename from frontend/src/pages/inbounds/InboundList.tsx rename to frontend/src/pages/inbounds/list/InboundList.tsx index 261f437e..b1b08cc1 100644 --- a/frontend/src/pages/inbounds/InboundList.tsx +++ b/frontend/src/pages/inbounds/list/InboundList.tsx @@ -34,7 +34,7 @@ import { } from '@ant-design/icons'; import { HttpUtil, SizeFormatter, IntlUtil, ColorUtils } from '@/utils'; -import InfinityIcon from '@/components/InfinityIcon'; +import { InfinityIcon } from '@/components/ui'; import { useDatepicker } from '@/hooks/useDatepicker'; import type { NodeRecord } from '@/api/queries/useNodesQuery'; import { isSSMultiUser } from '@/lib/xray/protocol-capabilities'; diff --git a/frontend/src/pages/inbounds/list/index.ts b/frontend/src/pages/inbounds/list/index.ts new file mode 100644 index 00000000..96c54429 --- /dev/null +++ b/frontend/src/pages/inbounds/list/index.ts @@ -0,0 +1 @@ +export { default as InboundList, isInboundMultiUser } from './InboundList'; diff --git a/frontend/src/pages/inbounds/QrCodeModal.tsx b/frontend/src/pages/inbounds/qr/QrCodeModal.tsx similarity index 98% rename from frontend/src/pages/inbounds/QrCodeModal.tsx rename to frontend/src/pages/inbounds/qr/QrCodeModal.tsx index 3894d543..11a1711e 100644 --- a/frontend/src/pages/inbounds/QrCodeModal.tsx +++ b/frontend/src/pages/inbounds/qr/QrCodeModal.tsx @@ -12,7 +12,7 @@ import { } from '@/lib/xray/inbound-link'; import { inboundFromDb, type DbInboundLike } from '@/lib/xray/inbound-from-db'; import QrPanel from './QrPanel'; -import type { SubSettings } from './useInbounds'; +import type { SubSettings } from '../useInbounds'; interface ClientSetting { email?: string; diff --git a/frontend/src/pages/inbounds/QrPanel.css b/frontend/src/pages/inbounds/qr/QrPanel.css similarity index 100% rename from frontend/src/pages/inbounds/QrPanel.css rename to frontend/src/pages/inbounds/qr/QrPanel.css diff --git a/frontend/src/pages/inbounds/QrPanel.tsx b/frontend/src/pages/inbounds/qr/QrPanel.tsx similarity index 100% rename from frontend/src/pages/inbounds/QrPanel.tsx rename to frontend/src/pages/inbounds/qr/QrPanel.tsx diff --git a/frontend/src/pages/inbounds/qr/index.ts b/frontend/src/pages/inbounds/qr/index.ts new file mode 100644 index 00000000..03515b0b --- /dev/null +++ b/frontend/src/pages/inbounds/qr/index.ts @@ -0,0 +1,2 @@ +export { default as QrPanel } from './QrPanel'; +export { default as QrCodeModal } from './QrCodeModal'; diff --git a/frontend/src/pages/index/IndexPage.tsx b/frontend/src/pages/index/IndexPage.tsx index b6461194..759f3127 100644 --- a/frontend/src/pages/index/IndexPage.tsx +++ b/frontend/src/pages/index/IndexPage.tsx @@ -39,13 +39,13 @@ import { HttpUtil, SizeFormatter, TimeFormatter, ClipboardManager, FileManager } import { useTheme } from '@/hooks/useTheme'; import { useStatusQuery } from '@/api/queries/useStatusQuery'; import { useMediaQuery } from '@/hooks/useMediaQuery'; -import AppSidebar from '@/components/AppSidebar'; -import LazyMount from '@/components/LazyMount'; +import AppSidebar from '@/layouts/AppSidebar'; +import { LazyMount } from '@/components/utility'; import { setMessageInstance } from '@/utils/messageBus'; import StatusCard from './StatusCard'; import XrayStatusCard from './XrayStatusCard'; import type { PanelUpdateInfo } from './PanelUpdateModal'; -const JsonEditor = lazy(() => import('@/components/JsonEditor')); +const JsonEditor = lazy(() => import('@/components/form/JsonEditor')); const PanelUpdateModal = lazy(() => import('./PanelUpdateModal')); const LogModal = lazy(() => import('./LogModal')); const BackupModal = lazy(() => import('./BackupModal')); diff --git a/frontend/src/pages/index/SystemHistoryModal.tsx b/frontend/src/pages/index/SystemHistoryModal.tsx index b5abf2cb..9c03b741 100644 --- a/frontend/src/pages/index/SystemHistoryModal.tsx +++ b/frontend/src/pages/index/SystemHistoryModal.tsx @@ -3,7 +3,7 @@ import { useTranslation } from 'react-i18next'; import { Modal, Select, Tabs } from 'antd'; import { HttpUtil, SizeFormatter } from '@/utils'; -import Sparkline from '@/components/Sparkline'; +import { Sparkline } from '@/components/viz'; import { useMediaQuery } from '@/hooks/useMediaQuery'; import type { Status } from '@/models/status'; import './SystemHistoryModal.css'; diff --git a/frontend/src/pages/index/XrayMetricsModal.tsx b/frontend/src/pages/index/XrayMetricsModal.tsx index 4d4b2eea..5f1902fd 100644 --- a/frontend/src/pages/index/XrayMetricsModal.tsx +++ b/frontend/src/pages/index/XrayMetricsModal.tsx @@ -3,7 +3,7 @@ import { useTranslation } from 'react-i18next'; import { Alert, Modal, Select, Tabs, Tag } from 'antd'; import { HttpUtil, Msg, SizeFormatter } from '@/utils'; -import Sparkline from '@/components/Sparkline'; +import { Sparkline } from '@/components/viz'; import { useMediaQuery } from '@/hooks/useMediaQuery'; import './XrayMetricsModal.css'; diff --git a/frontend/src/pages/nodes/NodeHistoryPanel.tsx b/frontend/src/pages/nodes/NodeHistoryPanel.tsx index 7f6d778a..c84dfb78 100644 --- a/frontend/src/pages/nodes/NodeHistoryPanel.tsx +++ b/frontend/src/pages/nodes/NodeHistoryPanel.tsx @@ -1,7 +1,7 @@ import { useEffect, useRef, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { HttpUtil } from '@/utils'; -import Sparkline from '@/components/Sparkline'; +import { Sparkline } from '@/components/viz'; import './NodeHistoryPanel.css'; interface NodeRef { diff --git a/frontend/src/pages/nodes/NodesPage.tsx b/frontend/src/pages/nodes/NodesPage.tsx index 5a3477b2..6808ee9d 100644 --- a/frontend/src/pages/nodes/NodesPage.tsx +++ b/frontend/src/pages/nodes/NodesPage.tsx @@ -13,7 +13,7 @@ import { useMediaQuery } from '@/hooks/useMediaQuery'; import { useNodesQuery } from '@/api/queries/useNodesQuery'; import type { NodeRecord } from '@/api/queries/useNodesQuery'; import { useNodeMutations } from '@/api/queries/useNodeMutations'; -import AppSidebar from '@/components/AppSidebar'; +import AppSidebar from '@/layouts/AppSidebar'; import NodeList from './NodeList'; import NodeFormModal from './NodeFormModal'; import { setMessageInstance } from '@/utils/messageBus'; diff --git a/frontend/src/pages/settings/GeneralTab.tsx b/frontend/src/pages/settings/GeneralTab.tsx index ff7ed102..bd177e8c 100644 --- a/frontend/src/pages/settings/GeneralTab.tsx +++ b/frontend/src/pages/settings/GeneralTab.tsx @@ -10,7 +10,7 @@ import { } from 'antd'; import type { AllSetting } from '@/models/setting'; import { HttpUtil, LanguageManager } from '@/utils'; -import SettingListItem from '@/components/SettingListItem'; +import { SettingListItem } from '@/components/ui'; interface ApiMsg { success?: boolean; diff --git a/frontend/src/pages/settings/SecurityTab.tsx b/frontend/src/pages/settings/SecurityTab.tsx index d3e73d68..c83dc720 100644 --- a/frontend/src/pages/settings/SecurityTab.tsx +++ b/frontend/src/pages/settings/SecurityTab.tsx @@ -14,7 +14,7 @@ import { } from 'antd'; import { ClipboardManager, HttpUtil, RandomUtil } from '@/utils'; import type { AllSetting } from '@/models/setting'; -import SettingListItem from '@/components/SettingListItem'; +import { SettingListItem } from '@/components/ui'; import TwoFactorModal from './TwoFactorModal'; import './SecurityTab.css'; diff --git a/frontend/src/pages/settings/SettingsPage.tsx b/frontend/src/pages/settings/SettingsPage.tsx index 26376e00..13896410 100644 --- a/frontend/src/pages/settings/SettingsPage.tsx +++ b/frontend/src/pages/settings/SettingsPage.tsx @@ -30,7 +30,7 @@ import { useTheme } from '@/hooks/useTheme'; import { useMediaQuery } from '@/hooks/useMediaQuery'; import { useAllSettings } from '@/api/queries/useAllSettings'; import { AllSettingSchema } from '@/schemas/setting'; -import AppSidebar from '@/components/AppSidebar'; +import AppSidebar from '@/layouts/AppSidebar'; import GeneralTab from './GeneralTab'; import SecurityTab from './SecurityTab'; import TelegramTab from './TelegramTab'; diff --git a/frontend/src/pages/settings/SubscriptionFormatsTab.tsx b/frontend/src/pages/settings/SubscriptionFormatsTab.tsx index 3265c50b..acc20bdc 100644 --- a/frontend/src/pages/settings/SubscriptionFormatsTab.tsx +++ b/frontend/src/pages/settings/SubscriptionFormatsTab.tsx @@ -10,7 +10,7 @@ import { Switch, } from 'antd'; import type { AllSetting } from '@/models/setting'; -import SettingListItem from '@/components/SettingListItem'; +import { SettingListItem } from '@/components/ui'; import './SubscriptionFormatsTab.css'; interface SubscriptionFormatsTabProps { diff --git a/frontend/src/pages/settings/SubscriptionGeneralTab.tsx b/frontend/src/pages/settings/SubscriptionGeneralTab.tsx index 68a9fa5a..cc5143c7 100644 --- a/frontend/src/pages/settings/SubscriptionGeneralTab.tsx +++ b/frontend/src/pages/settings/SubscriptionGeneralTab.tsx @@ -1,7 +1,7 @@ import { Collapse, Divider, Input, InputNumber, Switch } from 'antd'; import { useTranslation } from 'react-i18next'; import type { AllSetting } from '@/models/setting'; -import SettingListItem from '@/components/SettingListItem'; +import { SettingListItem } from '@/components/ui'; interface SubscriptionGeneralTabProps { allSetting: AllSetting; diff --git a/frontend/src/pages/settings/TelegramTab.tsx b/frontend/src/pages/settings/TelegramTab.tsx index 99da5b00..316d5997 100644 --- a/frontend/src/pages/settings/TelegramTab.tsx +++ b/frontend/src/pages/settings/TelegramTab.tsx @@ -3,7 +3,7 @@ import { useTranslation } from 'react-i18next'; import { Collapse, Input, InputNumber, Select, Switch } from 'antd'; import { LanguageManager } from '@/utils'; import type { AllSetting } from '@/models/setting'; -import SettingListItem from '@/components/SettingListItem'; +import { SettingListItem } from '@/components/ui'; interface TelegramTabProps { allSetting: AllSetting; diff --git a/frontend/src/pages/xray/XrayPage.tsx b/frontend/src/pages/xray/XrayPage.tsx index f3b86317..d7c5f347 100644 --- a/frontend/src/pages/xray/XrayPage.tsx +++ b/frontend/src/pages/xray/XrayPage.tsx @@ -33,17 +33,16 @@ import { useTheme } from '@/hooks/useTheme'; import { useMediaQuery } from '@/hooks/useMediaQuery'; import { useXraySetting } from '@/hooks/useXraySetting'; import type { XraySettingsValue } from '@/hooks/useXraySetting'; -import AppSidebar from '@/components/AppSidebar'; -import JsonEditor from '@/components/JsonEditor'; +import AppSidebar from '@/layouts/AppSidebar'; +import { JsonEditor } from '@/components/form'; import { setMessageInstance } from '@/utils/messageBus'; -import BasicsTab from './BasicsTab'; -import RoutingTab from './RoutingTab'; -import OutboundsTab from './OutboundsTab'; -import BalancersTab from './BalancersTab'; -import DnsTab from './DnsTab'; -import WarpModal from './WarpModal'; -import NordModal from './NordModal'; +import { BasicsTab } from './basics'; +import { RoutingTab } from './routing'; +import { OutboundsTab } from './outbounds'; +import { BalancersTab } from './balancers'; +import { DnsTab } from './dns'; +import { WarpModal, NordModal } from './overrides'; import './XrayPage.css'; const TAB_KEYS = ['tpl-basic', 'tpl-routing', 'tpl-outbound', 'tpl-balancer', 'tpl-dns', 'tpl-advanced']; diff --git a/frontend/src/pages/xray/BalancerFormModal.tsx b/frontend/src/pages/xray/balancers/BalancerFormModal.tsx similarity index 99% rename from frontend/src/pages/xray/BalancerFormModal.tsx rename to frontend/src/pages/xray/balancers/BalancerFormModal.tsx index db6aa917..446364c9 100644 --- a/frontend/src/pages/xray/BalancerFormModal.tsx +++ b/frontend/src/pages/xray/balancers/BalancerFormModal.tsx @@ -3,7 +3,7 @@ import { useTranslation } from 'react-i18next'; import { Button, Form, Input, InputNumber, Modal, Select, Space, Switch } from 'antd'; import { MinusOutlined, PlusOutlined } from '@ant-design/icons'; -import InputAddon from '@/components/InputAddon'; +import { InputAddon } from '@/components/ui'; import { BalancerFormSchema, type BalancerFormValues, diff --git a/frontend/src/pages/xray/BalancersTab.tsx b/frontend/src/pages/xray/balancers/BalancersTab.tsx similarity index 99% rename from frontend/src/pages/xray/BalancersTab.tsx rename to frontend/src/pages/xray/balancers/BalancersTab.tsx index d2fe3019..8a6a71ce 100644 --- a/frontend/src/pages/xray/BalancersTab.tsx +++ b/frontend/src/pages/xray/balancers/BalancersTab.tsx @@ -6,7 +6,7 @@ import type { ColumnsType } from 'antd/es/table'; import BalancerFormModal from './BalancerFormModal'; import type { BalancerFormValue } from './BalancerFormModal'; -import JsonEditor from '@/components/JsonEditor'; +import { JsonEditor } from '@/components/form'; import type { XraySettingsValue, SetTemplate } from '@/hooks/useXraySetting'; import type { BalancerObject, diff --git a/frontend/src/pages/xray/balancers/index.ts b/frontend/src/pages/xray/balancers/index.ts new file mode 100644 index 00000000..a06709b7 --- /dev/null +++ b/frontend/src/pages/xray/balancers/index.ts @@ -0,0 +1,2 @@ +export { default as BalancersTab } from './BalancersTab'; +export { default as BalancerFormModal } from './BalancerFormModal'; diff --git a/frontend/src/pages/xray/BasicsTab.css b/frontend/src/pages/xray/basics/BasicsTab.css similarity index 100% rename from frontend/src/pages/xray/BasicsTab.css rename to frontend/src/pages/xray/basics/BasicsTab.css diff --git a/frontend/src/pages/xray/BasicsTab.tsx b/frontend/src/pages/xray/basics/BasicsTab.tsx similarity index 99% rename from frontend/src/pages/xray/BasicsTab.tsx rename to frontend/src/pages/xray/basics/BasicsTab.tsx index c9a6a648..13d208a2 100644 --- a/frontend/src/pages/xray/BasicsTab.tsx +++ b/frontend/src/pages/xray/basics/BasicsTab.tsx @@ -4,7 +4,7 @@ import { Alert, Button, Collapse, Input, Modal, Select, Space, Switch } from 'an import { CloudOutlined, ApiOutlined } from '@ant-design/icons'; import { OutboundDomainStrategies } from '@/schemas/primitives'; -import SettingListItem from '@/components/SettingListItem'; +import { SettingListItem } from '@/components/ui'; import type { XraySettingsValue, SetTemplate } from '@/hooks/useXraySetting'; import './BasicsTab.css'; diff --git a/frontend/src/pages/xray/basics/index.ts b/frontend/src/pages/xray/basics/index.ts new file mode 100644 index 00000000..b5ee0c01 --- /dev/null +++ b/frontend/src/pages/xray/basics/index.ts @@ -0,0 +1 @@ +export { default as BasicsTab } from './BasicsTab'; diff --git a/frontend/src/pages/xray/DnsPresetsModal.css b/frontend/src/pages/xray/dns/DnsPresetsModal.css similarity index 100% rename from frontend/src/pages/xray/DnsPresetsModal.css rename to frontend/src/pages/xray/dns/DnsPresetsModal.css diff --git a/frontend/src/pages/xray/DnsPresetsModal.tsx b/frontend/src/pages/xray/dns/DnsPresetsModal.tsx similarity index 100% rename from frontend/src/pages/xray/DnsPresetsModal.tsx rename to frontend/src/pages/xray/dns/DnsPresetsModal.tsx diff --git a/frontend/src/pages/xray/DnsServerModal.tsx b/frontend/src/pages/xray/dns/DnsServerModal.tsx similarity index 99% rename from frontend/src/pages/xray/DnsServerModal.tsx rename to frontend/src/pages/xray/dns/DnsServerModal.tsx index a625d617..594180e9 100644 --- a/frontend/src/pages/xray/DnsServerModal.tsx +++ b/frontend/src/pages/xray/dns/DnsServerModal.tsx @@ -3,7 +3,7 @@ import { useTranslation } from 'react-i18next'; import { Button, Divider, Form, Input, InputNumber, Modal, Select, Space, Switch } from 'antd'; import { MinusOutlined, PlusOutlined } from '@ant-design/icons'; -import InputAddon from '@/components/InputAddon'; +import { InputAddon } from '@/components/ui'; import { DnsQueryStrategySchema, DnsServerObjectInnerSchema, diff --git a/frontend/src/pages/xray/DnsTab.css b/frontend/src/pages/xray/dns/DnsTab.css similarity index 100% rename from frontend/src/pages/xray/DnsTab.css rename to frontend/src/pages/xray/dns/DnsTab.css diff --git a/frontend/src/pages/xray/DnsTab.tsx b/frontend/src/pages/xray/dns/DnsTab.tsx similarity index 99% rename from frontend/src/pages/xray/DnsTab.tsx rename to frontend/src/pages/xray/dns/DnsTab.tsx index 17a8fc4a..8ef3f9e4 100644 --- a/frontend/src/pages/xray/DnsTab.tsx +++ b/frontend/src/pages/xray/dns/DnsTab.tsx @@ -4,7 +4,7 @@ import { Button, Collapse, Dropdown, Empty, Input, InputNumber, Modal, Select, S import { PlusOutlined, MoreOutlined, EditOutlined, DeleteOutlined, MenuOutlined } from '@ant-design/icons'; import type { ColumnsType } from 'antd/es/table'; -import SettingListItem from '@/components/SettingListItem'; +import { SettingListItem } from '@/components/ui'; import DnsServerModal from './DnsServerModal'; import type { DnsServerValue } from './DnsServerModal'; import DnsPresetsModal from './DnsPresetsModal'; diff --git a/frontend/src/pages/xray/dns/index.ts b/frontend/src/pages/xray/dns/index.ts new file mode 100644 index 00000000..19ba6c56 --- /dev/null +++ b/frontend/src/pages/xray/dns/index.ts @@ -0,0 +1,3 @@ +export { default as DnsTab } from './DnsTab'; +export { default as DnsServerModal } from './DnsServerModal'; +export { default as DnsPresetsModal } from './DnsPresetsModal'; diff --git a/frontend/src/pages/xray/OutboundFormModal.css b/frontend/src/pages/xray/outbounds/OutboundFormModal.css similarity index 100% rename from frontend/src/pages/xray/OutboundFormModal.css rename to frontend/src/pages/xray/outbounds/OutboundFormModal.css diff --git a/frontend/src/pages/xray/OutboundFormModal.tsx b/frontend/src/pages/xray/outbounds/OutboundFormModal.tsx similarity index 99% rename from frontend/src/pages/xray/OutboundFormModal.tsx rename to frontend/src/pages/xray/outbounds/OutboundFormModal.tsx index cf384887..c56661c4 100644 --- a/frontend/src/pages/xray/OutboundFormModal.tsx +++ b/frontend/src/pages/xray/outbounds/OutboundFormModal.tsx @@ -15,11 +15,11 @@ import { } from 'antd'; import { DeleteOutlined, MinusOutlined, PlusOutlined, ReloadOutlined } from '@ant-design/icons'; -import FinalMaskForm from '@/components/FinalMaskForm'; -import HeaderMapEditor from '@/components/HeaderMapEditor'; -import HysteriaMasqueradeForm from '@/components/HysteriaMasqueradeForm'; -import InputAddon from '@/components/InputAddon'; -import JsonEditor from '@/components/JsonEditor'; +import { FinalMaskForm } from '@/lib/xray/forms/transport'; +import { HeaderMapEditor } from '@/components/form'; +import { HysteriaMasqueradeForm } from '@/lib/xray/forms/protocols/shared'; +import { InputAddon } from '@/components/ui'; +import { JsonEditor } from '@/components/form'; import { Wireguard } from '@/utils'; import { XMUX_DEFAULTS, diff --git a/frontend/src/pages/xray/OutboundsTab.css b/frontend/src/pages/xray/outbounds/OutboundsTab.css similarity index 100% rename from frontend/src/pages/xray/OutboundsTab.css rename to frontend/src/pages/xray/outbounds/OutboundsTab.css diff --git a/frontend/src/pages/xray/OutboundsTab.tsx b/frontend/src/pages/xray/outbounds/OutboundsTab.tsx similarity index 100% rename from frontend/src/pages/xray/OutboundsTab.tsx rename to frontend/src/pages/xray/outbounds/OutboundsTab.tsx diff --git a/frontend/src/pages/xray/outbounds/index.ts b/frontend/src/pages/xray/outbounds/index.ts new file mode 100644 index 00000000..30edc9b6 --- /dev/null +++ b/frontend/src/pages/xray/outbounds/index.ts @@ -0,0 +1,2 @@ +export { default as OutboundsTab } from './OutboundsTab'; +export { default as OutboundFormModal } from './OutboundFormModal'; diff --git a/frontend/src/pages/xray/NordModal.css b/frontend/src/pages/xray/overrides/NordModal.css similarity index 100% rename from frontend/src/pages/xray/NordModal.css rename to frontend/src/pages/xray/overrides/NordModal.css diff --git a/frontend/src/pages/xray/NordModal.tsx b/frontend/src/pages/xray/overrides/NordModal.tsx similarity index 100% rename from frontend/src/pages/xray/NordModal.tsx rename to frontend/src/pages/xray/overrides/NordModal.tsx diff --git a/frontend/src/pages/xray/WarpModal.css b/frontend/src/pages/xray/overrides/WarpModal.css similarity index 100% rename from frontend/src/pages/xray/WarpModal.css rename to frontend/src/pages/xray/overrides/WarpModal.css diff --git a/frontend/src/pages/xray/WarpModal.tsx b/frontend/src/pages/xray/overrides/WarpModal.tsx similarity index 100% rename from frontend/src/pages/xray/WarpModal.tsx rename to frontend/src/pages/xray/overrides/WarpModal.tsx diff --git a/frontend/src/pages/xray/overrides/index.ts b/frontend/src/pages/xray/overrides/index.ts new file mode 100644 index 00000000..6dc62617 --- /dev/null +++ b/frontend/src/pages/xray/overrides/index.ts @@ -0,0 +1,2 @@ +export { default as WarpModal } from './WarpModal'; +export { default as NordModal } from './NordModal'; diff --git a/frontend/src/pages/xray/RoutingTab.css b/frontend/src/pages/xray/routing/RoutingTab.css similarity index 100% rename from frontend/src/pages/xray/RoutingTab.css rename to frontend/src/pages/xray/routing/RoutingTab.css diff --git a/frontend/src/pages/xray/RoutingTab.tsx b/frontend/src/pages/xray/routing/RoutingTab.tsx similarity index 100% rename from frontend/src/pages/xray/RoutingTab.tsx rename to frontend/src/pages/xray/routing/RoutingTab.tsx diff --git a/frontend/src/pages/xray/RuleFormModal.tsx b/frontend/src/pages/xray/routing/RuleFormModal.tsx similarity index 99% rename from frontend/src/pages/xray/RuleFormModal.tsx rename to frontend/src/pages/xray/routing/RuleFormModal.tsx index 5d639111..cf545c26 100644 --- a/frontend/src/pages/xray/RuleFormModal.tsx +++ b/frontend/src/pages/xray/routing/RuleFormModal.tsx @@ -2,7 +2,7 @@ import { useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { Button, Form, Input, Modal, Select, Space, Tooltip } from 'antd'; import { PlusOutlined, MinusOutlined, QuestionCircleOutlined } from '@ant-design/icons'; -import InputAddon from '@/components/InputAddon'; +import { InputAddon } from '@/components/ui'; import { RuleFormSchema, type RuleFormValues } from '@/schemas/xray'; export interface RoutingRule { diff --git a/frontend/src/pages/xray/routing/index.ts b/frontend/src/pages/xray/routing/index.ts new file mode 100644 index 00000000..f05b5f8e --- /dev/null +++ b/frontend/src/pages/xray/routing/index.ts @@ -0,0 +1,2 @@ +export { default as RoutingTab } from './RoutingTab'; +export { default as RuleFormModal } from './RuleFormModal';