LiveDisplayX / src / components / layout.tsx
layout.tsx
Raw
"use client";

import { useState } from "react";
import { cn } from "@/lib/utils";
import { Button } from "@/components/ui/button";
import { ScrollArea } from "@/components/ui/scroll-area";
import {
  Monitor,
  Layout as LayoutIcon,
  Calendar,
  Menu,
  Settings,
  ChevronLeft,
  BatteryWarning as BrandingWatermark,
  TwitchIcon,
} from "lucide-react";
import Link from "next/link";
import { usePathname } from "next/navigation";
import {
  OrganizationList,
  OrganizationSwitcher,
  UserButton,
} from "@clerk/nextjs";

export default function Layout({ children }: { children: React.ReactNode }) {
  const [collapsed, setCollapsed] = useState(false);
  const pathname = usePathname();

  const routes = [
    {
      href: "/admin",
      label: "Dashboard",
      icon: LayoutIcon,
    },
    {
      href: "/admin/displays",
      label: "Displays",
      icon: Monitor,
    },
    {
      href: "/admin/twitch",
      label: "Twitch",
      icon: TwitchIcon,
    },
    {
      href: "/admin/events",
      label: "Events",
      icon: Calendar,
    },
    {
      href: "/admin/menu",
      label: "Menu",
      icon: Menu,
    },
    {
      href: "/admin/playlists",
      label: "Playlists",
      icon: BrandingWatermark,
    },
    {
      href: "/admin/settings",
      label: "Settings",
      icon: Settings,
    },
  ];

  return (
    <div className="h-screen flex">
      <div
        className={cn(
          "relative h-full bg-gradient-to-b from-violet-50 via-white to-sky-50 border-r border-purple-100 pt-4 flex flex-col transition-all duration-300",
          collapsed ? "w-16" : "w-60"
        )}
      >
        <Button
          variant="ghost"
          size="icon"
          className="absolute -right-4 top-2 z-50 rounded-full bg-white border-purple-100 shadow-xl hover:bg-purple-50 hover:text-purple-600"
          onClick={() => setCollapsed(!collapsed)}
        >
          <ChevronLeft
            className={cn("h-4 w-4 transition-all", collapsed && "rotate-180")}
          />
        </Button>

        <div
          className={cn(
            "px-4 py-2 flex items-center gap-x-2",
            collapsed && "justify-center"
          )}
        >
          <div className="p-2 rounded-xl bg-gradient-to-br from-purple-500 via-pink-500 to-blue-500">
            <Monitor className="h-6 w-6 text-white" />
          </div>
          {!collapsed && (
            <div>
              <h1 className="font-bold text-xl bg-gradient-to-r  from-purple-600 via-pink-500 to-blue-500 bg-clip-text text-transparent">
                Jotun Display
              </h1>
              <p className="text-xs text-gray-500">Management System</p>
            </div>
          )}
        </div>

        <ScrollArea className="flex-1 pt-8">
          <div className="space-y-2 px-2">
            {routes.map((route) => (
              <Link
                key={route.href}
                href={route.href}
                className={cn(
                  "flex items-center gap-x-2 text-gray-600 text-sm font-medium px-3 py-2 rounded-xl transition-all",
                  pathname === route.href
                    ? "bg-gradient-to-r from-purple-500/10 via-pink-500/10 to-blue-500/10 text-purple-600"
                    : "hover:bg-purple-50 hover:text-purple-600",
                  collapsed && "justify-center"
                )}
              >
                <route.icon
                  className={cn(
                    collapsed ? "h-5 w-5" : "h-4 w-4",
                    pathname === route.href && "text-purple-600"
                  )}
                />
                {!collapsed && (
                  <span
                    className={cn(
                      "transition-colors",
                      pathname === route.href && "text-purple-600"
                    )}
                  >
                    {route.label}
                  </span>
                )}
              </Link>
            ))}
          </div>
        </ScrollArea>

        <div className="p-4">
          <div
            className={cn(
              "p-3 rounded-xl bg-gradient-to-r from-purple-500/5 via-pink-500/5 to-blue-500/5 border border-purple-100",
              collapsed && "p-2"
            )}
          >
            {collapsed ? (
              <div className="flex justify-center">
                <Settings className="h-5 w-5 text-purple-600" />
              </div>
            ) : (
              <div className="flex items-center gap-3">
                <div className="h-8 w-8 rounded-lg bg-gradient-to-br from-purple-500 via-pink-500 to-blue-500 flex items-center justify-center">
                  <Settings className="h-4 w-4 text-white" />
                </div>
                <div>
                  <p className="text-sm font-medium text-gray-900">
                    Admin Mode
                  </p>
                  <p className="text-xs text-gray-500">System Settings</p>
                </div>
              </div>
            )}
          </div>
        </div>
      </div>
      <main className="flex-1 min-w-0">
        <div className="h-full  p-8">
          <div className="content-end flex justify-end -mb-8  ">
            <OrganizationSwitcher />
          </div>
          {children}
        </div>
      </main>
    </div>
  );
}