import { TransientToken, UserInviteTokenData } from "@vertesia/common" import { Button, Modal, ModalBody, ModalTitle } from "@vertesia/ui/core" import { useEffect, useState } from "react" import { useUserSession } from "@vertesia/ui/session" import { useUITranslation } from '../../i18n/index.js' export function InviteAcceptModal() { const session = useUserSession() const { client, account } = session; const { t } = useUITranslation() const [showModal, setShowModal] = useState(false) const [invites, setInvites] = useState[]>([]) useEffect(() => { client.account.listInvites().then(invites => { if (invites.length > 0) { // Filter out legacy invites that do not have account data const notLegacyInvites = invites.filter(i => i.data.account); if (notLegacyInvites.length === 0) { console.log("No valid invites found, closing modal") return; } // If we have valid invites, show the modal console.log("Found valid invites", notLegacyInvites.length) setShowModal(true); setInvites(notLegacyInvites); } else { console.log("No invites found, closing modal") setShowModal(false); } }).catch(err => { console.error("Error fetching invites", err); }) }, [account?.id]) const closeModal = () => setShowModal(false) const accept = async (invite: TransientToken) => { await client.account.acceptInvite(invite.id); await session.authCallback; await session.fetchAccounts(); await session.fetchProjects(invite.data.account.id); const remainingInvites = invites.filter(i => i.id !== invite.id) const notLegacyInvites = remainingInvites.filter(i => i.data.account); if (notLegacyInvites.length > 0) { setInvites(notLegacyInvites); } else { closeModal(); } } const reject = async (invite: TransientToken) => { await client.account.rejectInvite(invite.id) const remainingInvites = invites.filter(i => i.id !== invite.id) setInvites(remainingInvites) if (remainingInvites.length === 0) { closeModal(); } } const inviteList = invites.map(invite => { if (!invite.data.account) { console.warn("Invite has no account data", invite); return null; // Skip rendering this invite } return (
{invite.data.account.name ?? invite.data.account}
{invite.data.project &&
- {invite.data.project.name}
}
Role: {invite.data.role}
{invite.data.invited_by &&
by {invite.data.invited_by.name ?? invite.data.invited_by}
}
) }) return (
{t('login.reviewInvites')}
You have received the following invites to join other accounts. Please review and accept or declined them.
{inviteList}
) }