import type { InternalProvider, Theme } from "../types" import type React from "react" /** * The following errors are passed as error query parameters to the default or overridden sign-in page. * * [Documentation](https://next-auth.js.org/configuration/pages#sign-in-page) */ export type SignInErrorTypes = | "Signin" | "OAuthSignin" | "OAuthCallback" | "OAuthCreateAccount" | "EmailCreateAccount" | "Callback" | "OAuthAccountNotLinked" | "EmailSignin" | "CredentialsSignin" | "SessionRequired" | "default" export interface SignInServerPageParams { csrfToken: string providers: InternalProvider[] callbackUrl: string email: string error: SignInErrorTypes theme: Theme } function hexToRgba(hex?: string, alpha = 1) { if (!hex) { return } // Remove the "#" character if it's included hex = hex.replace(/^#/, "") // Expand 3-digit hex codes to their 6-digit equivalents if (hex.length === 3) { hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2] } // Parse the hex value to separate R, G, and B components const bigint = parseInt(hex, 16) const r = (bigint >> 16) & 255 const g = (bigint >> 8) & 255 const b = bigint & 255 // Ensure the alpha value is within the valid range [0, 1] alpha = Math.min(Math.max(alpha, 0), 1) // Construct the RGBA string const rgba = `rgba(${r}, ${g}, ${b}, ${alpha})` return rgba } export default function SigninPage(props: SignInServerPageParams) { const { csrfToken, providers, callbackUrl, theme, email, error: errorType, } = props // We only want to render providers const providersToRender = providers.filter((provider) => { if (provider.type === "oauth" || provider.type === "email") { // Always render oauth and email type providers return true } else if (provider.type === "credentials" && provider.credentials) { // Only render credentials type provider if credentials are defined return true } // Don't render other provider types return false }) if (typeof document !== "undefined" && theme.buttonText) { document.documentElement.style.setProperty( "--button-text-color", theme.buttonText ) } if (typeof document !== "undefined" && theme.brandColor) { document.documentElement.style.setProperty( "--brand-color", theme.brandColor ) } const errors: Record = { Signin: "Try signing in with a different account.", OAuthSignin: "Try signing in with a different account.", OAuthCallback: "Try signing in with a different account.", OAuthCreateAccount: "Try signing in with a different account.", EmailCreateAccount: "Try signing in with a different account.", Callback: "Try signing in with a different account.", OAuthAccountNotLinked: "To confirm your identity, sign in with the same account you used originally.", EmailSignin: "The e-mail could not be sent.", CredentialsSignin: "Sign in failed. Check the details you provided are correct.", SessionRequired: "Please sign in to access this page.", default: "Unable to sign in.", } const error = errorType && (errors[errorType] ?? errors.default) const providerLogoPath = "https://authjs.dev/img/providers" return (
{theme.brandColor && (