优化参数更新

This commit is contained in:
limil 2026-02-08 00:20:36 +08:00
parent 1edb3474c5
commit 0d5a4f39ec
3 changed files with 58 additions and 25 deletions

View File

@ -18,10 +18,11 @@ import {
EdgeMouseHandler EdgeMouseHandler
} from '@xyflow/react'; } from '@xyflow/react';
import '@xyflow/react/dist/style.css'; 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 CustomNode from './components/CustomNode';
import NodeEditor from './components/NodeEditor'; import NodeEditor from './components/NodeEditor';
import EdgeEditor from './components/EdgeEditor' import EdgeEditor from './components/EdgeEditor'
import SettingsEditor from './components/SettingsEditor'
import Toggle from "./components/Toggle" import Toggle from "./components/Toggle"
import { generateWireGuardPrivateKey } from './utils/wireguardConfig'; import { generateWireGuardPrivateKey } from './utils/wireguardConfig';
import './App.css'; import './App.css';
@ -55,6 +56,7 @@ function FlowContent(): ReactNode {
const [editingNode, setEditingNode] = useState<NodeData | undefined>(undefined); const [editingNode, setEditingNode] = useState<NodeData | undefined>(undefined);
const [editingEdge, setEditingEdge] = useState<EdgeData | undefined>(undefined); const [editingEdge, setEditingEdge] = useState<EdgeData | undefined>(undefined);
const [enableTwoWay, setEnableTwoWay] = useState(false); const [enableTwoWay, setEnableTwoWay] = useState(false);
const [editSettings, setEditSettings] = useState<boolean>(false);
const onNodesChange = useCallback( const onNodesChange = useCallback(
(changes: NodeChange<AppNode>[]) => setNodes((nds) => applyNodeChanges<AppNode>(changes, nds)), (changes: NodeChange<AppNode>[]) => setNodes((nds) => applyNodeChanges<AppNode>(changes, nds)),
@ -118,28 +120,26 @@ function FlowContent(): ReactNode {
setNodes((prev) => [...prev.map(node => ({ ...node, selected: false })), newNode]); setNodes((prev) => [...prev.map(node => ({ ...node, selected: false })), newNode]);
}; };
const handleUpdateNode = (updatedData: NodeData): void => { const handleUpdateNode = (updatedData: NodeDataUpdate): void => {
setNodes((prev) => setNodes((prev) =>
prev.map((node) => { prev.map((node) => {
if (node.data.id === editingNode?.id) { if (node.data.id === editingNode?.id) {
return { ...node, data: updatedData }; node.data = {...node.data, ...updatedData}
} }
return node; return node;
}) })
); );
setEditingNode(undefined);
}; };
const handleUpdateEdge = (updatedData: EdgeData): void => { const handleUpdateEdge = (updatedData: EdgeDataUpdate): void => {
setEdges((prev) => setEdges((prev) =>
prev.map((edge) => { prev.map((edge) => {
if (edge.data && edge.data.id === editingEdge?.id) { if (edge.data && edge.data.id === editingEdge?.id) {
return { ...edge, data: updatedData }; edge.data = {...edge.data, ...updatedData}
} }
return edge; return edge;
}) })
); );
setEditingNode(undefined);
}; };
return ( return (
@ -180,7 +180,7 @@ function FlowContent(): ReactNode {
</button> </button>
<button className="toolbar-btn" onClick={() => {}} title="设置"> <button className="toolbar-btn" onClick={() => {setEditSettings(true);}} title="设置">
📋 📋
</button> </button>
@ -203,6 +203,14 @@ function FlowContent(): ReactNode {
onClose={() => setEditingEdge(undefined)} onClose={() => setEditingEdge(undefined)}
/> />
)} )}
{editSettings && (
<SettingsEditor
settings={settings}
onUpdate={settingsUpdate => {}}
onClose={() => setEditSettings(false)}
/>
)}
</div> </div>
); );

View File

@ -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 (
<div className="node-editor-overlay">
<div className="node-editor">
<div className="editor-header">
<h2></h2>
<button className="close-btn" onClick={onClose}>×</button>
</div>
<div className="editor-actions">
<button className="btn-save" onClick={handleSave}></button>
<button className="btn-cancel" onClick={onClose}></button>
</div>
</div>
</div>
);
}

View File

@ -6,20 +6,9 @@ export type AppEdge = Edge<EdgeData>;
export type NodeData = { export type NodeData = {
readonly id: string; readonly id: string;
label: string; } & NodeDataUpdate
privateKey: string;
ipv4Address?: string;
ipv6Address?: string;
disallowIPs?: string;
postUp?: string;
postDown?: string;
mtu?: number;
listenPort?: number;
dnsServers?: string;
notes?: string;
}
export interface NodeDataUpdate { export type NodeDataUpdate = {
label: string; label: string;
privateKey: string; privateKey: string;
ipv4Address?: string; ipv4Address?: string;
@ -36,10 +25,9 @@ export interface NodeDataUpdate {
export type EdgeData = { export type EdgeData = {
readonly id: string; readonly id: string;
isTwoWayEdge: boolean; isTwoWayEdge: boolean;
persistentKeepalive?: number; } & EdgeDataUpdate
}
export interface EdgeDataUpdate { export type EdgeDataUpdate = {
persistentKeepalive?: number; persistentKeepalive?: number;
} }
@ -52,7 +40,7 @@ export class SubNetRouter {
) {} ) {}
} }
export type Settings = { export interface Settings {
listenPort: number; listenPort: number;
mtu: number; mtu: number;