Merge pull request #27 from ATLAS-PJK-GM007/selly/frontend
Selly/frontend
This commit is contained in:
@@ -13,21 +13,40 @@ import {
|
|||||||
ChartBar,
|
ChartBar,
|
||||||
} from "lucide-react";
|
} from "lucide-react";
|
||||||
import { MobileNav } from "./mobile-nav";
|
import { MobileNav } from "./mobile-nav";
|
||||||
|
import { useAuthStore } from "@/store/auth-store";
|
||||||
|
import { useUiStore } from "@/store/ui-store";
|
||||||
|
|
||||||
const NAV_ITEMS = [
|
const NAV_ITEMS = [
|
||||||
{ path: "/dashboard", label: "Dashboard", icon: LayoutDashboard },
|
{ path: "/dashboard", label: "Dashboard", icon: LayoutDashboard },
|
||||||
{ path: "/scan", label: "Pindai Daun", icon: Scan },
|
{ path: "/scan", label: "Pindai Daun", icon: Scan },
|
||||||
{ path: "/diagnoses", label: "Diagnosa", icon: Activity },
|
{ path: "/diagnoses", label: "Diagnosa", icon: Activity },
|
||||||
{ path: "/catalog", label: "Pustaka", icon: BookOpen, altPath: "/library" },
|
{ path: "/catalog", label: "Pustaka", icon: BookOpen, altPath: "/library" },
|
||||||
{ path: "/expert/reviews", label: "Tinjauan Pakar", icon: UserCheck },
|
{
|
||||||
{ path: "/telemetry", label: "Telemetry", icon: ChartBar },
|
path: "/expert/reviews",
|
||||||
|
label: "Tinjauan Pakar",
|
||||||
|
icon: UserCheck,
|
||||||
|
expertOnly: true,
|
||||||
|
},
|
||||||
|
{ path: "/telemetry", label: "Telemetry", icon: ChartBar, expertOnly: true },
|
||||||
];
|
];
|
||||||
|
|
||||||
export function Sidebar() {
|
export function Sidebar() {
|
||||||
const location = useLocation();
|
const location = useLocation();
|
||||||
const [isSidebarOpen, setIsSidebarOpen] = useState(true);
|
|
||||||
const [mobileMenuOpen, setMobileMenuOpen] = useState(false);
|
const [mobileMenuOpen, setMobileMenuOpen] = useState(false);
|
||||||
|
|
||||||
|
const isSidebarOpen = useUiStore((state) => state.isSidebarOpen);
|
||||||
|
const setIsSidebarOpen = useUiStore((state) => state.setIsSidebarOpen);
|
||||||
|
|
||||||
|
const user = useAuthStore((state) => state.user);
|
||||||
|
const isExpert = user?.role === "expert";
|
||||||
|
|
||||||
|
const filteredNavItems = NAV_ITEMS.filter((item) => {
|
||||||
|
if (!item.expertOnly || isExpert) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
const isActive = (path: string, altPath?: string) => {
|
const isActive = (path: string, altPath?: string) => {
|
||||||
if (path === "/dashboard" || path === "/scan") {
|
if (path === "/dashboard" || path === "/scan") {
|
||||||
return location.pathname === path;
|
return location.pathname === path;
|
||||||
@@ -83,7 +102,12 @@ export function Sidebar() {
|
|||||||
<nav
|
<nav
|
||||||
className={`flex-1 overflow-y-auto py-6 flex flex-col gap-3 ${isSidebarOpen ? "px-5" : "px-0 items-center"}`}
|
className={`flex-1 overflow-y-auto py-6 flex flex-col gap-3 ${isSidebarOpen ? "px-5" : "px-0 items-center"}`}
|
||||||
>
|
>
|
||||||
{NAV_ITEMS.map((item) => {
|
{filteredNavItems.map((item) => {
|
||||||
|
// Skip expert-only items for non-expert users
|
||||||
|
if (item.expertOnly && !isExpert) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
const active = isActive(item.path, item.altPath);
|
const active = isActive(item.path, item.altPath);
|
||||||
const Icon = item.icon;
|
const Icon = item.icon;
|
||||||
|
|
||||||
@@ -92,7 +116,7 @@ export function Sidebar() {
|
|||||||
key={item.path}
|
key={item.path}
|
||||||
to={item.path}
|
to={item.path}
|
||||||
title={item.label}
|
title={item.label}
|
||||||
onClick={() => setIsSidebarOpen(true)}
|
onClick={() => setIsSidebarOpen(!isSidebarOpen)}
|
||||||
className={`flex items-center rounded-full font-medium transition-all ${
|
className={`flex items-center rounded-full font-medium transition-all ${
|
||||||
isSidebarOpen
|
isSidebarOpen
|
||||||
? "px-4 py-3 gap-3 text-[16px] w-full"
|
? "px-4 py-3 gap-3 text-[16px] w-full"
|
||||||
|
|||||||
@@ -1,12 +1,18 @@
|
|||||||
import { create } from 'zustand';
|
import { create } from "zustand";
|
||||||
|
|
||||||
type UiState = {
|
type UiState = {
|
||||||
dashboardCompact: boolean;
|
dashboardCompact: boolean;
|
||||||
toggleDashboardCompact: () => void;
|
toggleDashboardCompact: () => void;
|
||||||
|
|
||||||
|
isSidebarOpen: boolean;
|
||||||
|
setIsSidebarOpen: (isOpen: boolean) => void;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const useUiStore = create<UiState>((set) => ({
|
export const useUiStore = create<UiState>((set) => ({
|
||||||
dashboardCompact: false,
|
dashboardCompact: false,
|
||||||
toggleDashboardCompact: () =>
|
toggleDashboardCompact: () =>
|
||||||
set((state) => ({ dashboardCompact: !state.dashboardCompact })),
|
set((state) => ({ dashboardCompact: !state.dashboardCompact })),
|
||||||
|
|
||||||
|
isSidebarOpen: false,
|
||||||
|
setIsSidebarOpen: (isOpen: boolean) => set({ isSidebarOpen: isOpen }),
|
||||||
}));
|
}));
|
||||||
|
|||||||
Reference in New Issue
Block a user