import type { TFunction } from "i18next"; import { createPortal } from "react-dom"; import { useTranslation } from "react-i18next"; import { useSearchParams } from "react-router"; import { SendouDialog } from "~/components/elements/Dialog"; import { useUser } from "~/features/auth/core/user"; import { useHydrated } from "~/hooks/useHydrated"; import { SENDOU_INK_DISCORD_URL } from "~/utils/urls"; import styles from "./UserItem.module.css"; export function AuthErrorDialog() { const { t } = useTranslation(); const isHydrated = useHydrated(); const user = useUser(); const [searchParams] = useSearchParams(); const authError = searchParams.get("authError"); if (authError == null || !isHydrated || user) return null; return createPortal(
{authErrorContent(authError, t)}
, document.body, ); } function authErrorContent(authError: string, t: TFunction) { switch (authError) { case "aborted": return t("auth.errors.discordPermissions"); case "discordOverloaded": return ( <> {t("auth.errors.discordOverloaded")}{" "} {SENDOU_INK_DISCORD_URL} ); case "unverifiedEmail": return t("auth.errors.unverifiedEmail"); case "browserPrivacy": return t("auth.errors.browserPrivacy"); default: return ( <> {t("auth.errors.unknown")}{" "} {SENDOU_INK_DISCORD_URL} ); } }