diff --git a/frontend/src/settings/Connectors.test.tsx b/frontend/src/settings/Connectors.test.tsx
index cda9aae6..b8623122 100644
--- a/frontend/src/settings/Connectors.test.tsx
+++ b/frontend/src/settings/Connectors.test.tsx
@@ -2,7 +2,7 @@ import { configureStore } from '@reduxjs/toolkit';
import { act } from 'react';
import { createRoot, type Root } from 'react-dom/client';
import { Provider } from 'react-redux';
-import { MemoryRouter } from 'react-router-dom';
+import { Link, MemoryRouter } from 'react-router-dom';
vi.mock('react-i18next', () => ({
useTranslation: () => ({
@@ -144,6 +144,10 @@ describe('Connectors page', () => {
root.render(
+
,
@@ -378,6 +382,18 @@ describe('Connectors page', () => {
);
});
+ it('opens the page a ?connector= link names while already on the list', async () => {
+ await render();
+ expect(document.body.querySelector('[role="dialog"]')).toBeNull();
+ await act(async () =>
+ container
+ .querySelector('[data-testid="reconnect-link"]')!
+ .click(),
+ );
+ const dialog = document.body.querySelector('[role="dialog"]');
+ expect(dialog?.textContent).toContain('Google Drive');
+ });
+
it('shows a retry when the catalog fails to load', async () => {
service.getCatalog.mockResolvedValue({ success: false });
await render();
diff --git a/frontend/src/settings/Connectors.tsx b/frontend/src/settings/Connectors.tsx
index c8558e90..8991d76d 100644
--- a/frontend/src/settings/Connectors.tsx
+++ b/frontend/src/settings/Connectors.tsx
@@ -82,9 +82,15 @@ export default function Connectors() {
const [filter, setFilter] = useState(
initialFilter && FILTERS.includes(initialFilter) ? initialFilter : 'all',
);
- const [openKey, setOpenKey] = useState(
- searchParams.get('connector'),
- );
+ const connectorParam = searchParams.get('connector');
+ const [openKey, setOpenKey] = useState(connectorParam);
+ // A `?connector=` link followed while this page is already open (the
+ // global Reconnect toast) changes only the search: open what it names.
+ const [seenConnectorParam, setSeenConnectorParam] = useState(connectorParam);
+ if (connectorParam !== seenConnectorParam) {
+ setSeenConnectorParam(connectorParam);
+ if (connectorParam) setOpenKey(connectorParam);
+ }
const { launch, modals } = useConnectorLauncher();
useEffect(() => {