"use client" import type React from "react" import { useState, useEffect } from "react" import { Button } from "./ui/button" import { Dialog, DialogContent } from "./ui/dialog" import { ChevronLeft, ChevronRight, X, Sparkles, LayoutDashboard, HardDrive, Network, Box, Cpu, FileText, Rocket, } from "lucide-react" import Image from "next/image" interface OnboardingSlide { id: number title: string description: string image?: string icon: React.ReactNode gradient: string } const slides: OnboardingSlide[] = [ { id: 0, title: "Welcome to ProxMenux Monitor!", description: "Your new monitoring tool for Proxmox. Discover all the features that will help you manage and supervise your infrastructure efficiently.", icon: , gradient: "from-blue-500 via-purple-500 to-pink-500", }, { id: 1, title: "System Overview", description: "Monitor your server's status in real-time: CPU, memory, temperature, system load and more. Everything in an intuitive and easy-to-understand dashboard.", image: "/images/onboarding/imagen1.png", icon: , gradient: "from-blue-500 to-cyan-500", }, { id: 2, title: "Storage Management", description: "Visualize the status of all your disks and volumes. Detailed information on capacity, usage, SMART health, temperature and performance of each storage device.", image: "/images/onboarding/imagen2.png", icon: , gradient: "from-cyan-500 to-teal-500", }, { id: 3, title: "Network Metrics", description: "Monitor network traffic in real-time. Bandwidth statistics, active interfaces, transfer speeds and historical usage graphs.", image: "/images/onboarding/imagen3.png", icon: , gradient: "from-teal-500 to-green-500", }, { id: 4, title: "Virtual Machines & Containers", description: "Manage all your VMs and LXC containers from one place. Status, allocated resources, current usage and quick controls for each virtual machine.", image: "/images/onboarding/imagen4.png", icon: , gradient: "from-green-500 to-emerald-500", }, { id: 5, title: "Hardware Information", description: "Complete details of your server hardware: CPU, RAM, GPU, disks, network, UPS and more. Technical specifications, models, serial numbers and status of each component.", image: "/images/onboarding/imagen5.png", icon: , gradient: "from-emerald-500 to-blue-500", }, { id: 6, title: "System Logs", description: "Access system logs in real-time. Filter by event type, search for specific errors and keep complete track of your server activity. Download the displayed logs for further analysis.", image: "/images/onboarding/imagen6.png", icon: , gradient: "from-blue-500 to-indigo-500", }, { id: 7, title: "Ready for the Future!", description: "ProxMenux Monitor is prepared to receive updates and improvements that will be added gradually, improving the user experience and being able to execute ProxMenux functions from the web panel.", icon: , gradient: "from-indigo-500 via-purple-500 to-pink-500", }, ] export function OnboardingCarousel() { const [open, setOpen] = useState(false) const [currentSlide, setCurrentSlide] = useState(0) const [direction, setDirection] = useState<"next" | "prev">("next") useEffect(() => { const hasSeenOnboarding = localStorage.getItem("proxmenux-onboarding-seen") if (!hasSeenOnboarding) { setOpen(true) } }, []) const handleNext = () => { if (currentSlide < slides.length - 1) { setDirection("next") setCurrentSlide(currentSlide + 1) } else { setOpen(false) } } const handlePrev = () => { if (currentSlide > 0) { setDirection("prev") setCurrentSlide(currentSlide - 1) } } const handleSkip = () => { setOpen(false) } const handleDontShowAgain = () => { localStorage.setItem("proxmenux-onboarding-seen", "true") setOpen(false) } const handleDotClick = (index: number) => { setDirection(index > currentSlide ? "next" : "prev") setCurrentSlide(index) } const slide = slides[currentSlide] return ( {/* Close button */} {/* Icon or Image */} {slide.image ? ( { const target = e.target as HTMLImageElement target.style.display = "none" const fallback = target.parentElement?.querySelector(".fallback-icon") if (fallback) { fallback.classList.remove("hidden") } }} /> {slide.icon} ) : ( {slide.icon} )} {/* Decorative elements */} {slide.title} {slide.description} {/* Progress dots */} {slides.map((_, index) => ( handleDotClick(index)} className={`transition-all duration-300 rounded-full ${ index === currentSlide ? "w-8 h-2.5 bg-blue-500 shadow-lg shadow-blue-500/50" : "w-2.5 h-2.5 bg-muted-foreground/60 hover:bg-muted-foreground/80 border border-muted-foreground/40" }`} aria-label={`Go to slide ${index + 1}`} /> ))} Previous {currentSlide < slides.length - 1 ? ( <> Skip Next > ) : ( Get Started! )} {/* Don't show again */} {currentSlide === slides.length - 1 && ( Don't show again )} ) }
{slide.description}