import { Brand } from "@/components/ui/brand" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { SubmitButton } from "@/components/ui/submit-button" import { createClient } from "@/lib/supabase/server" import { Database } from "@/supabase/types" import { createServerClient } from "@supabase/ssr" import { get } from "@vercel/edge-config" import { Metadata } from "next" import { cookies, headers } from "next/headers" import { redirect } from "next/navigation" import initTranslations from "@/lib/i18n"; export const metadata: Metadata = { title: "Login" } export default async function Login({ searchParams, params: { locale }, }: { searchParams: { message: string; email?: string }; params: { locale: string }; }) { const cookieStore = cookies() const localeString = locale; const { t, resources } = await initTranslations(localeString, ['translation']); const supabase = createServerClient( process.env.NEXT_PUBLIC_SUPABASE_URL!, process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!, { cookies: { get(name: string) { return cookieStore.get(name)?.value } } } ) const session = (await supabase.auth.getSession()).data.session console.log("[login page]Login session:", session) if (session) { const { data: homeWorkspace, error } = await supabase .from("workspaces") .select("*") .eq("user_id", session.user.id) .eq("is_home", true) .single() if (!homeWorkspace) { throw new Error(error.message) } // console.log("[login page]======>Redirecting to workspace:", homeWorkspace.id) return redirect(`/${localeString}/${homeWorkspace.id}/chat`) } const signIn = async (formData: FormData) => { "use server" const email = formData.get("email") as string const password = formData.get("password") as string const cookieStore = cookies() const supabase = createClient(cookieStore) const { data, error } = await supabase.auth.signInWithPassword({ email, password }) if (error) { // console.log(`[login page]==================> ${localeString}/login?message=${error.message}`); return redirect(`/${localeString}/login?message=${error.message}`) // return redirect(`/${localeString}/login?message=signupNotAllowed&email=${encodeURIComponent(email)}`) } const { data: homeWorkspace, error: homeWorkspaceError } = await supabase .from("workspaces") .select("*") .eq("user_id", data.user.id) .eq("is_home", true) .single() if (!homeWorkspace) { //const fallbackMessage = String(t("login.unexpectedError")) throw new Error( homeWorkspaceError?.message || "An unexpected error occurred" // homeWorkspaceError?.message || t("login.unexpectedError") ) } return redirect(`/${localeString}/${homeWorkspace.id}/chat`) } const getEnvVarOrEdgeConfigValue = async (name: string) => { "use server" if (process.env.EDGE_CONFIG) { return await get(name) } return process.env[name] } const signUp = async (formData: FormData) => { "use server" const email = formData.get("email") as string const password = formData.get("password") as string const emailDomainWhitelistPatternsString = await getEnvVarOrEdgeConfigValue( "EMAIL_DOMAIN_WHITELIST" ) const emailDomainWhitelist = emailDomainWhitelistPatternsString?.trim() ? emailDomainWhitelistPatternsString?.split(",") : [] const emailWhitelistPatternsString = await getEnvVarOrEdgeConfigValue("EMAIL_WHITELIST") const emailWhitelist = emailWhitelistPatternsString?.trim() ? emailWhitelistPatternsString?.split(",") : [] // If there are whitelist patterns, check if the email is allowed to sign up if (emailDomainWhitelist.length > 0 || emailWhitelist.length > 0) { const domainMatch = emailDomainWhitelist?.includes(email.split("@")[1]) const emailMatch = emailWhitelist?.includes(email) if (!domainMatch && !emailMatch) { return redirect( `/${localeString}/login?message=Email ${email} is not allowed to sign up.` // `/${localeString}/login?message=signupNotAllowed&email=${encodeURIComponent(email)}` ) } } const cookieStore = cookies() const supabase = createClient(cookieStore) const { error } = await supabase.auth.signUp({ email, password, options: { // USE IF YOU WANT TO SEND EMAIL VERIFICATION, ALSO CHANGE TOML FILE // emailRedirectTo: `${origin}/auth/callback` } }) if (error) { console.error(error) return redirect(`/${localeString}/login?message=${error.message}`) } return redirect(`/${localeString}/setup`) // USE IF YOU WANT TO SEND EMAIL VERIFICATION, ALSO CHANGE TOML FILE // return redirect("/login?message=Check email to continue sign in process") } const handleResetPassword = async (formData: FormData) => { "use server" const origin = headers().get("origin") const email = formData.get("email") as string const cookieStore = cookies() const supabase = createClient(cookieStore) const { error } = await supabase.auth.resetPasswordForEmail(email, { redirectTo: `${origin}/auth/callback?next=${localeString}/login/password` }) if (error) { return redirect(`/${localeString}/login?message=${error.message}`) } // const emailtoResetMessage = String(t("login.checkEmailToReset")) // ← 这是字符串 // return redirect(`/${localeString}/login?message=${emailtoResetMessage}`) return redirect(`/${localeString}/login?message=Check email to reset password`) } let translatedMessage: string | null = null; if (searchParams.message === "signupNotAllowed") { translatedMessage = t("login.signupNotAllowed", { email: searchParams.email }); } else if (searchParams.message) { translatedMessage = t(`login.${searchParams.message}`); } return (
{t("login.loginButton")} {t("login.signUpButton")}
{t("login.forgotPassword")}
{/* {searchParams?.message && (

{searchParams.message}

)} */} {translatedMessage && (

{translatedMessage}

)}
) }