Skip to content

Commit 8370e10

Browse files
committed
feat: enhance server routing and configuration management
- Added a new route for server details using owner and repo parameters. - Removed the ServerInfoSection component to streamline server configuration. - Refactored ServerConfigDialog to utilize a new ServerConfigForm for better modularity. - Updated ServerPage to handle server data fetching based on both ID and repository parameters. - Improved deep link handling to support new routing structure. - Enhanced user feedback with toast notifications for server actions.
1 parent b9d7638 commit 8370e10

18 files changed

+484
-211
lines changed

tauri-app/src/components/server/config/ServerInfoSection.tsx

Lines changed: 0 additions & 68 deletions
This file was deleted.
Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
11
export * from "./ConfigTabs";
2-
export * from "./ServerInfoSection";
32
export * from "./ServerTypeSelector";
43
export * from "./StdioConfigSection";

tauri-app/src/components/server/dialog/ServerConfigDialog.tsx

Lines changed: 40 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,15 @@ import { toast } from "sonner";
77

88
import { fetchServerConfig } from "@/lib/api";
99
import { useClientPathStore } from "@/stores/clientPathStore";
10-
import { LabeledInput } from "../../shared/LabeledInput";
11-
import { ConfigTabs } from "../config";
12-
import { SseConfigForm } from "../form/SseConfigForm";
13-
import { StdioConfigForm } from "../form/StdioConfigForm";
10+
import { useConfigFileStore } from "@/stores/configFileStore";
11+
import { useTeamStore } from "@/stores/team";
12+
import { invoke } from "@tauri-apps/api/core";
13+
import { ServerConfigForm } from "../form/ServerConfigForm";
1414
import {
1515
useLocalDraft,
1616
useSaveServerConfig,
1717
useServerConfigDialog,
1818
} from "../hooks";
19-
import { ServerConfigDialogFooter } from "./ServerConfigDialogFooter";
2019
import { ServerConfigDialogHeader } from "./ServerConfigDialogHeader";
2120

