diff --git a/ui/goose2/src/features/settings/ui/ModelProviderRow.tsx b/ui/goose2/src/features/settings/ui/ModelProviderRow.tsx index 1982997f..03637b34 100644 --- a/ui/goose2/src/features/settings/ui/ModelProviderRow.tsx +++ b/ui/goose2/src/features/settings/ui/ModelProviderRow.tsx @@ -78,7 +78,6 @@ export function ModelProviderRow({ const [setupOutput, setSetupOutput] = useState([]); const [setupError, setSetupError] = useState(""); const [showSavedState, setShowSavedState] = useState(false); - const [preserveSetupLayout, setPreserveSetupLayout] = useState(false); const setupLineCounter = useRef(0); const hasLoadedConfig = useRef(false); const shouldRestorePanelFocus = useRef(false); @@ -170,7 +169,6 @@ export function ModelProviderRow({ setEditingKey(null); setError(""); setShowSavedState(false); - setPreserveSetupLayout(false); const unlisten = await onModelSetupOutput(provider.id, appendSetupOutput); @@ -195,7 +193,6 @@ export function ModelProviderRow({ setExpanded((current) => { if (current) { setShowSavedState(false); - setPreserveSetupLayout(false); } return !current; }); @@ -295,8 +292,7 @@ export function ModelProviderRow({ })), ); await loadConfig(); - setShowSavedState(true); - setPreserveSetupLayout(true); + setShowSavedState(false); } catch (nextError) { setError( nextError instanceof Error ? nextError.message : "Failed to save", @@ -312,7 +308,6 @@ export function ModelProviderRow({ setEditingKey(null); setError(""); setShowSavedState(false); - setPreserveSetupLayout(false); } catch (nextError) { setError( nextError instanceof Error ? nextError.message : "Failed to remove", @@ -403,7 +398,7 @@ export function ModelProviderRow({ ); } - if (hasFields && isConnected && !preserveSetupLayout) { + if (hasFields && isConnected) { return ( { expect(screen.getByText(/model refresh failed/i)).toBeInTheDocument(); }); + + it("switches from setup save to connected controls after first configuration", async () => { + const user = userEvent.setup(); + let saved = false; + + function SetupSaveRow() { + const [status, setStatus] = useState<"connected" | "not_configured">( + "not_configured", + ); + + return ( + + saved + ? [ + { + key: "GOOGLE_API_KEY", + value: null, + isSet: true, + isSecret: true, + required: true, + }, + ] + : [] + } + onSaveFields={async () => { + saved = true; + setStatus("connected"); + }} + onRemoveConfig={onRemoveConfig} + onCompleteNativeSetup={onCompleteNativeSetup} + /> + ); + } + + render(); + + await user.click(screen.getByRole("button", { name: /google gemini/i })); + await user.type( + await screen.findByPlaceholderText(/paste your api key/i), + "google-token", + ); + await user.click(screen.getByRole("button", { name: /^save$/i })); + + await waitFor(() => + expect( + screen.getByRole("button", { name: /disconnect/i }), + ).toBeInTheDocument(), + ); + expect(screen.getByRole("button", { name: /edit/i })).toBeInTheDocument(); + expect( + screen.queryByRole("button", { name: /saved/i }), + ).not.toBeInTheDocument(); + }); });