feat(sidebar): add state persistence using localStorage

This commit is contained in:
Pablo Lara
2024-07-11 15:31:24 +02:00
parent 746b427943
commit f31a92ea98
2 changed files with 23 additions and 9 deletions
+3 -5
View File
@@ -43,11 +43,9 @@ export default function RootLayout({
)}
>
<Providers themeProps={{ attribute: "class", defaultTheme: "dark" }}>
<div className="flex items-center dark h-screen justify-center overflow-hidden">
<div className="flex h-dvh w-full">
<SidebarWrap />
<main className="w-full flex-1 flex-col p-4">{children}</main>
</div>
<div className="flex items-center h-dvh w-full justify-center overflow-hidden">
<SidebarWrap />
<main className="w-full flex-1 flex-col p-4">{children}</main>
</div>
</Providers>
</body>
+20 -4
View File
@@ -2,7 +2,7 @@
import { Icon } from "@iconify/react";
import { Button, ScrollShadow, Spacer, Tooltip } from "@nextui-org/react";
import React from "react";
import React, { useCallback, useEffect, useState } from "react";
import { useMediaQuery } from "usehooks-ts";
import { cn } from "@/utils/cn";
@@ -14,15 +14,31 @@ import { sectionItemsWithTeams } from "./SidebarItems";
import UserAvatar from "./UserAvatar";
export const SidebarWrap = () => {
const [isCollapsed, setIsCollapsed] = React.useState(false);
const [isCollapsed, setIsCollapsed] = useState(false);
const [isLoaded, setIsLoaded] = useState(false);
const isMobile = useMediaQuery("(max-width: 768px)");
const isCompact = isCollapsed || isMobile;
const onToggle = React.useCallback(() => {
setIsCollapsed((prev) => !prev);
useEffect(() => {
const savedState = localStorage.getItem("isCollapsed");
if (savedState !== null) {
setIsCollapsed(JSON.parse(savedState));
}
setIsLoaded(true);
}, []);
const onToggle = useCallback(() => {
setIsCollapsed((prev) => {
const newState = !prev;
localStorage.setItem("isCollapsed", JSON.stringify(newState));
return newState;
});
}, []);
if (!isLoaded) return null;
return (
<div
className={cn(