compass/compass/app/home/layout.tsx
Prajwal Moharana fdbf4ffa40
Frontend loading indicator foster (#47)
* initial layout component but in sidebar only

* loading for sign out

* Add loading functionality for changing pages

---------

Co-authored-by: emmalynf <efoster@unc.edu>
2024-12-15 22:48:15 -05:00

71 lines
2.1 KiB
TypeScript

"use client";
import Sidebar from "@/components/Sidebar/Sidebar";
import React, { useState } from "react";
import { createClient } from "@/utils/supabase/client";
import { useEffect } from "react";
import { useRouter } from "next/navigation";
import User, { Role } from "@/utils/models/User";
import Loading from "@/components/auth/Loading";
export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
const [isSidebarOpen, setIsSidebarOpen] = useState(true);
const [user, setUser] = useState<User>();
const router = useRouter();
const [loading, setLoading] = useState(true);
useEffect(() => {
async function getUser() {
const supabase = createClient();
const { data, error } = await supabase.auth.getUser();
console.log(data, error);
if (error) {
console.log("Accessed home page but not logged in");
router.push("/auth/login");
return;
}
const userData = await fetch(
`${process.env.NEXT_PUBLIC_HOST}/api/user?uuid=${data.user.id}`
);
setUser(await userData.json());
setLoading(false);
}
getUser();
}, [router]);
return (
<div className="flex-row">
{user ? (
<div>
<Sidebar
name={user.username}
email={user.email}
setIsSidebarOpen={setIsSidebarOpen}
isSidebarOpen={isSidebarOpen}
isAdmin={user.role === Role.ADMIN}
loading={loading}
/>
<div
className={`flex-1 transition duration-300 ease-in-out ${
isSidebarOpen ? "ml-64" : "ml-0"
}`}
>
{children}
</div>
</div>
) : (
<Loading />
)}
</div>
);
}