import { Button } from "@/components/ui/button"; import { Card, CardDescription, CardFooter, CardHeader, CardTitle, } from "@/components/ui/card"; import { useAppContext } from "@/context/app-context"; import { useUserContext } from "@/context/user-context"; import { isValidUrl } from "@/lib/utils"; import { Trans, useTranslation } from "react-i18next"; import { Navigate, useLocation, useNavigate } from "react-router"; import { useEffect, useState } from "react"; export const ContinuePage = () => { const { cookieDomain } = useAppContext(); const { isLoggedIn } = useUserContext(); const { search } = useLocation(); const { t } = useTranslation(); const navigate = useNavigate(); const [loading, setLoading] = useState(false); const [showRedirectButton, setShowRedirectButton] = useState(false); const searchParams = new URLSearchParams(search); const redirectUri = searchParams.get("redirect_uri"); const isValidRedirectUri = redirectUri !== null ? isValidUrl(redirectUri) : false; const redirectUriObj = isValidRedirectUri ? new URL(redirectUri as string) : null; const isTrustedRedirectUri = redirectUriObj !== null ? redirectUriObj.hostname === cookieDomain || redirectUriObj.hostname.endsWith(`.${cookieDomain}`) : false; const isAllowedRedirectProto = redirectUriObj !== null ? redirectUriObj.protocol === "https:" || redirectUriObj.protocol === "http:" : false; const isHttpsDowngrade = redirectUriObj !== null ? redirectUriObj.protocol === "http:" && window.location.protocol === "https:" : false; const handleRedirect = () => { setLoading(true); window.location.assign(redirectUriObj!.toString()); }; useEffect(() => { if ( !isLoggedIn || !isValidRedirectUri || !isTrustedRedirectUri || !isAllowedRedirectProto || isHttpsDowngrade ) { return; } const auto = setTimeout(() => { handleRedirect(); }, 100); const reveal = setTimeout(() => { setLoading(false); setShowRedirectButton(true); }, 1000); return () => { clearTimeout(auto); clearTimeout(reveal); }; }, []); if (!isLoggedIn) { return ( ); } if (!isValidRedirectUri || !isAllowedRedirectProto) { return ; } if (!isTrustedRedirectUri) { return ( {t("continueUntrustedRedirectTitle")} , }} values={{ cookieDomain }} /> ); } if (isHttpsDowngrade) { return ( {t("continueInsecureRedirectTitle")} , }} /> ); } return ( {t("continueRedirectingTitle")} {t("continueRedirectingSubtitle")} {showRedirectButton && ( )} ); };