Browse Source

fix(xray): clear outbound test state on delete to prevent result bleed (#4205)

Ali Fotouhi 1 day ago
parent
commit
9cbba130ab
2 changed files with 12 additions and 2 deletions
  1. 2 2
      frontend/src/pages/xray/OutboundsTab.vue
  2. 10 0
      frontend/src/pages/xray/XrayPage.vue

+ 2 - 2
frontend/src/pages/xray/OutboundsTab.vue

@@ -48,7 +48,7 @@ const inboundTagOptions = computed(() => {
   return [...out];
 });
 
-const emit = defineEmits(['reset-traffic', 'test', 'show-warp', 'show-nord']);
+const emit = defineEmits(['reset-traffic', 'test', 'show-warp', 'show-nord', 'delete']);
 
 // === Modal state ====================================================
 const modalOpen = ref(false);
@@ -86,7 +86,7 @@ function confirmDelete(idx) {
     okText: t('delete'),
     okType: 'danger',
     cancelText: t('cancel'),
-    onOk: () => { props.templateSettings.outbounds.splice(idx, 1); },
+    onOk: () => { emit('delete', idx); },
   });
 }
 function setFirst(idx) {

+ 10 - 0
frontend/src/pages/xray/XrayPage.vue

@@ -57,6 +57,15 @@ async function onTestOutbound(idx) {
   if (outbound) await testOutbound(idx, outbound);
 }
 
+function onDeleteOutbound(idx) {
+  templateSettings.value.outbounds.splice(idx, 1);
+  outboundTestStates.value = Object.fromEntries(
+    Object.entries(outboundTestStates.value)
+      .filter(([k]) => Number(k) !== idx)
+      .map(([k, v]) => [Number(k) > idx ? Number(k) - 1 : Number(k), v]),
+  );
+}
+
 // === Advanced tab — radio-driven view ==============================
 // Mirrors the legacy advanced page: a 4-way radio toggles which slice
 // of the xray config the textarea edits — the full config, just the
@@ -298,6 +307,7 @@ function confirmRestart() {
                         :is-mobile="isMobile"
                         @reset-traffic="resetOutboundsTraffic"
                         @test="onTestOutbound"
+                        @delete="onDeleteOutbound"
                         @show-warp="showWarp"
                         @show-nord="showNord"
                       />