import { Legal } from "./Legal"; import { Text } from "preact-i18n"; import { Link } from "react-router-dom"; import { useState } from "preact/hooks"; import styles from "../Login.module.scss"; import { useForm } from "react-hook-form"; import { MailProvider } from "./MailProvider"; import { CheckCircle, Mail } from "@styled-icons/feather"; import { CaptchaBlock, CaptchaProps } from "./CaptchaBlock"; import { takeError } from "../../../context/revoltjs/error"; import { RevoltClient } from "../../../context/revoltjs/RevoltClient"; import FormField from "../FormField"; import Button from "../../../components/ui/Button"; import Overline from "../../../components/ui/Overline"; import Preloader from "../../../components/ui/Preloader"; 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 ?? ''; } export function Form({ page, callback }: Props) { 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: { email: string; password: string; invite: string; }) { setGlobalError(undefined); setLoading(true); function onError(err: any) { 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 ( RevoltClient.configuration?.features.captcha.enabled && page !== "reset" ) { 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 (
{RevoltClient.configuration?.features.email ? ( <>

) : ( <>

)}
); } if (captcha) return ; if (loading) return ; return (
{page !== "reset" && ( )} {(page === "login" || page === "create" || page === "reset") && ( )} {RevoltClient.configuration?.features.invite_only && page === "create" && ( )} {error && ( )} {page === "create" && ( <> )} {page === "login" && ( <> )} {(page === "reset" || page === "resend" || page === "send_reset") && ( <> )}
); }