"use client" import type React from "react" import { useState, useEffect } from "react" import { Button } from "./ui/button" import { Dialog, DialogContent, DialogTitle } from "./ui/dialog" import { ChevronLeft, ChevronRight, X, Sparkles, LayoutDashboard, HardDrive, Network, Box, Cpu, FileText, Rocket, } from "lucide-react" import Image from "next/image" import { Checkbox } from "./ui/checkbox" import { useT } from "../lib/i18n/provider" interface OnboardingSlide { id: number titleKey: string descriptionKey: string image?: string icon: React.ReactNode gradient: string } const slides: OnboardingSlide[] = [ { id: 0, titleKey: "onboarding.slides.welcome.title", descriptionKey: "onboarding.slides.welcome.description", icon: , gradient: "from-blue-500 via-purple-500 to-pink-500", }, { id: 1, titleKey: "onboarding.slides.overview.title", descriptionKey: "onboarding.slides.overview.description", image: "/images/onboarding/imagen1.png", icon: , gradient: "from-blue-500 to-cyan-500", }, { id: 2, titleKey: "onboarding.slides.storage.title", descriptionKey: "onboarding.slides.storage.description", image: "/images/onboarding/imagen2.png", icon: , gradient: "from-cyan-500 to-teal-500", }, { id: 3, titleKey: "onboarding.slides.network.title", descriptionKey: "onboarding.slides.network.description", image: "/images/onboarding/imagen3.png", icon: , gradient: "from-teal-500 to-green-500", }, { id: 4, titleKey: "onboarding.slides.virtualMachines.title", descriptionKey: "onboarding.slides.virtualMachines.description", image: "/images/onboarding/imagen4.png", icon: , gradient: "from-green-500 to-emerald-500", }, { id: 5, titleKey: "onboarding.slides.hardware.title", descriptionKey: "onboarding.slides.hardware.description", image: "/images/onboarding/imagen5.png", icon: , gradient: "from-emerald-500 to-blue-500", }, { id: 6, titleKey: "onboarding.slides.logs.title", descriptionKey: "onboarding.slides.logs.description", image: "/images/onboarding/imagen6.png", icon: , gradient: "from-blue-500 to-indigo-500", }, { id: 7, titleKey: "onboarding.slides.future.title", descriptionKey: "onboarding.slides.future.description", icon: , gradient: "from-indigo-500 via-purple-500 to-pink-500", }, ] export function OnboardingCarousel() { const t = useT() const [open, setOpen] = useState(false) const [currentSlide, setCurrentSlide] = useState(0) const [direction, setDirection] = useState<"next" | "prev">("next") const [dontShowAgain, setDontShowAgain] = useState(false) 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 { if (dontShowAgain) { localStorage.setItem("proxmenux-onboarding-seen", "true") } setOpen(false) } } const handlePrev = () => { if (currentSlide > 0) { setDirection("prev") setCurrentSlide(currentSlide - 1) } } const handleSkip = () => { if (dontShowAgain) { localStorage.setItem("proxmenux-onboarding-seen", "true") } setOpen(false) } const handleClose = () => { if (dontShowAgain) { localStorage.setItem("proxmenux-onboarding-seen", "true") } setOpen(false) } const handleDotClick = (index: number) => { setDirection(index > currentSlide ? "next" : "prev") setCurrentSlide(index) } const slide = slides[currentSlide] const slideTitle = t(slide.titleKey) const slideDescription = t(slide.descriptionKey) return ( {t("onboarding.dialogTitle")} {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} )} {slideTitle} {slideDescription} {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={t("onboarding.goToSlide", { number: index + 1 })} /> ))} {t("onboarding.previous")} {currentSlide < slides.length - 1 ? ( <> {t("onboarding.skip")} {t("onboarding.next")} > ) : ( {t("onboarding.getStarted")} )} setDontShowAgain(checked as boolean)} /> {t("onboarding.dontShowAgain")} ) }
{slideDescription}