import React, { useEffect, useState } from 'react'; import { PopoverAnchor } from '../silke-popover'; import { SilkeBox } from '../silke-box'; import { SilkeButton, SilkeButtonSet } from '../silke-button'; import { SilkeText } from '../silke-text'; import { SilkeTooltip, TooltipHorizontalPosition } from './silke-tooltip'; type SilkeInteractiveTooltipStep = { header?: string; text: React.ReactNode; }; interface SilkeInteractiveTooltipProps { anchor: PopoverAnchor; /** * If set, the last step will say 'Next', not 'Finish' */ lastIsNotLast?: boolean; /** * Callback for when clicking 'Next' or 'Finish' on the last step */ onFinished?: () => void; show: boolean; steps: SilkeInteractiveTooltipStep[]; } /** * Shows a tooltip with a series of steps */ export function SilkeInteractiveTooltip({ anchor, lastIsNotLast, onFinished, show, steps, }: SilkeInteractiveTooltipProps) { const [step, setStep] = useState(0); useEffect(() => void (show && setStep(0)), [show]); if (!steps) return null; const handleBack = () => setStep(step - 1); const handleClose = () => { if (onFinished) onFinished(); setStep(steps.length - 1); }; const handleNext = () => { if (step >= steps.length - 1) handleClose(); else setStep(step + 1); }; // Hide if user has pressed Next until there are no more steps const actuallyShow = step >= steps.length ? false : show; const data = steps[step]; /** * Component holding step data and navigation */ const JustTheTip = ( {steps.length > 1 && {`${step + 1}/${steps.length}`}} {data?.header && ( {data.header} )} {data?.text} {step !== 0 && } ); return ( {JustTheTip} ); }