diff --git a/my-nextjs-app/src/app/dashboard/page.js b/my-nextjs-app/src/app/dashboard/page.js
index e175f55..ab8a61f 100644
--- a/my-nextjs-app/src/app/dashboard/page.js
+++ b/my-nextjs-app/src/app/dashboard/page.js
@@ -1,19 +1,38 @@
"use client";
import { useEffect, useState } from "react";
import { supabase } from "@/lib/supabase";
+import { getUserRole } from "@/lib/roles";
import { useRouter } from "next/navigation";
export default function Dashboard() {
const [user, setUser] = useState(null);
+ const [role, setRole] = useState("read"); // Default role
const router = useRouter();
useEffect(() => {
- const checkUser = async () => {
- const { data: user } = await supabase.auth.getUser();
- if (!user) router.push("/login");
- else setUser(user);
+ const fetchUserData = async () => {
+ const { data: { session }, error } = await supabase.auth.getSession();
+ console.log("Session:", session);
+
+ if (error || !session?.user) {
+ console.error("Session error:", error);
+ router.push("/login");
+ return;
+ }
+
+ setUser(session.user);
+
+ try {
+ const userRole = await getUserRole(session.user.id);
+ console.log("User Role:", userRole);
+ setRole(userRole);
+ } catch (error) {
+ console.error("Error fetching role:", error);
+ setRole("read"); // Default to read-only
+ }
};
- checkUser();
+
+ fetchUserData();
}, []);
const handleLogout = async () => {
@@ -24,6 +43,17 @@ export default function Dashboard() {
return (
Welcome, {user?.email || "Guest"}!
+
Your Role: {role}
+
+ {/* Conditional rendering based on role */}
+ {role === "write" && (
+
+
Editable Content
+
+
+
+ )}
+
diff --git a/my-nextjs-app/src/app/login/page.js b/my-nextjs-app/src/app/login/page.js
index 5b3288c..2e11fb3 100644
--- a/my-nextjs-app/src/app/login/page.js
+++ b/my-nextjs-app/src/app/login/page.js
@@ -10,14 +10,14 @@ export default function Login() {
const handleSignUp = async () => {
const { error } = await supabase.auth.signUp({ email, password });
- if (error) alert(error.message);
- else alert("Check your email for confirmation!");
+ error ? alert(error.message) : alert("Check your email for confirmation!");
};
const handleSignIn = async () => {
const { error } = await supabase.auth.signInWithPassword({ email, password });
- if (error) alert(error.message);
- else {
+ if (error) {
+ alert(error.message);
+ } else {
alert("Logged in successfully!");
router.push("/dashboard");
}
@@ -27,24 +27,10 @@ export default function Login() {
);
diff --git a/my-nextjs-app/src/lib/auth.js b/my-nextjs-app/src/lib/auth.js
index 629421a..0a10b01 100644
--- a/my-nextjs-app/src/lib/auth.js
+++ b/my-nextjs-app/src/lib/auth.js
@@ -1,11 +1,15 @@
import { supabase } from "./supabase";
export const getUser = async () => {
- const { data: user } = await supabase.auth.getUser();
+ const { data: user, error } = await supabase.auth.getUser();
+ if (error) {
+ console.error("Error fetching user:", error);
+ return null;
+ }
return user;
};
export const logout = async () => {
await supabase.auth.signOut();
- window.location.href = "/login";
+ window.location.href = "/login"; // Redirect to login after logout
};
diff --git a/my-nextjs-app/src/lib/roles.js b/my-nextjs-app/src/lib/roles.js
new file mode 100644
index 0000000..b6c25f4
--- /dev/null
+++ b/my-nextjs-app/src/lib/roles.js
@@ -0,0 +1,16 @@
+import { supabase } from "./supabase";
+
+export const getUserRole = async (userId) => {
+ const { data, error } = await supabase
+ .from("user_roles")
+ .select("role")
+ .eq("user_id", userId)
+ .maybeSingle();
+
+ if (error) {
+ console.error("Error fetching role:", error);
+ return "read"; // Default role if there's an error
+ }
+
+ return data?.role || "read"; // Default to "read" if no role is found
+};
diff --git a/my-nextjs-app/src/middlewares/middleware.js b/my-nextjs-app/src/middlewares/middleware.js
new file mode 100644
index 0000000..5f1649f
--- /dev/null
+++ b/my-nextjs-app/src/middlewares/middleware.js
@@ -0,0 +1,14 @@
+import { NextResponse } from "next/server";
+import { supabase } from "./lib/supabase";
+
+export async function middleware(req) {
+ const { data } = await supabase.auth.getUser();
+ if (!data?.user) {
+ return NextResponse.redirect(new URL("/login", req.url));
+ }
+ return NextResponse.next();
+}
+
+export const config = {
+ matcher: ["./dashboard"], // Protect the dashboard route
+};