From 14cf0946b3a58edcdc24368a72f051f279fa9a5d Mon Sep 17 00:00:00 2001 From: LukeGus Date: Wed, 30 Sep 2026 16:50:58 -0500 Subject: [PATCH] fix: quick connect fills the host address from plugin auth editors like tailscale --- src/ui/sidebar/QuickConnectPanel.tsx | 11 ++-- .../tests/sidebar/QuickConnectPanel.test.tsx | 59 +++++++++++++++++++ 2 files changed, 66 insertions(+), 4 deletions(-) diff --git a/src/ui/sidebar/QuickConnectPanel.tsx b/src/ui/sidebar/QuickConnectPanel.tsx index 780d9f926..611beb63a 100644 --- a/src/ui/sidebar/QuickConnectPanel.tsx +++ b/src/ui/sidebar/QuickConnectPanel.tsx @@ -285,10 +285,13 @@ export function QuickConnectPanel({ onConnect }: QuickConnectPanelProps) { )} {!isDesktop && AuthEditor && ( - setAuthFields((current) => ({ ...current, [key]: value })) - } + form={{ ...authFields, ip: host, port, username }} + setField={(key, value) => { + if (key === "ip") setHost(String(value ?? "")); + else if (key === "port") setPort(String(value ?? "")); + else if (key === "username") setUsername(String(value ?? "")); + else setAuthFields((current) => ({ ...current, [key]: value })); + }} /> )}
diff --git a/src/ui/tests/sidebar/QuickConnectPanel.test.tsx b/src/ui/tests/sidebar/QuickConnectPanel.test.tsx index 1bfa84c11..8bd181ffc 100644 --- a/src/ui/tests/sidebar/QuickConnectPanel.test.tsx +++ b/src/ui/tests/sidebar/QuickConnectPanel.test.tsx @@ -14,6 +14,16 @@ vi.mock("@/api/credentials-api", () => ({ vi.mock("@/api/auth-methods-api", () => ({ getSshAuthProviders: vi.fn(async () => []), })); +const authMocks = vi.hoisted(() => ({ + providers: [] as Record[], + editors: [] as Record[], +})); +vi.mock("@/hooks/useSshAuthProviders", () => ({ + useSshAuthProviders: () => ({ providers: authMocks.providers }), +})); +vi.mock("@/plugin-host/auth-registry", () => ({ + useSshAuthEditors: () => authMocks.editors, +})); vi.mock("sonner", () => ({ toast: { error: vi.fn() } })); vi.mock("react-i18next", () => ({ useTranslation: () => ({ @@ -30,6 +40,8 @@ import { afterEach(() => { cleanup(); + authMocks.providers = []; + authMocks.editors = []; resetHostContributions(); }); @@ -128,4 +140,51 @@ describe("QuickConnectPanel", () => { screen.getByText("newUi.sidebar.quickConnect.noTarget"), ).toBeTruthy(); }); + + it("lets a plugin auth editor fill the host address", async () => { + registerDefaults(); + authMocks.providers = [ + { + type: "password", + labelKey: "password", + available: true, + quickConnect: true, + }, + { + type: "tailnet", + labelKey: "tailnet", + available: true, + quickConnect: true, + }, + ]; + authMocks.editors = [ + { + id: "tailnet", + component: ({ + setField, + }: { + setField: (k: string, v: unknown) => void; + }) => ( + + ), + }, + ]; + const onConnect = vi.fn(); + render(); + fireEvent.change(screen.getByDisplayValue("password"), { + target: { value: "tailnet" }, + }); + fireEvent.click(screen.getByText("pick device")); + const input = screen.getByPlaceholderText( + "newUi.sidebar.quickConnect.hostPlaceholder", + ) as HTMLInputElement; + expect(input.value).toBe("100.64.0.5"); + fireEvent.keyDown(input, { key: "Enter" }); + expect(onConnect).toHaveBeenCalledWith( + expect.objectContaining({ ip: "100.64.0.5", authType: "tailnet" }), + "terminal", + ); + }); });