2221
interface ServerConfigDialogProps {
@@ -31,6 +30,8 @@ export const ServerConfigDialog = forwardRef<
3130
>(({ isOpen, setIsDialogOpen, currentServer }, _ref) => {
3231
const { selectedClient, selectedPath } = useClientPathStore();
3332
const { saveServerConfig } = useSaveServerConfig();
33+
const { getTeamConfigPath } = useConfigFileStore();
34+
const { selectedTeamId } = useTeamStore();
3435

3536
const queryResult = useQuery({
3637
queryKey: ["configs", currentServer?.id],
@@ -145,50 +146,47 @@ export const ServerConfigDialog = forwardRef<
145146
clearDraft(); // Clear the draft after successful save
146147
};
147148

149+
const handleSubmitTeamLocal = async () => {
150+
try {
151+
await invoke("add_mcp_server", {
152+
clientName: "custom",
153+
path: getTeamConfigPath(selectedTeamId),
154+
serverName: serverName,
155+
serverConfig: config,
156+
});
157+
toast.success(`add to Team Local ok`);
158+
} catch (e: any) {
159+
console.error(e);
160+
toast.error(e?.message || "fail to add to Team Local");
161+
} finally {
162+
setIsDialogOpen(false);
163+
}
164+
};
165+
148166
return (
149167
<Dialog open={isOpen} onOpenChange={setIsDialogOpen}>
150168
<DialogContent className="overflow-y-auto max-h-[90vh] w-[90vw] max-w-3xl bg-background dark:bg-gray-800">
151169
<ServerConfigDialogHeader />
152170

153-
<LabeledInput
154-
label="Server name"
155-
value={serverName}
156-
onChange={setServerName}
157-
/>
158-
159-
{configs && configs.length > 0 && (
160-
<ConfigTabs
161-
configs={configs}
162-
curIndex={curIndex}
163-
onConfigChange={handleConfigChange}
164-
/>
165-
)}
166-
167-
<div className="grid gap-4 py-4">
168-
{/* StdioServerConfig specific fields */}
169-
{config && "command" in config && (
170-
<StdioConfigForm
171-
config={config}
172-
envValues={envValues}
173-
setEnvValues={setEnvValues}
174-
onCommandChange={handleCommandChange}
175-
onArgsChange={handleArgsChange}
176-
onEnvChange={handleEnvChange}
177-
/>
178-
)}
179-
180-
{/* SseConfig specific fields */}
181-
{config && "url" in config && (
182-
<SseConfigForm
183-
config={config}
184-
onConfigChange={handleSseConfigChange}
185-
/>
186-
)}
187-
</div>
188-
189-
<ServerConfigDialogFooter
171+
{/* Main server config form extracted to a reusable component */}
172+
<ServerConfigForm
173+
serverName={serverName}
174+
setServerName={setServerName}
175+
// Ensure configs is always an array, never null
176+
configs={configs ?? []}
177+
curIndex={curIndex}
178+
onConfigChange={handleConfigChange}
179+
// Ensure config is never null, fallback to an empty object or suitable default if needed
180+
config={config ?? ({} as ServerConfig)}
181+
envValues={envValues}
182+
setEnvValues={setEnvValues}
183+
onCommandChange={handleCommandChange}
184+
onArgsChange={handleArgsChange}
185+
onEnvChange={handleEnvChange}
186+
onSseConfigChange={handleSseConfigChange}
190187
onSubmit={handleSubmit}
191188
selectedClient={selectedClient}
189+
onSubmitTeamLocal={handleSubmitTeamLocal}
192190
/>
193191
</DialogContent>
194192
</Dialog>

tauri-app/src/components/server/dialog/ServerConfigDialogFooter.tsx

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,48 @@
22
import { Button } from "@/components/ui/button";
33
import capitalizeFirstLetter from "@/utils/title";
44
import { useTranslation } from "react-i18next";
5+
import { useNavigate } from "react-router";
56

67
interface ServerConfigDialogFooterProps {
78
onSubmit: () => Promise<void>;
9+
onSubmitTeamLocal?: () => Promise<void>;
810
selectedClient: string;
911
}
1012

1113
export const ServerConfigDialogFooter = ({
1214
onSubmit,
15+
onSubmitTeamLocal,
1316
selectedClient,
1417
}: ServerConfigDialogFooterProps) => {
1518
const { t } = useTranslation();
19+
const navigate = useNavigate();
1620

1721
return (
18-
<Button
19-
onClick={(e) => {
20-
e.preventDefault();
21-
onSubmit();
22-
}}
23-
>
24-
{t("addTo")} {capitalizeFirstLetter(selectedClient)}
25-
</Button>
22+
<div className="flex gap-2">
23+
<Button
24+
onClick={(e) => {
25+
e.preventDefault();
26+
onSubmit();
27+
}}
28+
>
29+
{t("addTo")} {capitalizeFirstLetter(selectedClient)}
30+
</Button>
31+
<Button
32+
onClick={(e) => {
33+
e.preventDefault();
34+
onSubmitTeamLocal?.();
35+
}}
36+
>
37+
{t("addTo")} {t("teamLocal")}
38+
</Button>
39+
40+
<Button
41+
onClick={() => {
42+
navigate("/manage");
43+
}}
44+
>
45+
Manage
46+
</Button>
47+
</div>
2648
);
2749
};

tauri-app/src/components/server/dialog/ServerConfigDialogHeader.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,11 @@ interface ServerConfigDialogHeaderProps {
1212

1313
export const ServerConfigDialogHeader = ({
1414
title = "mcp server config",
15-
description = "server config",
1615
}: ServerConfigDialogHeaderProps) => {
1716
return (
1817
<DialogHeader>
1918
<DialogTitle className="dark:text-white">{title}</DialogTitle>
20-
<DialogDescription>{description}</DialogDescription>
19+
<DialogDescription></DialogDescription>
2120
</DialogHeader>
2221
);
2322
};

tauri-app/src/components/server/dialog/SimpleTab.tsx

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,6 @@ const SimpleTab: React.FC<SimpleTabProps> = ({ logic }) => (
1414
serverType={logic.serverType}
1515
setServerType={logic.setServerType}
1616
config={logic.config}
17-
projectDescription={logic.projectDescription}
18-
setProjectDescription={logic.setProjectDescription}
19-
projectUrl={logic.projectUrl}
20-
setProjectUrl={logic.setProjectUrl}
2117
handleArgsChange={logic.handleArgsChange}
2218
handleCommandChange={logic.handleCommandChange}
2319
handleUrl={logic.handleUrl}
@@ -27,7 +23,6 @@ const SimpleTab: React.FC<SimpleTabProps> = ({ logic }) => (
2723
setEnvValues={logic.setEnvValues}
2824
headerValues={logic.headerValues}
2925
setHeaderValues={logic.setHeaderValues}
30-
setSelectedCategoryId={logic.setSelectedCategoryId}
3126
/>
3227
</TabsContent>
3328
);

tauri-app/src/components/server/dialog/useServerTemplateLogic.ts

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ export function useServerTemplateLogic(
1616
setIsDialogOpen: (open: boolean) => void,
1717
) {
1818
const { selectedClient, selectedPath } = useClientPathStore();
19-
const [selectedCategoryId, setSelectedCategoryId] = useState<number>(1);
2019
const [githubUrl, setGithubUrl] = useState("");
2120
const { loading, error, fetchAllJsonBlocks } = useGithubReadmeJson();
2221
const { getTeamConfigPath } = useConfigFileStore();
@@ -27,10 +26,6 @@ export function useServerTemplateLogic(
2726
const {
2827
serverName,
2928
setServerName,
30-
projectUrl,
31-
setProjectUrl,
32-
projectDescription,
33-
setProjectDescription,
3429
serverType,
3530
setServerType,
3631
config,
@@ -108,10 +103,7 @@ export function useServerTemplateLogic(
108103
const { handleSubmit } = useServerTemplateSubmit({
109104
serverName,
110105
setIsDialogOpen,
111-
projectUrl,
112106
config,
113-
selectedCategoryId,
114-
projectDescription,
115107
serverType,
116108
selectedClient,
117109
selectedPath: selectedPath || undefined,
@@ -195,19 +187,13 @@ export function useServerTemplateLogic(
195187
return {
196188
selectedClient,
197189
selectedPath,
198-
selectedCategoryId,
199-
setSelectedCategoryId,
200190
githubUrl,
201191
setGithubUrl,
202192
loading,
203193
error,
204194
fetchAllJsonBlocks,
205195
serverName,
206196
setServerName,
207-
projectUrl,
208-
setProjectUrl,
209-
projectDescription,
210-
setProjectDescription,
211197
serverType,
212198
setServerType,
213199
config,

tauri-app/src/components/server/dialog/useServerTemplateSubmit.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,7 @@ export function useServerTemplateSubmit({
1313
}: {
1414
serverName: string;
1515
setIsDialogOpen: (open: boolean) => void;
16-
projectUrl: string;
1716
config: any;
18-
selectedCategoryId: number;
19-
projectDescription: string;
2017
serverType: string;
2118
selectedClient: string;
2219
selectedPath: string | undefined;

0 commit comments

Comments
 (0)