'use client' import { useState, useEffect, useCallback } from 'react' import { Card, CardContent } from '@/components/ui/card' import { Button } from '@/components/ui/button' import { X, ChevronRight, ChevronLeft, Sparkles, PiggyBank, AlertTriangle, ListTodo, Zap, } from 'lucide-react' import { cn } from '@/lib/utils' interface TourStep { id: string title: string description: string icon: React.ComponentType<{ className?: string }> highlight?: string // CSS selector or element ID to highlight position?: 'top' | 'bottom' | 'center' } const TOUR_COMPLETED_KEY = 'erp_dashboard_tour_completed' const tourSteps: TourStep[] = [ { id: 'welcome', title: 'Välkommen till din översikt!', description: 'Här ser du hela din ekonomiska situation på ett ställe. Låt oss gå igenom de viktigaste delarna.', icon: Sparkles, position: 'center', }, { id: 'disponibelt', title: 'Ditt att spendera', description: 'Detta är vad du faktiskt kan använda efter att vi räknat bort uppskattad skatt och moms. Tänk på det som "säkra pengar".', icon: PiggyBank, highlight: 'disponibelt-section', position: 'bottom', }, { id: 'fskatt', title: 'F-skatt varning', description: 'Vi jämför din faktiska skatt med vad du betalat in via F-skatt. Om det skiljer sig mycket får du en varning så du kan justera.', icon: AlertTriangle, highlight: 'fskatt-section', position: 'top', }, { id: 'att-hantera', title: 'Att hantera', description: 'Här samlas saker som behöver din uppmärksamhet: okategoriserade transaktioner, obetalda fakturor, och liknande.', icon: ListTodo, highlight: 'alerts-section', position: 'top', }, { id: 'snabbatgarder', title: 'Snabbåtgärder', description: 'Skapa fakturor, logga körningar eller skanna kvitton med ett klick. De vanligaste uppgifterna finns alltid nära till hands.', icon: Zap, highlight: 'quick-actions', position: 'top', }, ] interface DashboardTourProps { onComplete?: () => void forceShow?: boolean } export default function DashboardTour({ onComplete, forceShow = false }: DashboardTourProps) { const [isVisible, setIsVisible] = useState(false) const [currentStep, setCurrentStep] = useState(0) const [isAnimating, setIsAnimating] = useState(false) useEffect(() => { // Check if tour has been completed const completed = localStorage.getItem(TOUR_COMPLETED_KEY) if (forceShow || completed !== 'true') { // Small delay to let the page render first const timer = setTimeout(() => setIsVisible(true), 500) return () => clearTimeout(timer) } }, [forceShow]) const completeTour = useCallback(() => { setIsAnimating(true) setTimeout(() => { localStorage.setItem(TOUR_COMPLETED_KEY, 'true') setIsVisible(false) onComplete?.() }, 300) }, [onComplete]) const nextStep = () => { if (currentStep < tourSteps.length - 1) { setCurrentStep((prev) => prev + 1) } else { completeTour() } } const prevStep = () => { if (currentStep > 0) { setCurrentStep((prev) => prev - 1) } } const skipTour = () => { completeTour() } if (!isVisible) { return null } const step = tourSteps[currentStep] const Icon = step.icon const isLastStep = currentStep === tourSteps.length - 1 const isFirstStep = currentStep === 0 return ( <> {/* Backdrop overlay */}
{/* Tour card */}
{/* Header with icon and close */}

{step.title}

Steg {currentStep + 1} av {tourSteps.length}

{/* Description */}

{step.description}

{/* Progress dots */}
{tourSteps.map((_, idx) => (
{/* Navigation buttons */}
) } /** * Hook för att starta om touren */ export function useDashboardTour() { const resetTour = () => { localStorage.removeItem(TOUR_COMPLETED_KEY) window.location.reload() } const isTourCompleted = () => { return localStorage.getItem(TOUR_COMPLETED_KEY) === 'true' } return { resetTour, isTourCompleted } }