diff --git a/src/App.tsx b/src/App.tsx index 342f89d..1946df6 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -18,10 +18,11 @@ import { EdgeMouseHandler } from '@xyflow/react'; import '@xyflow/react/dist/style.css'; -import { AppNode, AppEdge, NodeData, EdgeData, Settings } from './types/graph'; +import { AppNode, AppEdge, NodeData, EdgeData, NodeDataUpdate, EdgeDataUpdate, Settings } from './types/graph'; import CustomNode from './components/CustomNode'; import NodeEditor from './components/NodeEditor'; import EdgeEditor from './components/EdgeEditor' +import SettingsEditor from './components/SettingsEditor' import Toggle from "./components/Toggle" import { generateWireGuardPrivateKey } from './utils/wireguardConfig'; import './App.css'; @@ -55,6 +56,7 @@ function FlowContent(): ReactNode { const [editingNode, setEditingNode] = useState(undefined); const [editingEdge, setEditingEdge] = useState(undefined); const [enableTwoWay, setEnableTwoWay] = useState(false); + const [editSettings, setEditSettings] = useState(false); const onNodesChange = useCallback( (changes: NodeChange[]) => setNodes((nds) => applyNodeChanges(changes, nds)), @@ -118,28 +120,26 @@ function FlowContent(): ReactNode { setNodes((prev) => [...prev.map(node => ({ ...node, selected: false })), newNode]); }; - const handleUpdateNode = (updatedData: NodeData): void => { + const handleUpdateNode = (updatedData: NodeDataUpdate): void => { setNodes((prev) => prev.map((node) => { if (node.data.id === editingNode?.id) { - return { ...node, data: updatedData }; + node.data = {...node.data, ...updatedData} } return node; }) ); - setEditingNode(undefined); }; - const handleUpdateEdge = (updatedData: EdgeData): void => { + const handleUpdateEdge = (updatedData: EdgeDataUpdate): void => { setEdges((prev) => prev.map((edge) => { if (edge.data && edge.data.id === editingEdge?.id) { - return { ...edge, data: updatedData }; + edge.data = {...edge.data, ...updatedData} } return edge; }) ); - setEditingNode(undefined); }; return ( @@ -180,7 +180,7 @@ function FlowContent(): ReactNode { ➕ 添加节点 - @@ -203,6 +203,14 @@ function FlowContent(): ReactNode { onClose={() => setEditingEdge(undefined)} /> )} + + {editSettings && ( + {}} + onClose={() => setEditSettings(false)} + /> + )} ); diff --git a/src/components/SettingsEditor.tsx b/src/components/SettingsEditor.tsx new file mode 100644 index 0000000..b641102 --- /dev/null +++ b/src/components/SettingsEditor.tsx @@ -0,0 +1,37 @@ +import { useState, ReactNode } from 'react'; +import { Settings } from '../types/graph'; +import './FormEditor.css'; + +interface SettingEditorProps { + settings: Settings; + onUpdate?: (data: Settings) => void; + onClose: () => void; +} + +export default function SettingsEditor({ + settings, + onUpdate, + onClose +}: SettingEditorProps): ReactNode { + + const handleSave = (): void => { + // onUpdate(); + onClose(); + }; + + return ( +
+
+
+

全局设置

+ +
+ +
+ + +
+
+
+ ); +} diff --git a/src/types/graph.ts b/src/types/graph.ts index 554be2c..9a24d18 100644 --- a/src/types/graph.ts +++ b/src/types/graph.ts @@ -6,20 +6,9 @@ export type AppEdge = Edge; export type NodeData = { readonly id: string; - label: string; - privateKey: string; - ipv4Address?: string; - ipv6Address?: string; - disallowIPs?: string; - postUp?: string; - postDown?: string; - mtu?: number; - listenPort?: number; - dnsServers?: string; - notes?: string; -} +} & NodeDataUpdate -export interface NodeDataUpdate { +export type NodeDataUpdate = { label: string; privateKey: string; ipv4Address?: string; @@ -36,10 +25,9 @@ export interface NodeDataUpdate { export type EdgeData = { readonly id: string; isTwoWayEdge: boolean; - persistentKeepalive?: number; -} +} & EdgeDataUpdate -export interface EdgeDataUpdate { +export type EdgeDataUpdate = { persistentKeepalive?: number; } @@ -52,7 +40,7 @@ export class SubNetRouter { ) {} } -export type Settings = { +export interface Settings { listenPort: number; mtu: number;