diff --git a/front/packages/ui/src/login/login.tsx b/front/packages/ui/src/login/login.tsx index 3d276251..2a2a8fba 100644 --- a/front/packages/ui/src/login/login.tsx +++ b/front/packages/ui/src/login/login.tsx @@ -38,11 +38,11 @@ export const cleanApiUrl = (apiUrl: string) => { return apiUrl + "/api"; }; -export const LoginPage: QueryPage = () => { +export const LoginPage: QueryPage<{ error?: string }> = ({ error: initialError }) => { const [apiUrl, setApiUrl] = useState(""); const [username, setUsername] = useState(""); const [password, setPassword] = useState(""); - const [error, setError] = useState(undefined); + const [error, setError] = useState(initialError); const router = useRouter(); const { t } = useTranslation(); diff --git a/front/packages/ui/src/login/oidc.tsx b/front/packages/ui/src/login/oidc.tsx index 299bc7e8..7caad26e 100644 --- a/front/packages/ui/src/login/oidc.tsx +++ b/front/packages/ui/src/login/oidc.tsx @@ -19,6 +19,7 @@ */ import { + KyooErrors, QueryIdentifier, QueryPage, ServerInfo, @@ -30,7 +31,7 @@ import { Button, HR, P, Skeleton, ts } from "@kyoo/primitives"; import { View, ImageBackground } from "react-native"; import { percent, rem, useYoshiki } from "yoshiki/native"; import { useTranslation } from "react-i18next"; -import { useEffect, useState } from "react"; +import { useEffect, useRef, useState } from "react"; import { useRouter } from "solito/router"; import { ErrorView } from "../errors"; @@ -95,23 +96,30 @@ export const OidcCallbackPage: QueryPage<{ provider: string; code: string; error code, error, }) => { - const [err, setErr] = useState(); + const hasRun = useRef(false); const router = useRouter(); useEffect(() => { - async function run() { - if (error) { - setErr(error); - return; - } - const { error: loginError } = await oidcLogin(provider, code); - setErr(loginError); - if (loginError) return; - router.replace("/", undefined, { + if (hasRun.current) return; + hasRun.current = true; + + function onError(error: string) { + router.replace(`/login?error=${error}`, undefined, { experimental: { nativeBehavior: "stack-replace", isNestedNavigator: false }, }); } - run(); + async function run() { + const { error: loginError } = await oidcLogin(provider, code); + if (loginError) onError(loginError); + else { + router.replace("/", undefined, { + experimental: { nativeBehavior: "stack-replace", isNestedNavigator: false }, + }); + } + } + + if (error) onError(error); + else run(); }, [provider, code, router, error]); - return

{err ?? "Loading"}

; + return

{"Loading"}

; };