diff --git a/App.jsx b/App.jsx
index 979d477..6fb823c 100644
--- a/App.jsx
+++ b/App.jsx
@@ -4279,7 +4279,7 @@ async function jmsResolveIp(domain) {
return answer ? answer.data : null;
}
-function JmsLineCard({ line, ip, onRefreshIp, onCheck, onCopy, onQr, onEdit, onDelete }) {
+function JmsLineCard({ line, ip, onRefreshIp, onCheck, onCopy, onQr, onDuplicate, onEdit, onDelete }) {
const meta = JMS_PROTO_META[line.protocol];
const status = line.monitorStatus || 'normal';
const dotClass = status === 'abnormal' ? 'jms-dot-abnormal' : status === 'checking' ? 'jms-dot-checking' : 'jms-dot-normal';
@@ -4320,8 +4320,9 @@ function JmsLineCard({ line, ip, onRefreshIp, onCheck, onCopy, onQr, onEdit, onD
-
-
+
+
+
);
@@ -4434,6 +4435,15 @@ function JmsPage({ lines, onSave, onDelete, onCheck, onNotify }) {
setDraft({ ...line });
setModalOpen(true);
}
+ function duplicateLine(line) {
+ setEditingId(null); // 不带id,保存时会当成全新的一条线路,不会覆盖原线路
+ setGroup(line.group);
+ setProtocol(line.protocol);
+ const { id, monitorStatus, lastChecked, ...rest } = line;
+ setDraft({ ...rest, name: line.name ? `${line.name} 副本` : '' });
+ setModalOpen(true);
+ onNotify('已复制配置,改一下地址/端口/名称就能存成新线路');
+ }
function closeModal() { setModalOpen(false); }
function handleGroupChange(g) {
@@ -4481,6 +4491,7 @@ function JmsPage({ lines, onSave, onDelete, onCheck, onNotify }) {
onCheck={onCheck}
onCopy={copyLink}
onQr={openQr}
+ onDuplicate={duplicateLine}
onEdit={openEditModal}
onDelete={onDelete}
/>