"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 ? (
{slideTitle} { 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) => (
{currentSlide < slides.length - 1 ? ( <> ) : ( )}
setDontShowAgain(checked as boolean)} />
) }