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 up
your account.} description="Verifying your invitation link…" >

Loading invitation…

); } if (loadError || !invite) { return ( This link
is 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.

Must include uppercase, lowercase, and a number.

{status.error &&

{status.error}

}
); }