import { useEffect, useMemo, useState } from "react"; import { useTranslation } from "react-i18next"; import { ArrowLeft, ArrowRight } from "lucide-react"; import { Button } from "@/components/button"; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, } from "@/components/dialog"; import { useUiPreferencesContext } from "@/contexts/UiPreferencesContext"; import { relevantSteps, type OnboardingContext } from "./onboarding-steps"; export function OnboardingDialog({ open, context, onClose, }: { open: boolean; context: OnboardingContext; onClose: (skipped: boolean) => void; }) { const { t } = useTranslation(); const ctx = useUiPreferencesContext(); const steps = useMemo(() => relevantSteps(context), [context]); const [index, setIndex] = useState(0); // A reopened run always starts from the top. useEffect(() => { if (open) setIndex(0); }, [open]); if (steps.length === 0) return null; const clamped = Math.min(index, steps.length - 1); const step = steps[clamped]; const isLast = clamped === steps.length - 1; const StepComponent = step.Component; function finish(skipped: boolean) { ctx?.completeOnboarding(skipped); onClose(skipped); } return ( { if (!next) finish(true); }} > e.preventDefault()} > {t(step.titleKey)} {t("onboarding.stepCounter", { current: clamped + 1, total: steps.length, })}
{steps.map((s, i) => (
{!isLast && ( )} {clamped > 0 && ( )}
); }