| import type { Config, DriveStep, PopoverDOM } from "driver.js"; |
| import { driver } from "driver.js"; |
| import "driver.js/dist/driver.css"; |
|
|
| type CodeSampleProps = { |
| heading?: string; |
|
|
| config?: Config; |
| highlight?: DriveStep; |
| tour?: DriveStep[]; |
|
|
| id?: string; |
| className?: string; |
| children?: any; |
| buttonText?: string; |
| }; |
|
|
| export function removeDummyElement() { |
| const el = document.querySelector(".dynamic-el"); |
| if (el) { |
| el.remove(); |
| } |
| } |
|
|
| export function mountDummyElement() { |
| const newDiv = (document.querySelector(".dynamic-el") || document.createElement("div")) as HTMLElement; |
|
|
| newDiv.innerHTML = "This is a new Element"; |
| newDiv.style.display = "block"; |
| newDiv.style.padding = "20px"; |
| newDiv.style.backgroundColor = "black"; |
| newDiv.style.color = "white"; |
| newDiv.style.fontSize = "14px"; |
| newDiv.style.position = "fixed"; |
| newDiv.style.top = `${Math.random() * (500 - 30) + 30}px`; |
| newDiv.style.left = `${Math.random() * (500 - 30) + 30}px`; |
| newDiv.className = "dynamic-el"; |
|
|
| document.body.appendChild(newDiv); |
| } |
|
|
| function attachFirstButton(popover: PopoverDOM) { |
| const firstButton = document.createElement("button"); |
| firstButton.innerText = "Go to First"; |
| popover.footerButtons.appendChild(firstButton); |
|
|
| firstButton.addEventListener("click", () => { |
| window.driverObj.drive(0); |
| }); |
| } |
|
|
| export function CodeSample(props: CodeSampleProps) { |
| const { heading, id, children, buttonText = "Show me an Example", className, config, highlight, tour } = props; |
|
|
| if (id === "demo-hook-theme") { |
| config!.onPopoverRender = attachFirstButton; |
| } |
|
|
| function onClick() { |
| if (highlight) { |
| const driverObj = driver({ |
| ...config, |
| }); |
|
|
| window.driverObj = driverObj; |
| driverObj.highlight(highlight); |
| } else if (tour) { |
| if (id === "confirm-destroy") { |
| config!.onDestroyStarted = () => { |
| if (!driverObj.hasNextStep() || confirm("Are you sure?")) { |
| driverObj.destroy(); |
| } |
| }; |
| } |
|
|
| if (id === "logger-events") { |
| config!.onNextClick = () => { |
| console.log("next clicked"); |
| }; |
|
|
| config!.onNextClick = () => { |
| console.log("Next Button Clicked"); |
| |
| driverObj.moveNext(); |
| }; |
| config!.onPrevClick = () => { |
| console.log("Previous Button Clicked"); |
| |
| driverObj.movePrevious(); |
| }; |
| config!.onCloseClick = () => { |
| console.log("Close Button Clicked"); |
| |
| driverObj.destroy(); |
| }; |
| } |
|
|
| if (tour?.[2]?.popover?.title === "Next Step is Async") { |
| tour[2].popover.onNextClick = () => { |
| mountDummyElement(); |
| driverObj.moveNext(); |
| }; |
|
|
| if (tour?.[3]?.element === ".dynamic-el") { |
| tour[3].onDeselected = () => { |
| removeDummyElement(); |
| }; |
|
|
| |
| tour[4].popover.onPrevClick = () => { |
| mountDummyElement(); |
| driverObj.movePrevious(); |
| }; |
|
|
| |
| tour[3].popover.onPrevClick = () => { |
| removeDummyElement(); |
| driverObj.movePrevious(); |
| }; |
| } |
| } |
|
|
| const driverObj = driver({ |
| ...config, |
| steps: tour, |
| }); |
|
|
| window.driverObj = driverObj; |
| driverObj.drive(); |
| } |
| } |
|
|
| return ( |
| <div id={id} className={className}> |
| {heading && <p className="text-lg -mt-0 font-medium text-black -mb-3 rounded-md">{heading}</p>} |
| {children && <div className="-mb-4">{children}</div>} |
| <button onClick={onClick} className="w-full rounded-md bg-black p-2 text-white"> |
| {buttonText} |
| </button> |
| </div> |
| ); |
| } |
|
|