Просмотр исходного кода

feat(studio): improve service save flow and home navigation

Ma 6 месяцев назад
Родитель
Сommit
4d55dc76d1

+ 9 - 2
packages/studio/src/App.tsx

@@ -23,6 +23,7 @@ import { useTheme } from "./hooks/use-theme";
 import { useI18n } from "./hooks/use-i18n";
 import { useI18n } from "./hooks/use-i18n";
 import { postApi, putApi, useApi } from "./hooks/use-api";
 import { postApi, putApi, useApi } from "./hooks/use-api";
 import { Sun, Moon } from "lucide-react";
 import { Sun, Moon } from "lucide-react";
+import { House } from "lucide-react";
 
 
 export type { HashRoute as Route } from "./hooks/use-hash-route";
 export type { HashRoute as Route } from "./hooks/use-hash-route";
 
 
@@ -112,8 +113,14 @@ export function App() {
         {/* Header Strip */}
         {/* Header Strip */}
         <header className="h-14 shrink-0 flex items-center justify-between px-8 border-b border-border/40">
         <header className="h-14 shrink-0 flex items-center justify-between px-8 border-b border-border/40">
           <div className="flex items-center gap-2">
           <div className="flex items-center gap-2">
-             <button onClick={nav.toDashboard} className="text-[10px] uppercase tracking-[0.2em] text-muted-foreground font-bold hover:text-foreground transition-colors">
-               InkOS Studio
+             <button
+               onClick={nav.toDashboard}
+               className="inline-flex items-center gap-2 rounded-lg border border-border/50 bg-card/70 px-3 py-1.5 text-sm font-semibold text-foreground hover:bg-secondary/50 transition-colors"
+             >
+               <House size={14} />
+               <span>首页</span>
+               <span className="text-muted-foreground/70">/</span>
+               <span className="font-serif">InkOS Studio</span>
              </button>
              </button>
           </div>
           </div>
 
 

+ 25 - 23
packages/studio/src/pages/ServiceDetailPage.tsx

@@ -185,28 +185,26 @@ export function ServiceDetailPage({ serviceId, nav }: { serviceId: string; nav:
           ],
           ],
         }),
         }),
       });
       });
-      setStatus({ state: "saved" });
-      void refreshServices();
-      // After 1.5s, transition to correct state
-      setTimeout(() => {
-        if (trimmedKey) {
-          setStatus({ state: "testing" });
-          fetchJson<{ models: ModelInfo[] }>(`/services/${encodeURIComponent(effectiveServiceId)}/models`)
-            .then((data) => {
-              const m = data.models ?? [];
-              if (m.length > 0) {
-                setStatus({ state: "connected", models: m });
-                setStoreModels(effectiveServiceId, m); // Cache for chat picker
-              } else {
-                setStatus({ state: "idle" });
-              }
-            })
-            .catch(() => setStatus({ state: "idle" }));
-        } else {
-          clearStoreModels(effectiveServiceId);
-          setStatus({ state: "idle" });
+      if (trimmedKey) {
+        try {
+          const data = await fetchJson<{ models: ModelInfo[] }>(`/services/${encodeURIComponent(effectiveServiceId)}/models`);
+          const m = data.models ?? [];
+          if (m.length > 0) {
+            setStoreModels(effectiveServiceId, m);
+            setStatus({ state: "connected", models: m });
+          } else {
+            setStatus({ state: "saved" });
+          }
+        } catch {
+          setStatus({ state: "saved" });
         }
         }
-      }, 1500);
+      } else {
+        clearStoreModels(effectiveServiceId);
+        setStatus({ state: "saved" });
+      }
+
+      await refreshServices();
+      nav.toServices();
     } catch (e) {
     } catch (e) {
       setStatus({ state: "error", message: e instanceof Error ? e.message : "保存失败" });
       setStatus({ state: "error", message: e instanceof Error ? e.message : "保存失败" });
     }
     }
@@ -215,8 +213,12 @@ export function ServiceDetailPage({ serviceId, nav }: { serviceId: string; nav:
   return (
   return (
     <div className="max-w-xl mx-auto space-y-6">
     <div className="max-w-xl mx-auto space-y-6">
       {/* Back */}
       {/* Back */}
-      <button onClick={nav.toServices} className="flex items-center gap-1.5 text-sm text-muted-foreground/70 hover:text-foreground transition-colors">
-        <ArrowLeft size={14} /> 返回
+      <button
+        onClick={nav.toServices}
+        className="inline-flex items-center gap-2 rounded-lg border border-border/50 bg-card/60 px-3 py-2 text-sm font-medium text-foreground hover:bg-secondary/50 transition-colors"
+      >
+        <ArrowLeft size={14} />
+        返回服务商管理
       </button>
       </button>
 
 
       {/* Title + status */}
       {/* Title + status */}

+ 4 - 1
packages/studio/src/pages/ServiceListPage.tsx

@@ -31,7 +31,10 @@ export function ServiceListPage({ nav }: { nav: Nav }) {
   return (
   return (
     <div className="max-w-2xl mx-auto space-y-8">
     <div className="max-w-2xl mx-auto space-y-8">
       <div className="flex items-center gap-2 text-sm text-muted-foreground">
       <div className="flex items-center gap-2 text-sm text-muted-foreground">
-        <button onClick={nav.toDashboard} className="hover:text-foreground transition-colors">
+        <button
+          onClick={nav.toDashboard}
+          className="inline-flex items-center rounded-lg border border-border/50 bg-card/60 px-3 py-1.5 font-medium text-foreground hover:bg-secondary/50 transition-colors"
+        >
           首页
           首页
         </button>
         </button>
         <span className="text-border">/</span>
         <span className="text-border">/</span>