/** * Copyright (c) 2023-present Plane Software, Inc. and contributors * SPDX-License-Identifier: AGPL-3.0-only * See the LICENSE file for details. */ import type { ReactNode } from "react"; import { observer } from "mobx-react"; import { useSearchParams, usePathname } from "next/navigation"; import useSWR from "swr"; // components import { LogoSpinner } from "@/components/common/logo-spinner"; // helpers import { EPageTypes } from "@/helpers/authentication.helper"; // hooks import { useWorkspace } from "@/hooks/store/use-workspace"; import { useUser, useUserProfile, useUserSettings } from "@/hooks/store/user"; import { useAppRouter } from "@/hooks/use-app-router"; type TPageType = EPageTypes; type TAuthenticationWrapper = { children: ReactNode; pageType?: TPageType; }; const isValidURL = (url: string): boolean => { const disallowedSchemes = /^(https?|ftp):\/\//i; return !disallowedSchemes.test(url); }; export const AuthenticationWrapper = observer(function AuthenticationWrapper(props: TAuthenticationWrapper) { const pathname = usePathname(); const router = useAppRouter(); const searchParams = useSearchParams(); const nextPath = searchParams.get("next_path"); // props const { children, pageType = EPageTypes.AUTHENTICATED } = props; // hooks const { isLoading: isUserLoading, data: currentUser, fetchCurrentUser } = useUser(); const { data: currentUserProfile } = useUserProfile(); const { data: currentUserSettings } = useUserSettings(); const { loader: workspacesLoader, workspaces } = useWorkspace(); const { isLoading: isUserSWRLoading } = useSWR("USER_INFORMATION", async () => await fetchCurrentUser(), { revalidateOnFocus: false, shouldRetryOnError: false, }); const isUserOnboard = currentUserProfile?.is_onboarded || (currentUserProfile?.onboarding_step?.profile_complete && currentUserProfile?.onboarding_step?.workspace_create && currentUserProfile?.onboarding_step?.workspace_invite && currentUserProfile?.onboarding_step?.workspace_join) || false; const getWorkspaceRedirectionUrl = (): string => { let redirectionRoute = "/create-workspace"; // validating the nextPath from the router query if (nextPath && isValidURL(nextPath.toString())) { redirectionRoute = nextPath.toString(); return redirectionRoute; } // validate the last and fallback workspace_slug const currentWorkspaceSlug = currentUserSettings?.workspace?.last_workspace_slug || currentUserSettings?.workspace?.fallback_workspace_slug; // validate the current workspace_slug is available in the user's workspace list const isCurrentWorkspaceValid = Object.values(workspaces || {}).findIndex( (workspace) => workspace.slug === currentWorkspaceSlug ); if (isCurrentWorkspaceValid >= 0) redirectionRoute = `/${currentWorkspaceSlug}`; return redirectionRoute; }; if ((isUserSWRLoading || isUserLoading || workspacesLoader) && !currentUser?.id) return (