|
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> |
|
); |
|
} |
|
|