diff --git a/frontend/app/app/admin-user-management/page.tsx b/frontend/app/app/admin-user-management/page.tsx index 54d67ff328..6995318b24 100644 --- a/frontend/app/app/admin-user-management/page.tsx +++ b/frontend/app/app/admin-user-management/page.tsx @@ -1,5 +1,10 @@ import AdminUserManagement from "@/components/admin-user-management/admin-user-management"; +import AuthPageWrapper from "@/components/auth/auth-page-wrapper"; export default function AdminUserManagementPage() { - return ; + return ( + + + + ); } diff --git a/frontend/app/app/questions/page.tsx b/frontend/app/app/questions/page.tsx index 66f5d5ade1..7d7c772d5f 100644 --- a/frontend/app/app/questions/page.tsx +++ b/frontend/app/app/questions/page.tsx @@ -1,10 +1,13 @@ +import AuthPageWrapper from "@/components/auth/auth-page-wrapper"; import QuestionListing from "@/components/questions/questions-listing"; import { Suspense } from "react"; export default function QuestionListingPage() { return ( - - - + + + + + ); } diff --git a/frontend/app/app/user-settings/[user_id]/page.tsx b/frontend/app/app/user-settings/[user_id]/page.tsx index 9306631582..d11c25ed1a 100644 --- a/frontend/app/app/user-settings/[user_id]/page.tsx +++ b/frontend/app/app/user-settings/[user_id]/page.tsx @@ -1,3 +1,4 @@ +import AuthPageWrapper from "@/components/auth/auth-page-wrapper"; import UserSettings from "@/components/user-settings/user-settings"; export default function UserSettingsPage({ @@ -5,5 +6,9 @@ export default function UserSettingsPage({ }: { params: { user_id: string }; }) { - return ; + return ( + + ; + + ); } diff --git a/frontend/app/layout.tsx b/frontend/app/layout.tsx index 02c134689e..c23d6ad151 100644 --- a/frontend/app/layout.tsx +++ b/frontend/app/layout.tsx @@ -4,6 +4,7 @@ import "./globals.css"; import { ThemeProvider } from "@/components/theme-provider"; import { Toaster } from "@/components/ui/toaster"; import AuthProvider from "@/app/auth/auth-context"; +import AuthPageWrapper from "@/components/auth/auth-page-wrapper"; import { Navbar } from "@/components/navbar"; const geistSans = localFont({ @@ -40,7 +41,7 @@ export default function RootLayout({ > - {children} + {children} diff --git a/frontend/components/admin-user-management/admin-user-management.tsx b/frontend/components/admin-user-management/admin-user-management.tsx index 370890fcee..f5665ddc72 100644 --- a/frontend/components/admin-user-management/admin-user-management.tsx +++ b/frontend/components/admin-user-management/admin-user-management.tsx @@ -15,7 +15,6 @@ import { import LoadingScreen from "@/components/common/loading-screen"; import AdminEditUserModal from "@/components/admin-user-management/admin-edit-user-modal"; import { PencilIcon, Trash2Icon } from "lucide-react"; -import AuthPageWrapper from "@/components/auth/auth-page-wrapper"; import { User, UserArraySchema } from "@/lib/schemas/user-schema"; const fetcher = async (url: string): Promise => { @@ -88,7 +87,7 @@ export default function AdminUserManagement() { }; return ( - + <>

User Management

-
+ ); } diff --git a/frontend/components/auth/auth-page-wrapper.tsx b/frontend/components/auth/auth-page-wrapper.tsx index c2e9bb7f85..254e5cc01f 100644 --- a/frontend/components/auth/auth-page-wrapper.tsx +++ b/frontend/components/auth/auth-page-wrapper.tsx @@ -6,10 +6,13 @@ import { useAuth } from "@/app/auth/auth-context"; import { Button } from "@/components/ui/button"; import { useRouter } from "next/navigation"; -type AuthCheck = (user: { isAdmin: boolean } | undefined | null) => boolean; +type AuthCheck = ( + user: { id: string; isAdmin: boolean } | undefined | null +) => boolean; interface AuthPageWrapperProps extends React.HTMLProps { children: ReactNode; + userId?: string; // User access rules authCheck?: AuthCheck; // Custom predicate which is true when user is to be granted access @@ -19,13 +22,14 @@ interface AuthPageWrapperProps extends React.HTMLProps { const AuthPageWrapper: React.FC = ({ children, + userId, ...props }) => { const auth = useAuth(); const router = useRouter(); const authCheck = ( - user: { isAdmin: boolean } | undefined | null + user: { id: string; isAdmin: boolean } | undefined | null ): boolean => { if (props?.requireLoggedIn && !user) { return false; @@ -33,6 +37,9 @@ const AuthPageWrapper: React.FC = ({ if (props?.requireAdmin && !user?.isAdmin) { return false; } + if (userId && user?.id !== userId) { + return false; + } if (props?.authCheck) { return props.authCheck(user); } @@ -53,7 +60,9 @@ const AuthPageWrapper: React.FC = ({