in src/app/(proper_react)/(redesign)/(authenticated)/user/(dashboard)/settings/actions.ts [50:146]
export async function onAddEmail(
_prevState: AddEmailFormState,
formData: FormData,
): Promise<AddEmailFormState> {
// If `_reset` is set returning `success: false` resets the `useActionState`
// we are calling this server action from.
if (formData.get("_reset")) {
return {
success: false,
};
}
const l10n = getL10n(await getAcceptLangHeaderInServerComponents());
const session = await getServerSession();
if (!session?.user.subscriber?.fxa_uid) {
return {
success: false,
error: "add-email-without-active-session",
errorMessage: l10n.getString("user-add-invalid-email"),
};
}
const subscriber = (await getSubscriberByFxaUid(
session.user.subscriber?.fxa_uid,
)) as SubscriberRow | null;
if (!subscriber) {
return {
success: false,
error: "no-subscriber-data-found",
errorMessage: l10n.getString("user-add-invalid-email"),
};
}
const submittedAddress = formData.get("newEmailAddress");
const validatedEmailAddress =
typeof submittedAddress === "string"
? validateEmailAddress(submittedAddress)
: null;
if (validatedEmailAddress === null) {
return {
success: false,
error: "invalid-email",
errorMessage: l10n.getString("user-add-invalid-email"),
};
}
const maxNumEmailAddresses = hasPremium(subscriber)
? CONST_MAX_NUM_ADDRESSES_PLUS
: CONST_MAX_NUM_ADDRESSES;
const existingAddresses = [session.user.email]
.concat(subscriber.email_addresses.map((emailRow) => emailRow.email))
.map((address) => address.toLowerCase());
if (existingAddresses.length >= maxNumEmailAddresses) {
return {
success: false,
error: "too-many-emails",
errorMessage: l10n.getString("user-add-too-many-emails"),
};
}
if (existingAddresses.includes(validatedEmailAddress.email.toLowerCase())) {
return {
success: false,
error: "address-already-added",
errorMessage: l10n.getString("user-add-duplicate-email"),
};
}
try {
const unverifiedSubscriber = await addSubscriberUnverifiedEmailHash(
subscriber,
validatedEmailAddress.email,
);
await initEmail();
await sendVerificationEmail(subscriber, unverifiedSubscriber.id);
revalidatePath("/user/settings");
return {
success: true,
submittedAddress: validatedEmailAddress.email,
};
} catch (e) {
if (e instanceof Error && e.message === "error-email-validation-pending") {
return {
success: false,
error: "verification-email-just-sent",
errorMessage: l10n.getString("user-add-verification-email-just-sent"),
};
}
return {
success: false,
error: "unknown-error",
errorMessage: l10n.getString("user-add-unknown-error"),
};
}
}