fix(userFields): address greptile review concerns

- UserFieldsAdminSection: use field name as stable React key (falls back to index for blank fields) to avoid stale input state on delete.
- create_mcp_server: drop the validUserFields.length > 0 guard so editing an existing server can clear all per-user fields.
- mcp_servers: don't open the user-fields modal until the userID is known, and consume the ?openUserFields deep-link param once the server list has loaded even when the target id can't be found, so it doesn't persist across re-renders.
- UserFieldsModal: hard-code the deep-link query string to page=mcp-servers&openUserFields=<id> instead of carrying the user's current query params into the mocked error preview.
This commit is contained in:
mateo-berri 2026-05-19 06:42:46 +00:00
parent a0b3ff0eac
commit 11982ba9ce
No known key found for this signature in database
4 changed files with 13 additions and 14 deletions

View file

@ -64,7 +64,7 @@ const UserFieldsAdminSection: React.FC<UserFieldsAdminSectionProps> = ({ value,
) : (
<div className="space-y-3">
{fields.map((f, idx) => (
<div key={idx} className="bg-white rounded border border-gray-200 p-3">
<div key={f.name || idx} className="bg-white rounded border border-gray-200 p-3">
<div className="grid grid-cols-12 gap-2 items-start">
<div className="col-span-3">
<Text type="secondary" style={{ fontSize: 11 }}>Field Name (key)</Text>

View file

@ -67,9 +67,10 @@ const UserFieldsModal: React.FC<UserFieldsModalProps> = ({
const buildDeepLinkUrl = (): string => {
if (typeof window === "undefined") {
return `<dashboard-url>?openUserFields=${server.server_id}`;
return `<dashboard-url>?page=mcp-servers&openUserFields=${server.server_id}`;
}
const params = new URLSearchParams(window.location.search);
const params = new URLSearchParams();
params.set("page", "mcp-servers");
params.set("openUserFields", server.server_id);
return `${window.location.origin}${window.location.pathname}?${params.toString()}`;
};

View file

@ -417,7 +417,7 @@ const CreateMCPServer: React.FC<CreateMCPServerProps> = ({
const validUserFields = userFields.filter(
(f) => f && f.name && f.name.trim() !== "",
);
if (response?.server_id && validUserFields.length > 0) {
if (response?.server_id) {
setUserFieldDefs(response.server_id, validUserFields);
}

View file

@ -94,22 +94,20 @@ const MCPServers: React.FC<MCPServerProps> = ({ accessToken, userRole, userID })
// ?openUserFields=<server_id> (this is the deep-link target shown in the
// mocked Claude Code error message).
useEffect(() => {
if (typeof window === "undefined" || !serversWithHealth || serversWithHealth.length === 0) {
return;
}
if (typeof window === "undefined" || !mcpServers) return;
const params = new URLSearchParams(window.location.search);
const targetId = params.get("openUserFields");
if (!targetId) return;
const target = serversWithHealth.find((s) => s.server_id === targetId);
if (target) {
setUserFieldsServer(target);
params.delete("openUserFields");
const remaining = params.toString();
const newUrl =
window.location.pathname + (remaining ? `?${remaining}` : "") + window.location.hash;
window.history.replaceState({}, "", newUrl);
}
}, [serversWithHealth]);
params.delete("openUserFields");
const remaining = params.toString();
const newUrl =
window.location.pathname + (remaining ? `?${remaining}` : "") + window.location.hash;
window.history.replaceState({}, "", newUrl);
}, [mcpServers, serversWithHealth]);
// Servers with one or more missing user fields for the current user (prototype)
const serversNeedingUserFields = React.useMemo(() => {
@ -549,7 +547,7 @@ const MCPServers: React.FC<MCPServerProps> = ({ accessToken, userRole, userID })
<UserFieldsModal
server={userFieldsServer}
userId={userID || ""}
open={!!userFieldsServer}
open={!!userFieldsServer && !!userID}
onClose={() => setUserFieldsServer(null)}
onSaved={() => setUserFieldsRefreshKey((k) => k + 1)}
/>