diff --git a/app/auth/login/page.tsx b/app/auth/login/page.tsx index 0fb0ba6..ecb0765 100644 --- a/app/auth/login/page.tsx +++ b/app/auth/login/page.tsx @@ -6,15 +6,17 @@ import { useState } from "react" import { useRouter } from "next/navigation" import Link from "next/link" import { createClient } from "@/lib/supabase/client" -import { Film, Eye, Loader2 } from "lucide-react" +import { Film, Eye, Loader2, Mail } from "lucide-react" import { useLanguage } from "@/contexts/LanguageContext" import { LanguageToggle } from "@/components/language-toggle" +import { toast } from "sonner" export default function LoginPage() { const [email, setEmail] = useState("") const [password, setPassword] = useState("") const [error, setError] = useState(null) const [loading, setLoading] = useState(false) + const [resetLoading, setResetLoading] = useState(false) const router = useRouter() const { t } = useLanguage() @@ -22,6 +24,8 @@ export default function LoginPage() { e.preventDefault() setLoading(true) setError(null) + + console.log("Attempting login for:", email); const supabase = createClient() const { error } = await supabase.auth.signInWithPassword({ @@ -30,7 +34,8 @@ export default function LoginPage() { }) if (error) { - setError(t("auth.invalidCredentials")) + console.error("Login error:", error); + setError(error.message) setLoading(false) return } @@ -39,6 +44,29 @@ export default function LoginPage() { router.refresh() } + async function handleResetPassword() { + if (!email) { + setError("Bitte gib deine E-Mail-Adresse oben ein.") + return + } + + setResetLoading(true) + setError(null) + + const supabase = createClient() + const { error } = await supabase.auth.resetPasswordForEmail(email, { + redirectTo: `${window.location.origin}/auth/callback?next=/auth/update-password`, + }) + + if (error) { + setError(error.message) + setResetLoading(false) + } else { + toast.success("E-Mail zum Zurücksetzen des Passworts wurde gesendet.") + setResetLoading(false) + } + } + return (
@@ -108,6 +136,19 @@ export default function LoginPage() { + +

{t("auth.dontHaveAccount")}{" "} diff --git a/lib/supabase/client.ts b/lib/supabase/client.ts index c48a435..d52919d 100644 --- a/lib/supabase/client.ts +++ b/lib/supabase/client.ts @@ -1,8 +1,15 @@ import { createBrowserClient } from '@supabase/ssr' export function createClient() { + const url = process.env.NEXT_PUBLIC_SUPABASE_URL || "https://ekbpexbhuochrplzorce.supabase.co"; + const key = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY || "sb_publishable__UII_iKx3pgvLQvc1xrN1w_qnwP6JOv" || process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_DEFAULT_KEY; + + if (!url || !key) { + console.error("Supabase config missing!", { url: !!url, key: !!key }); + } + return createBrowserClient( - process.env.NEXT_PUBLIC_SUPABASE_URL!, - process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!, + url!, + key!, ) } diff --git a/lib/supabase/middleware.ts b/lib/supabase/middleware.ts index 1a477b7..758d61c 100644 --- a/lib/supabase/middleware.ts +++ b/lib/supabase/middleware.ts @@ -7,8 +7,8 @@ export async function updateSession(request: NextRequest) { }) const supabase = createServerClient( - process.env.NEXT_PUBLIC_SUPABASE_URL!, - process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!, + process.env.NEXT_PUBLIC_SUPABASE_URL || "https://ekbpexbhuochrplzorce.supabase.co"!, + process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY || "sb_publishable__UII_iKx3pgvLQvc1xrN1w_qnwP6JOv" || process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_DEFAULT_KEY!, { cookies: { getAll() { diff --git a/lib/supabase/server.ts b/lib/supabase/server.ts index e60931a..3d01bf7 100644 --- a/lib/supabase/server.ts +++ b/lib/supabase/server.ts @@ -5,8 +5,8 @@ export async function createClient() { const cookieStore = await cookies() return createServerClient( - process.env.NEXT_PUBLIC_SUPABASE_URL!, - process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!, + process.env.NEXT_PUBLIC_SUPABASE_URL || "https://ekbpexbhuochrplzorce.supabase.co"!, + process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY || "sb_publishable__UII_iKx3pgvLQvc1xrN1w_qnwP6JOv" || process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_DEFAULT_KEY!, { cookies: { getAll() { diff --git a/next-env.d.ts b/next-env.d.ts index c4b7818..9edff1c 100644 --- a/next-env.d.ts +++ b/next-env.d.ts @@ -1,6 +1,6 @@ /// /// -import "./.next/dev/types/routes.d.ts"; +import "./.next/types/routes.d.ts"; // NOTE: This file should not be edited // see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/public/sw.js b/public/sw.js index 6dd4e90..13992a6 100644 --- a/public/sw.js +++ b/public/sw.js @@ -39,8 +39,10 @@ self.addEventListener("fetch", (event) => { (cached) => cached || fetch(event.request).then((response) => { - const clone = response.clone() - caches.open(CACHE_NAME).then((cache) => cache.put(event.request, clone)) + if (response.status === 200 && event.request.method === 'GET') { + const clone = response.clone() + caches.open(CACHE_NAME).then((cache) => cache.put(event.request, clone)) + } return response }) ) @@ -52,10 +54,12 @@ self.addEventListener("fetch", (event) => { event.respondWith( fetch(event.request) .then((response) => { - const clone = response.clone() - caches.open(CACHE_NAME).then((cache) => cache.put(event.request, clone)) + if (response.status === 200 && event.request.method === 'GET') { + const clone = response.clone() + caches.open(CACHE_NAME).then((cache) => cache.put(event.request, clone)) + } return response }) .catch(() => caches.match(event.request)) ) -}) +}) \ No newline at end of file