feature/share-libs
tsx 92 lines 2.53 KB
Raw
1 "use client";
2
3 import { AddressBar } from "../components/ui/address-bar";
4 import { GlobalNav } from "../components/ui/global-nav";
5 import "./globals.css";
6 import { useEffect, useState } from "react";
7 import { CurrentUser, CurrentUserType, db } from "../lib/db";
8 import { UserContext } from "../lib/current-user-context";
9 import { useLogger } from "../lib/logger";
10
11 enum State {
12 LOADING,
13 LOADED,
14 ERROR,
15 }
16
17 export default function RootLayout({
18 children,
19 }: {
20 children: React.ReactNode;
21 }) {
22 const log = useLogger("App");
23 const [state, setState] = useState(State.LOADING);
24 const [user, setUser] = useState<CurrentUser | null>(null);
25
26 const updateUser = (newUser: CurrentUser | null) => {
27 setUser(newUser);
28 };
29
30 const getCurrentUser = async () => {
31 try {
32 const result = await db.currentUser
33 .where({ type: CurrentUserType.MAIN })
34 .first();
35 log.debug("Result: ", result);
36 if (result) {
37 setUser(result);
38 }
39 setState(State.LOADED);
40 } catch (error) {
41 log.error(error);
42 setState(State.ERROR);
43 }
44 };
45
46 useEffect(() => {
47 getCurrentUser();
48 // eslint-disable-next-line react-hooks/exhaustive-deps
49 }, []);
50
51 if (state === State.LOADING) {
52 return (
53 <html lang="en" className="[color-scheme:dark]">
54 <body className="bg-gray-1100 overflow-y-scroll bg-[url('/grid.svg')] pb-36">
55 </body>
56 </html>
57 );
58 }
59
60 if (state === State.ERROR) {
61 return (
62 <html lang="en" className="[color-scheme:dark]">
63 <body className="bg-gray-1100 overflow-y-scroll bg-[url('/grid.svg')] pb-36">
64 </body>
65 </html>
66 );
67 }
68
69 return (
70 <html lang="en" className="[color-scheme:dark]">
71 <body className="bg-gray-1100 overflow-none bg-[url('/grid.svg')] pb-36">
72 <UserContext.Provider value={{ user, updateUser }}>
73 <GlobalNav />
74 <div className="lg:pl-72">
75 <div className="fixed top-0 w-full bg-vc-border-gradient rounded-lg p-px shadow-lg shadow-black/20">
76 <div className="rounded-lg bg-black">
77 <AddressBar />
78 </div>
79 </div>
80 <div className="mx-auto max-w-4xl space-y-8 px-2 mt-10 lg:px-8 lg:py-8">
81 <div className="bg-vc-border-gradient rounded-lg p-px shadow-lg shadow-black/20">
82 <div className="rounded-lg bg-black p-3.5 lg:p-6">
83 {children}
84 </div>
85 </div>
86 </div>
87 </div>
88 </UserContext.Provider>
89 </body>
90 </html>
91 );
92 }