import { useRouter } from "next/router"; import { t } from "@lingui/core/macro"; import { env } from "next-runtime-env"; import { useEffect, useState } from "react"; import { authClient } from "@kan/auth/client"; import Button from "~/components/Button"; import LoadingSpinner from "~/components/LoadingSpinner"; import { PageHead } from "~/components/PageHead"; import PatternedBackground from "~/components/PatternedBackground"; import { api } from "~/utils/api"; export default function InvitePage() { const router = useRouter(); const { code } = router.query; const [isProcessing, setIsProcessing] = useState(false); const [error, setError] = useState(null); const { data: session, isPending: isSessionLoading } = authClient.useSession(); const isCloudEnv = env("NEXT_PUBLIC_KAN_ENV") === "cloud"; const inviteCode = Array.isArray(code) ? code[0] : code; const acceptInviteMutation = api.member.acceptInviteLink.useMutation({ onSuccess: (result) => { if (result.success) { return router.push( `/boards?workspacePublicId=${result.workspacePublicId}`, ); } }, onError: (error) => { if (error.data?.code === "CONFLICT") { return router.push(`/boards`); } setError( error.message || t`Failed to accept invitation. Please try again later, or contact customer support.`, ); setIsProcessing(false); }, }); const { data: inviteInfo, isLoading: isInviteInfoLoading, isError: isInviteInfoError, } = api.member.getInviteByCode.useQuery( { inviteCode: inviteCode ?? "" }, { enabled: !!inviteCode, retry: false, }, ); // Auto accept invite if user is logged in useEffect(() => { if (session?.user.id && inviteCode && inviteInfo && !error) { setIsProcessing(true); setError(null); acceptInviteMutation.mutate({ inviteCode, }); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [session?.user.id, inviteCode, inviteInfo, error]); if ( !isInviteInfoError && !error && (session?.user.id || isInviteInfoLoading || isSessionLoading) ) { return ( <>
); } const PageWrapper = ({ children }: { children: React.ReactNode }) => { return ( <> {children} ); }; if (isInviteInfoError || (!isInviteInfoLoading && !inviteInfo)) { return (

{t`Invalid invitation`}

{t`This invitation link is invalid or has expired.`}

); } return (

{t`Join workspace`}

{!error ? (

{isCloudEnv ? t`You've been invited to join a workspace on kan.bn.` : t`You've been invited to join a workspace.`}

) : (

{error}

)}
{session?.user.id ? ( ) : ( <> )}
); }