import { useAdminAcceptInvite, useAdminLogin } from "medusa-react" import qs from "qs" import { useState } from "react" import { useForm } from "react-hook-form" import { decodeToken } from "react-jwt" import { useLocation, useNavigate } from "react-router-dom" import InputError from "../components/atoms/input-error" import Button from "../components/fundamentals/button" import SigninInput from "../components/molecules/input-signin" import SEO from "../components/seo" import PublicLayout from "../components/templates/login-layout" import useNotification from "../hooks/use-notification" import { getErrorMessage } from "../utils/error-messages" import FormValidator from "../utils/form-validator" import { useAdminCreateAnalyticsConfig } from "../services/analytics" import { useAnalytics } from "../providers/analytics-provider" import AnalyticsConfigForm, { AnalyticsConfigFormType, } from "../components/organisms/analytics-config-form" import { nestedForm } from "../utils/nested-form" import { useFeatureFlag } from "../providers/feature-flag-provider" type FormValues = { password: string repeat_password: string first_name: string last_name: string analytics: AnalyticsConfigFormType } const InvitePage = () => { const location = useLocation() const parsed = qs.parse(location.search.substring(1)) const [signUp, setSignUp] = useState(false) const { trackUserEmail } = useAnalytics() const first_run = !!parsed.first_run let token: { iat: number invite_id: string role: string user_email: string } | null = null if (parsed?.token) { try { token = decodeToken(parsed.token as string) } catch (e) { token = null } } const form = useForm({ defaultValues: { first_name: "", last_name: "", password: "", repeat_password: "", analytics: { opt_out: false, anonymize: false, }, }, }) const { register, handleSubmit, formState: { errors }, setError, } = form const { isFeatureEnabled } = useFeatureFlag() const { mutateAsync: acceptInvite, isLoading: acceptInviteIsLoading } = useAdminAcceptInvite() const { mutateAsync: createAnalyticsConfig, isLoading: createAnalyticsConfigIsLoading, } = useAdminCreateAnalyticsConfig() const { mutateAsync: doLogin, isLoading: loginIsLoading } = useAdminLogin() const isLoading = acceptInviteIsLoading || createAnalyticsConfigIsLoading || loginIsLoading const navigate = useNavigate() const notification = useNotification() const handleAcceptInvite = handleSubmit(async (data: FormValues) => { if (data.password !== data.repeat_password) { setError( "repeat_password", { type: "manual", message: "Passwords do not match", }, { shouldFocus: true, } ) return } try { await acceptInvite({ token: parsed.token as string, user: { first_name: data.first_name, last_name: data.last_name, password: data.password, }, }) await doLogin({ email: token!.user_email, password: data.password }) const shouldTrackEmail = !data.analytics.anonymize && !data.analytics.opt_out && token?.user_email try { await createAnalyticsConfig(data.analytics) } catch (e) { // gracefully handle error if analytics are disabled } if (shouldTrackEmail) { trackUserEmail({ email: token?.user_email, }) } navigate("/a/orders") } catch (err) { notification("Error", getErrorMessage(err), "error") } }) if (!token) { return (

Invalid invite

The invite link you have used is invalid. Please contact your administrator.

Already have an account? Log in

) } return ( {signUp ? (

Create your Medusa account

Already signed up? Log in

) : (

{first_run ? `Let's get you started!` : `You have been invited to join the team`}

{first_run ? (

Create an admin account to access your
Medusa dashboard.

) : (

You can now join the team. Sign up below and get started
with your Medusa account right away.

)}
)}
) } export default InvitePage