import { json, LoaderFunctionArgs } from "@remix-run/node"; import { type ApiError, ErrorCode } from "~/lib/api/error"; import serverRequest, { writeCookie } from "~/lib/request.server"; import { CallbackResponse } from "~/lib/api/auth"; import { Form as RemixForm, Link, useLoaderData } from "@remix-run/react"; import { Trans, useTranslation } from "react-i18next"; import Form from "react-bootstrap/Form"; import Button from "react-bootstrap/Button"; export const loader = async ({ request }: LoaderFunctionArgs) => { const url = new URL(request.url); const code = url.searchParams.get("code"); const state = url.searchParams.get("state"); if (!code || !state) throw { status: 400, code: ErrorCode.BadRequest, message: "Missing code or state" } as ApiError; const resp = await serverRequest("POST", "/auth/discord/callback", { body: { code, state } }); if (resp.has_account) { return json( { hasAccount: true, user: resp.user!, ticket: null, remoteUser: null }, { headers: { "Set-Cookie": writeCookie("pronounscc-token", resp.token!) } } ); } return json({ hasAccount: false, user: null, ticket: resp.ticket!, remoteUser: resp.remote_username! }); }; // TODO: action function export default function DiscordCallbackPage() { const { t } = useTranslation(); const data = useLoaderData(); if (data.hasAccount) { const username = data.user!.username; return ( <>

{t("log-in.callback.success")}

{/* @ts-expect-error react-i18next handles interpolation here */} Welcome back, @{{username}}!
{t("log-in.callback.redirect-hint")}

); } return (
{t("log-in.callback.remote-username.discord")} {t("log-in.callback.username")}
); }