diff --git a/superset-frontend/src/pages/Login/index.tsx b/superset-frontend/src/pages/Login/index.tsx index 8c56a4c8c99..e6b53fa3c41 100644 --- a/superset-frontend/src/pages/Login/index.tsx +++ b/superset-frontend/src/pages/Login/index.tsx @@ -27,7 +27,7 @@ import { Typography, Icons, } from '@superset-ui/core/components'; -import { useState } from 'react'; +import { useState, useMemo } from 'react'; import { capitalize } from 'lodash/fp'; import getBootstrapData from 'src/utils/getBootstrapData'; @@ -79,6 +79,26 @@ export default function Login() { const [loading, setLoading] = useState(false); const bootstrapData = getBootstrapData(); + const nextUrl = useMemo(() => { + try { + const params = new URLSearchParams(window.location.search); + return params.get('next') || ''; + } catch (_error) { + return ''; + } + }, []); + + const loginEndpoint = useMemo( + () => (nextUrl ? `/login/?next=${encodeURIComponent(nextUrl)}` : '/login/'), + [nextUrl], + ); + + const buildProviderLoginUrl = (providerName: string) => { + const base = `/login/${providerName}`; + return nextUrl + ? `${base}${base.includes('?') ? '&' : '?'}next=${encodeURIComponent(nextUrl)}` + : base; + }; const authType: AuthType = bootstrapData.common.conf.AUTH_TYPE; const providers: Provider[] = bootstrapData.common.conf.AUTH_PROVIDERS; @@ -87,7 +107,7 @@ export default function Login() { const onFinish = (values: LoginForm) => { setLoading(true); - SupersetClient.postForm('/login/', values, '').finally(() => { + SupersetClient.postForm(loginEndpoint, values, '').finally(() => { setLoading(false); }); }; @@ -126,7 +146,7 @@ export default function Login() { {providers.map((provider: OIDProvider) => ( >