import { CheckSquare } from 'lucide-react' import Link from 'next/link' import { useRouter } from 'next/router' import { toast } from 'sonner' import { useIsLoggedIn, useParams } from 'common' import { useOrganizationAcceptInvitationMutation } from 'data/organization-members/organization-invitation-accept-mutation' import { useOrganizationInvitationTokenQuery } from 'data/organization-members/organization-invitation-token-query' import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' import { useProfile } from 'lib/profile' import { Button, cn } from 'ui' import { Admonition, GenericSkeletonLoader } from 'ui-patterns' import { OrganizationInviteError } from './OrganizationInviteError' export const OrganizationInvite = () => { const router = useRouter() const isLoggedIn = useIsLoggedIn() const { profile, isLoading: isLoadingProfile } = useProfile() const { slug, token } = useParams() const isSignUpEnabled = useIsFeatureEnabled('dashboard_auth:sign_up') const { data, error, isSuccess: isSuccessInvitation, isError: isErrorInvitation, isPending: isLoadingInvitation, } = useOrganizationInvitationTokenQuery( { slug, token }, { retry: false, refetchOnWindowFocus: false, enabled: !!profile, } ) const hasError = isErrorInvitation || (isSuccessInvitation && (data.token_does_not_exist || data.expired_token || !data.email_match)) const inviteIsNoLongerValid = error?.code === 401 && error?.message.includes('Failed to retrieve organization') const organizationName = isSuccessInvitation ? data?.organization_name : 'An organization' const loginRedirectLink = `/sign-in?returnTo=${encodeURIComponent(`/join?token=${token}&slug=${slug}`)}` const signupRedirectLink = `/sign-up?returnTo=${encodeURIComponent(`/join?token=${token}&slug=${slug}`)}` const { mutate: joinOrganization, isPending: isJoining } = useOrganizationAcceptInvitationMutation({ onSuccess: () => { router.push('/organizations') }, onError: (error) => { toast.error(`Failed to join organization: ${error.message}`) }, }) async function handleJoinOrganization() { if (!slug) return console.error('Slug is required') if (!token) return console.error('Token is required') joinOrganization({ slug, token }) } return (
You have been invited to join
{organizationName}
{isSuccessInvitation && ({`Organization slug: ${slug}`}
)}