mirror of
https://github.com/makeplane/plane
synced 2024-06-14 14:31:34 +00:00
95 lines
2.6 KiB
TypeScript
95 lines
2.6 KiB
TypeScript
|
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<void>;
|
||
|
};
|
||
|
|
||
|
const useAuthRedirection = (): UseAuthRedirectionProps => {
|
||
|
// states
|
||
|
const [isRedirecting, setIsRedirecting] = useState(false);
|
||
|
const [error, setError] = useState<any | null>(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;
|