From 2f913a248cc5f566ac8f106eddf8071374732b0a Mon Sep 17 00:00:00 2001 From: Aqil Aziz Date: Sat, 23 May 2026 14:58:21 +0700 Subject: [PATCH] fix(composio): show waiting state before opening browser (#2406) --- .../composio/ComposioConnectModal.test.tsx | 17 +++++++++++++++++ .../composio/ComposioConnectModal.tsx | 6 +++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/app/src/components/composio/ComposioConnectModal.test.tsx b/app/src/components/composio/ComposioConnectModal.test.tsx index 153fa798b..5c2b2c637 100644 --- a/app/src/components/composio/ComposioConnectModal.test.tsx +++ b/app/src/components/composio/ComposioConnectModal.test.tsx @@ -292,6 +292,23 @@ describe('', () => { ); }); }); + + it('shows the waiting state even when the OS browser opener rejects', async () => { + vi.mocked(composioApi.authorize).mockResolvedValue({ + connectUrl: 'https://hosted.composio.dev/test-token', + connectionId: '', + }); + vi.mocked(composioApi.listConnections).mockResolvedValue({ connections: [] }); + vi.mocked(openUrlModule.openUrl).mockRejectedValueOnce(new Error('opener unavailable')); + + render( {}} />); + + fireEvent.click(screen.getByRole('button', { name: /Connect Gmail/ })); + + expect(await screen.findByRole('button', { name: /Reopen browser/i })).toBeInTheDocument(); + expect(screen.getByText(/Waiting for Gmail/i)).toBeInTheDocument(); + expect(screen.queryByText(/Something went wrong/i)).not.toBeInTheDocument(); + }); }); }); diff --git a/app/src/components/composio/ComposioConnectModal.tsx b/app/src/components/composio/ComposioConnectModal.tsx index 6aba375df..6aad7c156 100644 --- a/app/src/components/composio/ComposioConnectModal.tsx +++ b/app/src/components/composio/ComposioConnectModal.tsx @@ -374,9 +374,13 @@ export default function ComposioConnectModal({ resp.connectionId ); setConnectUrl(resp.connectUrl); - await openUrl(resp.connectUrl); setPhase('waiting'); startPolling(); + try { + await openUrl(resp.connectUrl); + } catch (openErr) { + console.warn('[composio][authorize] failed to open connectUrl:', openErr); + } } catch (err) { console.error( '[composio][authorize] failed toolkit=%s slug_check=%s',