From 92bc5c78fd95cdd76be6ac343a3281be19127ade Mon Sep 17 00:00:00 2001 From: gwdgithubnom Date: Wed, 27 May 2026 16:26:43 +0800 Subject: [PATCH 1/2] fix(ui): move 'add entry' button to entries toolbar --- .../sheets/forms/BaseProviderForm.tsx | 26 ++++++++++--------- .../sheets/forms/sharedForm.module.scss | 4 +++ 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/features/providers/sheets/forms/BaseProviderForm.tsx b/src/features/providers/sheets/forms/BaseProviderForm.tsx index 03dd197..232d937 100644 --- a/src/features/providers/sheets/forms/BaseProviderForm.tsx +++ b/src/features/providers/sheets/forms/BaseProviderForm.tsx @@ -635,7 +635,20 @@ export function BaseProviderForm({ defaultOpen >
-
+
+ {/* Add entry button on the left */} + + {/* Test all button on the right */}
) : null} diff --git a/src/features/providers/sheets/forms/sharedForm.module.scss b/src/features/providers/sheets/forms/sharedForm.module.scss index 1e5773f..f3079c3 100644 --- a/src/features/providers/sheets/forms/sharedForm.module.scss +++ b/src/features/providers/sheets/forms/sharedForm.module.scss @@ -221,6 +221,10 @@ margin-bottom: 2px; } +.entriesToolbarSplit { + justify-content: space-between; +} + .connectivityRow { display: flex; align-items: center; From c958e3084b753b478fa0790bb67505a1f8daf643 Mon Sep 17 00:00:00 2001 From: gwdgithubnom Date: Wed, 27 May 2026 23:19:30 +0800 Subject: [PATCH 2/2] fix(ui): resolve connectivity status mismatch after prepend insertion Prepending new API key entries shifted all existing indices, causing useConnectivityTest index-based status tracking to desync. Fix: keep array operations as append (stable indices) and reverse the rendering order so new entries appear at the top visually. Use realIdx for status lookups, React keys, and all updateField operations. --- .../sheets/forms/BaseProviderForm.tsx | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/features/providers/sheets/forms/BaseProviderForm.tsx b/src/features/providers/sheets/forms/BaseProviderForm.tsx index 232d937..820bb16 100644 --- a/src/features/providers/sheets/forms/BaseProviderForm.tsx +++ b/src/features/providers/sheets/forms/BaseProviderForm.tsx @@ -642,7 +642,7 @@ export function BaseProviderForm({ className={styles.addBtn} disabled={mutating} onClick={() => - updateField('apiKeyEntries', [emptyApiKeyEntry(), ...apiKeyEntries]) + updateField('apiKeyEntries', [...apiKeyEntries, emptyApiKeyEntry()]) } > @@ -663,16 +663,17 @@ export function BaseProviderForm({ {t('providersPage.connectivity.testAll')}
- {apiKeyEntries.map((entry, idx) => { - const status = connectivity.openaiStatuses[idx] ?? { + {[...apiKeyEntries].reverse().map((entry, visualIdx) => { + const realIdx = apiKeyEntries.length - 1 - visualIdx; + const status = connectivity.openaiStatuses[realIdx] ?? { state: 'idle' as ConnectivityState, message: '', }; return ( -
+
- {t('providersPage.form.apiKeyEntry', { index: idx + 1 })} + {t('providersPage.form.apiKeyEntry', { index: realIdx + 1 })}
@@ -680,7 +681,7 @@ export function BaseProviderForm({ type="button" className={styles.connectivityBtnGhost} disabled={mutating || status.state === 'loading'} - onClick={() => void connectivity.runOpenAIKey(idx)} + onClick={() => void connectivity.runOpenAIKey(realIdx)} > {status.state === 'loading' ? ( @@ -696,7 +697,7 @@ export function BaseProviderForm({ onClick={() => updateField( 'apiKeyEntries', - apiKeyEntries.filter((_, i) => i !== idx) + apiKeyEntries.filter((_, i) => i !== realIdx) ) } > @@ -716,7 +717,7 @@ export function BaseProviderForm({ updateField( 'apiKeyEntries', apiKeyEntries.map((it, i) => - i === idx ? { ...it, apiKey: e.target.value } : it + i === realIdx ? { ...it, apiKey: e.target.value } : it ) ) } @@ -735,7 +736,7 @@ export function BaseProviderForm({ updateField( 'apiKeyEntries', apiKeyEntries.map((it, i) => - i === idx ? { ...it, proxyUrl: e.target.value } : it + i === realIdx ? { ...it, proxyUrl: e.target.value } : it ) ) } @@ -759,7 +760,7 @@ export function BaseProviderForm({ updateField( 'apiKeyEntries', apiKeyEntries.map((it, i) => - i === idx ? { ...it, headersText: e.target.value } : it + i === realIdx ? { ...it, headersText: e.target.value } : it ) ) }