ForFarm/frontend/components/sidebar/app-sidebar.tsx

178 lines
3.4 KiB
TypeScript

"use client";
import * as React from "react";
import {
AudioWaveform,
BookOpen,
Bot,
Command,
Frame,
GalleryVerticalEnd,
Map,
PieChart,
Settings2,
SquareTerminal,
} from "lucide-react";
import { NavMain } from "./nav-main";
import { NavProjects } from "./nav-projects";
import { NavUser } from "./nav-user";
import { TeamSwitcher } from "./team-switcher";
import { Sidebar, SidebarContent, SidebarFooter, SidebarHeader, SidebarRail } from "@/components/ui/sidebar";
import { useEffect } from "react";
import { fetchUserMe } from "@/api/user";
const data = {
user: {
name: "shadcn",
email: "m@example.com",
avatar: "/avatars/avatar.webp",
},
teams: [
{
name: "Farm 1",
logo: GalleryVerticalEnd,
plan: "Hatyai",
},
{
name: "Farm 2",
logo: AudioWaveform,
plan: "Songkla",
},
{
name: "Farm 3",
logo: Command,
plan: "Layong",
},
],
navMain: [
{
title: "Dashboard",
url: "#",
icon: SquareTerminal,
isActive: true,
items: [
{
title: "Analytic",
url: "#",
},
],
},
{
title: "AI Chatbot",
url: "#",
icon: Bot,
items: [
{
title: "Main model",
url: "#",
},
],
},
{
title: "Documentation",
url: "#",
icon: BookOpen,
items: [
{
title: "Introduction",
url: "#",
},
{
title: "Get Started",
url: "#",
},
{
title: "Tutorials",
url: "#",
},
{
title: "Changelog",
url: "#",
},
],
},
{
title: "Settings",
url: "#",
icon: Settings2,
items: [
{
title: "General",
url: "#",
},
{
title: "Team",
url: "#",
},
{
title: "Billing",
url: "#",
},
{
title: "Limits",
url: "#",
},
],
},
],
projects: [
{
name: "Crops 1",
url: "#",
icon: Frame,
},
{
name: "Crops 2",
url: "#",
icon: PieChart,
},
{
name: "Crops 3",
url: "#",
icon: Map,
},
],
};
export function AppSidebar({ ...props }: React.ComponentProps<typeof Sidebar>) {
const [user, setUser] = React.useState<{ name: string; email: string; avatar: string }>({
name: "",
email: "",
avatar: "/avatars/avatar.webp",
});
const [loading, setLoading] = React.useState(true);
const [error, setError] = React.useState("");
useEffect(() => {
async function getUser() {
try {
const data = await fetchUserMe();
let to_set = user;
to_set.name = data.user.UUID;
to_set.email = data.user.Email;
setUser(to_set);
} catch (err: any) {
setError(err.message);
} finally {
setLoading(false);
}
}
getUser();
}, []);
return (
<Sidebar collapsible="icon" {...props}>
<SidebarHeader>
<TeamSwitcher teams={data.teams} />
</SidebarHeader>
<SidebarContent>
<NavMain items={data.navMain} />
<NavProjects projects={data.projects} />
</SidebarContent>
<SidebarFooter>{loading ? "Loading..." : error ? error : <NavUser user={user} />}</SidebarFooter>
<SidebarRail />
</Sidebar>
);
}