import Link from "next/link"; import { useRouter } from "next/router"; import { Button } from "@headlessui/react"; import { t } from "@lingui/core/macro"; import { env } from "next-runtime-env"; import { useTheme } from "next-themes"; import { useEffect, useState } from "react"; import { HiBolt } from "react-icons/hi2"; import { TbLayoutSidebarLeftCollapse, TbLayoutSidebarLeftExpand, } from "react-icons/tb"; import { twMerge } from "tailwind-merge"; import type { Subscription } from "@kan/shared/utils"; import { hasActiveSubscription } from "@kan/shared/utils"; import boardsIconDark from "~/assets/boards-dark.json"; import boardsIconLight from "~/assets/boards-light.json"; import membersIconDark from "~/assets/members-dark.json"; import membersIconLight from "~/assets/members-light.json"; import settingsIconDark from "~/assets/settings-dark.json"; import settingsIconLight from "~/assets/settings-light.json"; import templatesIconDark from "~/assets/templates-dark.json"; import templatesIconLight from "~/assets/templates-light.json"; import ButtonComponent from "~/components/Button"; import ReactiveButton from "~/components/ReactiveButton"; import UserMenu from "~/components/UserMenu"; import WorkspaceMenu from "~/components/WorkspaceMenu"; import { useModal } from "~/providers/modal"; import { useWorkspace } from "~/providers/workspace"; import { api } from "~/utils/api"; interface SideNavigationProps { user: UserType; isLoading: boolean; onCloseSideNav?: () => void; } interface UserType { email?: string | null | undefined; image?: string | null | undefined; } export default function SideNavigation({ user, isLoading, onCloseSideNav, }: SideNavigationProps) { const router = useRouter(); const { workspace } = useWorkspace(); const [isCollapsed, setIsCollapsed] = useState(false); const [isInitialised, setIsInitialised] = useState(false); const { openModal } = useModal(); const { data: workspaceData } = api.workspace.byId.useQuery({ workspacePublicId: workspace.publicId, }); const subscriptions = workspaceData?.subscriptions as | Subscription[] | undefined; useEffect(() => { const savedState = localStorage.getItem("kan_sidebar-collapsed"); if (savedState !== null) { setIsCollapsed(Boolean(JSON.parse(savedState))); } setIsInitialised(true); }, []); useEffect(() => { if (isInitialised) { localStorage.setItem( "kan_sidebar-collapsed", JSON.stringify(isCollapsed), ); } }, [isCollapsed, isInitialised]); const { pathname } = router; const { resolvedTheme } = useTheme(); const isCloudEnv = env("NEXT_PUBLIC_KAN_ENV") === "cloud"; const isDarkMode = resolvedTheme === "dark"; const navigation = [ { name: t`Boards`, href: "/boards", icon: isDarkMode ? boardsIconDark : boardsIconLight, }, { name: t`Templates`, href: "/templates", icon: isDarkMode ? templatesIconDark : templatesIconLight, }, { name: t`Members`, href: "/members", icon: isDarkMode ? membersIconDark : membersIconLight, }, { name: t`Settings`, href: "/settings", icon: isDarkMode ? settingsIconDark : settingsIconLight, }, ]; const toggleCollapse = () => { setIsCollapsed(!isCollapsed); }; return ( <> ); }