import { MetaFunction, json, LoaderFunctionArgs, redirect, ActionFunctionArgs, } from "@remix-run/node"; import { Form as RemixForm, Link, useActionData } from "@remix-run/react"; import Form from "react-bootstrap/Form"; import Button from "react-bootstrap/Button"; import Row from "react-bootstrap/Row"; import Col from "react-bootstrap/Col"; import { useTranslation } from "react-i18next"; import i18n from "~/i18next.server"; import serverRequest, { getToken, writeCookie } from "~/lib/request.server"; import { AuthResponse } from "~/lib/api/auth"; import { ApiError, ErrorCode } from "~/lib/api/error"; import ErrorAlert from "~/components/ErrorAlert"; import { User } from "~/lib/api/user"; export const meta: MetaFunction = ({ data }) => { return [{ title: `${data?.meta.title || "Log in"} - pronouns.cc` }]; }; export const loader = async ({ request }: LoaderFunctionArgs) => { const t = await i18n.getFixedT(request); const token = getToken(request); if (token) { try { await serverRequest("GET", "/users/@me", { token }); throw redirect("/?err=already-logged-in", 303); } catch (e) { // ignore } } return json({ meta: { title: t("log-in.title") }, }); }; export const action = async ({ request }: ActionFunctionArgs) => { const body = await request.formData(); const email = body.get("email") as string | null; const password = body.get("password") as string | null; console.log(email, password); try { const resp = await serverRequest("POST", "/auth/email/login", { body: { email, password }, }); return redirect("/", { status: 303, headers: { "Set-Cookie": writeCookie("pronounscc-token", resp.token), }, }); } catch (e) { return json({ error: e as ApiError }); } }; export default function LoginPage() { const { t } = useTranslation(); const actionData = useActionData(); return (

{t("log-in.form-title")}

{actionData?.error && }
{t("log-in.email")} {t("log-in.password")}

{t("log-in.3rd-party-title")}

); } function LoginError({ error }: { error: ApiError }) { const { t } = useTranslation(); if (error.code !== ErrorCode.UserNotFound) return ; return <>{t("log-in.invalid-credentials")}; }