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(() => {