import { ArrowRight } from "lucide-react"; import { useEffect, useState } from "react"; import { acceptInvite, previewInvite } from "../api"; import AuthLayout from "./AuthLayout"; import PasswordField from "./PasswordField"; function inviteTokenFromPath() { const match = window.location.pathname.match(/^\/invite\/([^/]+)/); return match ? decodeURIComponent(match[1]) : ""; } export default function InviteAcceptPage() { const token = inviteTokenFromPath(); const [invite, setInvite] = useState(null); const [loading, setLoading] = useState(true); const [loadError, setLoadError] = useState(""); const [status, setStatus] = useState({ loading: false, error: "" }); useEffect(() => { if (!token) { setLoadError("This invitation link is invalid."); setLoading(false); return; } previewInvite(token) .then((data) => setInvite(data)) .catch((error) => setLoadError(error.message)) .finally(() => setLoading(false)); }, [token]); async function handleSubmit(event) { event.preventDefault(); setStatus({ loading: true, error: "" }); const form = new FormData(event.currentTarget); const password = form.get("password"); const confirm = form.get("confirm_password"); if (password !== confirm) { setStatus({ loading: false, error: "Passwords do not match." }); return; } try { const result = await acceptInvite(token, { password }); sessionStorage.setItem("agmail_access_token", result.access_token); sessionStorage.setItem("agmail_account", JSON.stringify(result.account)); window.location.assign("/app"); } catch (error) { setStatus({ loading: false, error: error.message }); } } if (loading) { return ( Setting upyour account.>} description="Verifying your invitation link…" > Loading invitation… ); } if (loadError || !invite) { return ( This linkis not valid.>} description="The invitation may have expired or already been used." > {loadError || "Invitation not found."} Go to sign in ); } return ( Join {invite.organization}>} description={`${invite.invited_by} invited you to set up your work email.`} > <> Set up your account Your work email is {invite.work_email}. Choose a password to activate your inbox. Password Confirm password Must include uppercase, lowercase, and a number. {status.error && {status.error}} {status.loading ? "Activating…" : "Set up your account"} > ); }
Loading invitation…
{loadError || "Invitation not found."}
Go to sign in
Your work email is {invite.work_email}. Choose a password to activate your inbox.
Must include uppercase, lowercase, and a number.
{status.error}