import { Form, Formik } from 'formik'
import { useSearchParams, Navigate } from 'react-router-dom'
import { Helmet } from 'react-helmet-async'
import { inferMutationInput, trpc } from '~/utils/trpc'
import IVButton from '~/components/IVButton'
import IVSpinner from '~/components/IVSpinner'
import { MeProvider, useMe } from '~/components/MeContext'
import IVAPIError from '~/components/IVAPIError'
import { logout } from '~/utils/auth'
function Container(props) {
return (
Join organization | Interval
{props.children}
)
}
function LoadingState(props) {
return (
{props.children ?? }
{props.children && (
)}
)
}
function AcceptInvitationPage() {
const { me } = useMe()
const joinOrg = trpc.useMutation('organization.join')
const [searchParams] = useSearchParams()
const invitationId = searchParams.get('token')
const signupCheck = trpc.useQuery(['auth.signup.check', { invitationId }], {
retry: false,
refetchOnWindowFocus: false,
})
if (!invitationId) {
return
}
const onLogout = async () => {
await logout()
window.location.reload()
}
if (signupCheck.isError) {
if (
signupCheck.error.message?.includes(
'this invitation is for another email address'
)
) {
return (
{signupCheck.error.message}
)
}
return (
)
}
if (!signupCheck.data) {
return
}
if (signupCheck.data.isSignupRequired) {
return
}
if (signupCheck.data.isLoginRequired) {
return (
)
}
// unlikely; helps w/ type safety
if (!signupCheck.data.invitation) {
return (
)
}
const onDecline = () => {
joinOrg.mutate(
{
invitationId,
accept: false,
},
{
async onSuccess() {
window.location.assign(`/dashboard`)
},
}
)
}
return (
Accept invitation
>
initialValues={{
invitationId,
accept: true,
}}
onSubmit={async values => {
if (joinOrg.isLoading) return
joinOrg.mutate(values, {
async onSuccess(res) {
window.location.assign(`/dashboard/${res?.organization.slug}`)
},
})
}}
>
)
}
export default function AcceptInvitationPageWrapper() {
return (
)
}