Use toasts for errors unassociated with a tab

This commit is contained in:
Justin Spahr-Summers
2024-11-12 13:41:08 +00:00
parent 9d0c643926
commit 3bae26723a
2 changed files with 24 additions and 11 deletions

View File

@@ -52,6 +52,7 @@ import {
Terminal, Terminal,
} from "lucide-react"; } from "lucide-react";
import { toast } from "react-toastify";
import { ZodType } from "zod"; import { ZodType } from "zod";
import "./App.css"; import "./App.css";
import ConsoleTab from "./components/ConsoleTab"; import ConsoleTab from "./components/ConsoleTab";
@@ -178,7 +179,7 @@ const App = () => {
const makeRequest = async <T extends ZodType<object>>( const makeRequest = async <T extends ZodType<object>>(
request: ClientRequest, request: ClientRequest,
schema: T, schema: T,
tabKey: keyof typeof errors tabKey?: keyof typeof errors,
) => { ) => {
if (!mcpClient) { if (!mcpClient) {
throw new Error("MCP client not connected"); throw new Error("MCP client not connected");
@@ -187,10 +188,19 @@ const App = () => {
try { try {
const response = await mcpClient.request(request, schema); const response = await mcpClient.request(request, schema);
pushHistory(request, response); pushHistory(request, response);
setErrors(prev => ({ ...prev, [tabKey]: null }));
if (tabKey !== undefined) {
setErrors((prev) => ({ ...prev, [tabKey]: null }));
}
return response; return response;
} catch (e: unknown) { } catch (e: unknown) {
setErrors(prev => ({ ...prev, [tabKey]: (e as Error).message })); if (tabKey === undefined) {
toast.error((e as Error).message);
} else {
setErrors((prev) => ({ ...prev, [tabKey]: (e as Error).message }));
}
throw e; throw e;
} }
}; };
@@ -204,7 +214,7 @@ const App = () => {
await mcpClient.notification(notification); await mcpClient.notification(notification);
pushHistory(notification); pushHistory(notification);
} catch (e: unknown) { } catch (e: unknown) {
setError((e as Error).message); toast.error((e as Error).message);
throw e; throw e;
} }
}; };
@@ -216,7 +226,7 @@ const App = () => {
params: nextResourceCursor ? { cursor: nextResourceCursor } : {}, params: nextResourceCursor ? { cursor: nextResourceCursor } : {},
}, },
ListResourcesResultSchema, ListResourcesResultSchema,
'resources' "resources",
); );
setResources(resources.concat(response.resources ?? [])); setResources(resources.concat(response.resources ?? []));
setNextResourceCursor(response.nextCursor); setNextResourceCursor(response.nextCursor);
@@ -231,7 +241,7 @@ const App = () => {
: {}, : {},
}, },
ListResourceTemplatesResultSchema, ListResourceTemplatesResultSchema,
'resources' "resources",
); );
setResourceTemplates( setResourceTemplates(
resourceTemplates.concat(response.resourceTemplates ?? []), resourceTemplates.concat(response.resourceTemplates ?? []),
@@ -246,7 +256,7 @@ const App = () => {
params: { uri }, params: { uri },
}, },
ReadResourceResultSchema, ReadResourceResultSchema,
'resources' "resources",
); );
setResourceContent(JSON.stringify(response, null, 2)); setResourceContent(JSON.stringify(response, null, 2));
}; };
@@ -258,7 +268,7 @@ const App = () => {
params: nextPromptCursor ? { cursor: nextPromptCursor } : {}, params: nextPromptCursor ? { cursor: nextPromptCursor } : {},
}, },
ListPromptsResultSchema, ListPromptsResultSchema,
'prompts' "prompts",
); );
setPrompts(response.prompts); setPrompts(response.prompts);
setNextPromptCursor(response.nextCursor); setNextPromptCursor(response.nextCursor);
@@ -271,7 +281,7 @@ const App = () => {
params: { name, arguments: args }, params: { name, arguments: args },
}, },
GetPromptResultSchema, GetPromptResultSchema,
'prompts' "prompts",
); );
setPromptContent(JSON.stringify(response, null, 2)); setPromptContent(JSON.stringify(response, null, 2));
}; };
@@ -283,7 +293,7 @@ const App = () => {
params: nextToolCursor ? { cursor: nextToolCursor } : {}, params: nextToolCursor ? { cursor: nextToolCursor } : {},
}, },
ListToolsResultSchema, ListToolsResultSchema,
'tools' "tools",
); );
setTools(response.tools); setTools(response.tools);
setNextToolCursor(response.nextCursor); setNextToolCursor(response.nextCursor);
@@ -302,7 +312,7 @@ const App = () => {
}, },
}, },
CompatibilityCallToolResultSchema, CompatibilityCallToolResultSchema,
'tools' "tools",
); );
setToolResult(response); setToolResult(response);
}; };

View File

@@ -1,10 +1,13 @@
import { StrictMode } from "react"; import { StrictMode } from "react";
import { createRoot } from "react-dom/client"; import { createRoot } from "react-dom/client";
import { ToastContainer } from 'react-toastify';
import 'react-toastify/dist/ReactToastify.css';
import App from "./App.tsx"; import App from "./App.tsx";
import "./index.css"; import "./index.css";
createRoot(document.getElementById("root")!).render( createRoot(document.getElementById("root")!).render(
<StrictMode> <StrictMode>
<App /> <App />
<ToastContainer />
</StrictMode>, </StrictMode>,
); );