import { useCallback, useState } from "react"; import { useRouter } from "next/router"; // types import { TUserProfile } from "@plane/types"; // mobx store import { useMobxStore } from "@/lib/mobx/store-provider"; type UseAuthRedirectionProps = { error: any | null; isRedirecting: boolean; handleRedirection: () => Promise; }; const useAuthRedirection = (): UseAuthRedirectionProps => { // states const [isRedirecting, setIsRedirecting] = useState(false); const [error, setError] = useState(null); // router const router = useRouter(); const { next_path } = router.query; // mobx store const { profile: { fetchUserProfile }, } = useMobxStore(); const isValidURL = (url: string): boolean => { const disallowedSchemes = /^(https?|ftp):\/\//i; return !disallowedSchemes.test(url); }; const getAuthRedirectionUrl = useCallback( async (profile: TUserProfile | undefined) => { try { if (!profile) return "/"; const isOnboard = profile.onboarding_step?.profile_complete; if (isOnboard) { // if next_path is provided, redirect the user to that url if (next_path) { if (isValidURL(next_path.toString())) { return next_path.toString(); } else { return "/"; } } } else { // if the user profile is not complete, redirect them to the onboarding page to complete their profile and then redirect them to the next path if (next_path) return `/onboarding?next_path=${next_path}`; else return "/onboarding"; } return "/"; } catch { setIsRedirecting(false); console.error("Error in handleSignInRedirection:", error); setError(error); } }, [next_path] ); const updateUserProfileInfo = useCallback(async () => { setIsRedirecting(true); await fetchUserProfile() .then(async (profile) => { if (profile) await getAuthRedirectionUrl(profile) .then((url: string | undefined) => { if (url) { router.push(url); } if (!url || url === "/") setIsRedirecting(false); }) .catch((err) => { setError(err); setIsRedirecting(false); }); }) .catch((err) => { setError(err); setIsRedirecting(false); }); }, [fetchUserProfile, getAuthRedirectionUrl]); return { error, isRedirecting, handleRedirection: updateUserProfileInfo, }; }; export default useAuthRedirection;