diff --git a/package.json b/package.json
index 44839f2..aed7297 100644
--- a/package.json
+++ b/package.json
@@ -23,6 +23,7 @@
"@radix-ui/react-hover-card": "^1.0.7",
"@radix-ui/react-label": "^2.0.2",
"@radix-ui/react-menubar": "^1.0.4",
+ "@radix-ui/react-navigation-menu": "^1.1.4",
"@radix-ui/react-popover": "^1.0.7",
"@radix-ui/react-progress": "^1.0.3",
"@radix-ui/react-radio-group": "^1.1.3",
@@ -45,6 +46,7 @@
"embla-carousel-react": "^8.1.3",
"framer-motion": "^11.2.10",
"input-otp": "^1.2.4",
+ "lightweight-charts": "^4.1.4",
"lucide-react": "^0.387.0",
"next": "14.2.3",
"next-themes": "^0.3.0",
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
index 5fa9053..f5380d4 100644
--- a/src/app/layout.tsx
+++ b/src/app/layout.tsx
@@ -5,6 +5,8 @@ import {ThemeProvider} from "@/components/providers/theme-provider";
import type React from "react";
import {Footer} from "@/components/footer";
import {Header} from "@/components/header";
+import {PrimaryNavigationMenu} from "@/components/primary-nav";
+import {Providers} from "@/components/providers/providers";
export const metadata: Metadata = {
title: "YeloBit",
@@ -21,16 +23,14 @@ export default function RootLayout({
-
-
-
- {children}
-
-
+
+
+
+ {children}
+
+
);
diff --git a/src/components/account-dialog.tsx b/src/components/account-dialog.tsx
new file mode 100644
index 0000000..3fb4418
--- /dev/null
+++ b/src/components/account-dialog.tsx
@@ -0,0 +1,22 @@
+"use client"
+
+import {useContext} from "react";
+import {UserDataContext} from "@/components/providers/userdata-provider";
+import {AccountInfo} from "@/components/account-info";
+
+
+export function AccountDialog() {
+ const userContext = useContext(UserDataContext)
+
+ if (!userContext?.userData) {
+ userContext?.setUserData({name: "Mathis"})
+ return (Loading...
)
+ }
+
+ //TODO No account context
+
+ //TODO Loading context
+
+ //TODO Account context
+ return ()
+}
\ No newline at end of file
diff --git a/src/components/account-info.tsx b/src/components/account-info.tsx
new file mode 100644
index 0000000..a660cda
--- /dev/null
+++ b/src/components/account-info.tsx
@@ -0,0 +1,58 @@
+"use client"
+
+import {IUserData} from "@/interfaces/userdata.interface";
+import { Button } from "@/components/ui/button"
+import { Input } from "@/components/ui/input"
+import { Label } from "@/components/ui/label"
+import {
+ Sheet,
+ SheetClose,
+ SheetContent,
+ SheetDescription,
+ SheetFooter,
+ SheetHeader,
+ SheetTitle,
+ SheetTrigger,
+} from "@/components/ui/sheet"
+import {User} from "lucide-react";
+
+
+export function AccountInfo({userData}: {userData: IUserData}) {
+ return (
+
+
+
+
+
+
+ Edit profile
+
+ Make changes to your profile here. Click save when you're done.
+
+
+
+
+
+
+
+
+
+
+ )
+}
\ No newline at end of file
diff --git a/src/components/header.tsx b/src/components/header.tsx
index 6662c8c..72ca9ce 100644
--- a/src/components/header.tsx
+++ b/src/components/header.tsx
@@ -1,6 +1,7 @@
import Image from "next/image";
import React from "react";
import {ThemeBtnSelector} from "@/components/theme-btn-selector";
+import {AccountDialog} from "@/components/account-dialog";
export function Header({title, children}: {title?: string, children?: React.ReactNode}) {
@@ -16,7 +17,8 @@ export function Header({title, children}: {title?: string, children?: React.Reac
{children}
-
+
diff --git a/src/components/providers/providers.tsx b/src/components/providers/providers.tsx
new file mode 100644
index 0000000..6dd48f0
--- /dev/null
+++ b/src/components/providers/providers.tsx
@@ -0,0 +1,23 @@
+"use client"
+import React from "react";
+import {Header} from "@/components/header";
+import {Footer} from "@/components/footer";
+import {ThemeProvider} from "@/components/providers/theme-provider";
+import {UserDataProvider} from "@/components/providers/userdata-provider";
+
+
+export function Providers({children}: { children: React.ReactNode }) {
+
+
+ return (
+
+
+ {children}
+
+
+ )
+}
\ No newline at end of file
diff --git a/src/components/providers/userdata-provider.tsx b/src/components/providers/userdata-provider.tsx
new file mode 100644
index 0000000..5d0d71a
--- /dev/null
+++ b/src/components/providers/userdata-provider.tsx
@@ -0,0 +1,21 @@
+import React from 'react';
+import {IUserData} from "@/interfaces/userdata.interface";
+import {useEncodedLocalStorage} from "@/services/localStorage";
+
+export interface IUserDataProvider {
+ userData: IUserData | undefined;
+ setUserData: React.Dispatch
>
+}
+
+export const UserDataContext = React.createContext(undefined);
+
+export const UserDataProvider = ({children}: {children: React.ReactNode}) => {
+ const [userData, setUserData] = useEncodedLocalStorage("user_data", undefined);
+
+
+ return (
+
+ {children}
+
+ );
+};
\ No newline at end of file
diff --git a/src/interfaces/userdata.interface.ts b/src/interfaces/userdata.interface.ts
new file mode 100644
index 0000000..88ff7d9
--- /dev/null
+++ b/src/interfaces/userdata.interface.ts
@@ -0,0 +1,3 @@
+export interface IUserData {
+ name: string
+}
\ No newline at end of file
diff --git a/src/services/account.handler.ts b/src/services/account.handler.ts
new file mode 100644
index 0000000..c2337ed
--- /dev/null
+++ b/src/services/account.handler.ts
@@ -0,0 +1,14 @@
+"use client"
+
+import { createContext, useContext, useState } from 'react';
+import {IUserData} from "@/interfaces/userdata.interface";
+
+const UserDataContext = createContext(false)
+
+//TODO Run register task
+
+//TODO Run login task
+
+//TODO Run disconnect task
+
+//TODO Run update user data
\ No newline at end of file
diff --git a/src/services/exchange.handler.ts b/src/services/exchange.handler.ts
new file mode 100644
index 0000000..e69de29
diff --git a/src/services/localStorage.ts b/src/services/localStorage.ts
index f253553..e53b358 100644
--- a/src/services/localStorage.ts
+++ b/src/services/localStorage.ts
@@ -1,6 +1,6 @@
'use client'
-import React, {useEffect, useState} from "react";
+import React, {useEffect, useRef, useState} from "react";
/**
* A custom React hook that allows you to store and retrieve data in the browser's localStorage.
@@ -48,12 +48,20 @@ export function useLocalStorage(key: string, initial: T): [T, React.Dispatch<
* @return {readonly [T, React.Dispatch>]} - An array containing the encoded value and a function to update the encoded value.
*/
export function useEncodedLocalStorage(key: string, fallbackValue: T): readonly [T, React.Dispatch>] {
+ console.log("Pong !")
const [encodedValue, setEncodedValue] = useState(() => {
const stored = localStorage.getItem(key);
return stored ? safelyParse(stored, fallbackValue) : fallbackValue;
});
+
+ const prevValue = useRef(encodedValue);
+
useEffect(() => {
- localStorage.setItem(key, safelyStringify(encodedValue));
+ console.log({encodedValue})
+ if (!b64ValEqual(prevValue.current, encodedValue)) {
+ localStorage.setItem(key, safelyStringify(encodedValue));
+ }
+ prevValue.current = encodedValue; // Set ref to current value
}, [key, encodedValue]);
return [encodedValue, setEncodedValue] as const;
@@ -64,6 +72,12 @@ export function useEncodedLocalStorage(key: string, fallbackValue: T): readon
return fallback;
}
}
+
+ function b64ValEqual(v1: T, v2: T): boolean {
+ return btoa(JSON.stringify(v1)) === btoa(JSON.stringify(v2));
+ }
+
+
function safelyStringify(value: T): string {
try {
return btoa(JSON.stringify(value));