import { observer } from "mobx-react-lite"; import { useForm } from "react-hook-form"; import { Link } from "react-router-dom"; import styles from "../Login.module.scss"; import { Text } from "preact-i18n"; import { useState } from "preact/hooks"; import { Button, Category, Preloader, Tip } from "@revoltchat/ui"; import { I18nError } from "../../../context/Locale"; import WaveSVG from "../../settings/assets/wave.svg"; import { clientController } from "../../../controllers/client/ClientController"; import { takeError } from "../../../controllers/client/jsx/error"; import { IS_REVOLT } from "../../../version"; import FormField from "../FormField"; import { CaptchaBlock, CaptchaProps } from "./CaptchaBlock"; import { MailProvider } from "./MailProvider"; interface Props { page: "create" | "login" | "send_reset" | "reset" | "resend"; callback: (fields: { email: string; password: string; invite: string; captcha?: string; }) => Promise; } function getInviteCode() { if (typeof window === "undefined") return ""; const urlParams = new URLSearchParams(window.location.search); const code = urlParams.get("code"); return code ?? ""; } interface FormInputs { email: string; password: string; invite: string; } export const Form = observer(({ page, callback }: Props) => { const configuration = clientController.getServerConfig(); const [loading, setLoading] = useState(false); const [success, setSuccess] = useState(undefined); const [error, setGlobalError] = useState(undefined); const [captcha, setCaptcha] = useState(undefined); const { handleSubmit, register, errors, setError } = useForm({ defaultValues: { email: "", password: "", invite: getInviteCode(), }, }); async function onSubmit(data: FormInputs) { setGlobalError(undefined); setLoading(true); function onError(err: unknown) { setLoading(false); const error = takeError(err); switch (error) { case "email_in_use": return setError("email", { type: "", message: error }); case "unknown_user": return setError("email", { type: "", message: error }); case "invalid_invite": return setError("invite", { type: "", message: error }); } setGlobalError(error); } try { if ( configuration?.features.captcha.enabled && page !== "reset" && page !== "login" ) { setCaptcha({ onSuccess: async (captcha) => { setCaptcha(undefined); try { await callback({ ...data, captcha }); setSuccess(data.email); } catch (err) { onError(err); } }, onCancel: () => { setCaptcha(undefined); setLoading(false); }, }); } else { await callback(data); setSuccess(data.email); } } catch (err) { onError(err); } } if (typeof success !== "undefined") { return (
{configuration?.features.email ? ( <>
) : ( <>
)}
); } if (captcha) return ; if (loading) return ; return (
(app.revolt.chat)
{/* Preact / React typing incompatabilities */}
}> {page !== "reset" && ( )} {(page === "login" || page === "create" || page === "reset") && ( )} {configuration?.features.invite_only && page === "create" && ( )} {error && ( )} {page === "create" && ( {" "} )} {page === "login" && ( <> {" "} {" "} {" "} {!IS_REVOLT && ( <>
{" "} )} )} {(page === "reset" || page === "resend" || page === "send_reset") && ( <> )}
); });