LiveDisplayX / src / app / display / menu / page.tsx
page.tsx
Raw
"use client";

import { useState, useEffect } from "react";
import { useRouter, useSearchParams } from "next/navigation";
import { Card, CardContent } from "@/components/ui/card";
import { Badge } from "@/components/ui/badge";
import { Beer, Coffee, Pizza, Candy, Utensils, Droplet } from "lucide-react";
import { Swiper, SwiperSlide } from "swiper/react";
import { Autoplay } from "swiper/modules";
import Image from "next/image";
import menu1Data from "./menu1.json";
import menu2Data from "./menu2.json";

// Import Swiper styles
import "swiper/css";
import "swiper/css/autoplay";

//! http://localhost:3000/display/menu?token=menu2_token

const sponsors = [
  { name: "Sponsor 1", image: "https://images.unsplash.com/photo-1599305445671-ac291c95aaa9?w=200&h=100&fit=crop" },
  { name: "Sponsor 2", image: "https://images.unsplash.com/photo-1599305445671-ac291c95aaa9?w=200&h=100&fit=crop" },
  { name: "Sponsor 3", image: "https://images.unsplash.com/photo-1599305445671-ac291c95aaa9?w=200&h=100&fit=crop" }
];

const menuTokens = {
  "menu1_token": menu1Data,
  "menu2_token": menu2Data
};

export default function MenuDisplay() {
  const router = useRouter();
  const searchParams = useSearchParams();
  const [currentTime, setCurrentTime] = useState(new Date());
  const [menuData, setMenuData] = useState<any>(null);
  const token = searchParams.get("token");

  useEffect(() => {
    const timer = setInterval(() => {
      setCurrentTime(new Date());
    }, 1000);

    return () => clearInterval(timer);
  }, []);

  useEffect(() => {
    if (!token || !menuTokens[token as keyof typeof menuTokens]) {
      router.push("/display");
      return;
    }

    setMenuData(menuTokens[token as keyof typeof menuTokens]);
  }, [token, router]);

  const getCategoryIcon = (type: string) => {
    switch (type.toLowerCase()) {
      case 'tap':
        return <Beer className="h-8 w-8" />;
      case 'warmdrinks':
        return <Coffee className="h-8 w-8" />;
      case 'mineralwater':
        return <Droplet className="h-8 w-8" />;
      case 'food':
        return <Pizza className="h-8 w-8" />;
      case 'sweet':
        return <Candy className="h-8 w-8" />;
      default:
        return <Utensils className="h-8 w-8" />;
    }
  };

  if (!menuData) {
    return null;
  }

  return (
    <div className="h-screen bg-black text-white">
      <div className="flex-1 h-[calc(100vh-8rem)] overflow-auto p-8">
        <div className="grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-8">
          {Object.entries(menuData).map(([category, items]: [string, any]) => (
            <Card key={category} className="bg-purple-950/30 border-purple-500/20 overflow-hidden">
              <CardContent className="p-6">
                <div className="flex items-center gap-3 mb-6">
                  {getCategoryIcon(category)}
                  <h2 className="text-2xl font-bold text-purple-300 capitalize">
                    {category.replace(/([A-Z])/g, ' $1').trim()}
                  </h2>
                </div>
                <div className="space-y-4">
                  {Object.entries(items).map(([itemName, details]: [string, any]) => (
                    <div key={itemName} className="flex items-start justify-between border-b border-purple-500/20 pb-4">
                      <div>
                        <h3 className="text-xl font-medium text-white">{itemName}</h3>
                        {Array.isArray(details.size) && (
                          <div className="flex gap-2 mt-2">
                            {details.size.map((size: number, index: number) => (
                              <Badge 
                                key={size}
                                variant="secondary"
                                className="bg-purple-500/10 text-purple-300"
                              >
                                {size}L - {details.price[index]} kr
                              </Badge>
                            ))}
                          </div>
                        )}
                      </div>
                      {!Array.isArray(details.price) && (
                        <div className="text-2xl font-bold text-purple-400">
                          {details.price} kr
                        </div>
                      )}
                    </div>
                  ))}
                </div>
              </CardContent>
            </Card>
          ))}
        </div>
      </div>

      {/* Bottom Bar */}
      <div className="h-32 bg-gradient-to-r from-violet-950/90 via-purple-950/90 to-fuchsia-950/90 backdrop-blur-xl border-t border-purple-500/20 flex">
        {/* Sponsors */}
        <div className="w-64 border-r border-purple-500/20 p-3">
          <div className="h-full">
            <Swiper
              modules={[Autoplay]}
              direction="vertical"
              spaceBetween={16}
              slidesPerView={1}
              autoplay={{
                delay: 3000,
                disableOnInteraction: false,
              }}
              loop={true}
              className="h-full"
            >
              {sponsors.map((sponsor, index) => (
                <SwiperSlide key={index}>
                  <div className="h-full relative rounded-lg overflow-hidden">
                    <Image
                      src={sponsor.image}
                      alt={sponsor.name}
                      fill
                      className="object-cover"
                    />
                  </div>
                </SwiperSlide>
              ))}
            </Swiper>
          </div>
        </div>

        {/* Current Time */}
        <div className="flex-1 flex items-center justify-center">
          <div className="text-6xl font-bold text-purple-300">
            {currentTime.toLocaleTimeString('en-US', { 
              hour: '2-digit', 
              minute: '2-digit',
              hour12: false 
            })}
          </div>
        </div>

        {/* Logo */}
        <div className="w-64 border-l border-purple-500/20 p-3 flex items-center justify-center">
          <div className="text-2xl font-bold bg-gradient-to-r from-purple-400 via-pink-400 to-purple-400 bg-clip-text text-transparent">
            Gaming Center
          </div>
        </div>
      </div>
    </div>
  );
}