fix(extensions): dedupe MCP detail API key lookups

This commit is contained in:
777genius 2026-04-16 22:32:47 +03:00
parent 0d6276ea0b
commit 3f03bc720a
2 changed files with 38 additions and 32 deletions

View file

@ -128,38 +128,6 @@ export const McpServerDetailDialog = ({
);
}, [server?.id, open]); // eslint-disable-line react-hooks/exhaustive-deps
// Auto-fill env vars from saved API keys
useEffect(() => {
if (!server || server.envVars.length === 0 || !api.apiKeys) return;
const envVarNames = server.envVars.map((env) => env.name);
void api.apiKeys.lookup(envVarNames).then(
(results) => {
if (results.length === 0) return;
const filled = new Set<string>();
const updates: Record<string, string> = {};
for (const r of results) {
updates[r.envVarName] = r.value;
filled.add(r.envVarName);
}
setEnvValues((prev) => {
const next = { ...prev };
for (const [k, v] of Object.entries(updates)) {
// Only auto-fill if the field is empty
if (!next[k]) {
next[k] = v;
}
}
return next;
});
setAutoFilledFields(filled);
},
() => {
// Silently ignore lookup failures
}
);
}, [server?.id]); // eslint-disable-line react-hooks/exhaustive-deps
if (!server) return <></>;
const canAutoInstall = !!server.installSpec;

View file

@ -219,4 +219,42 @@ describe('McpServerDetailDialog installed entry handling', () => {
await Promise.resolve();
});
});
it('looks up saved API keys only once per dialog open', async () => {
const host = document.createElement('div');
document.body.appendChild(host);
const root = createRoot(host);
const server = makeServer();
server.envVars = [{ name: 'CONTEXT7_API_KEY', isSecret: true }];
lookupMock.mockResolvedValue([
{
envVarName: 'CONTEXT7_API_KEY',
value: 'secret',
},
]);
await act(async () => {
root.render(
React.createElement(McpServerDetailDialog, {
server,
isInstalled: false,
installedEntry: null,
diagnostic: null,
diagnosticsLoading: false,
open: true,
onClose: vi.fn(),
})
);
await Promise.resolve();
await Promise.resolve();
});
expect(lookupMock).toHaveBeenCalledTimes(1);
expect(lookupMock).toHaveBeenCalledWith(['CONTEXT7_API_KEY']);
await act(async () => {
root.unmount();
await Promise.resolve();
});
});
});