| import { destroyPopover, Popover } from "./popover"; | |
| import { destroyStage } from "./stage"; | |
| import { destroyEvents, initEvents } from "./events"; | |
| import { Config, configure, getConfig } from "./config"; | |
| import { destroyHighlight, highlight, refreshActiveHighlight } from "./highlight"; | |
| import { destroyEmitter, listen } from "./emitter"; | |
| import "./style.css"; | |
| import { getState, resetState, setState } from "./state"; | |
| export type DriveStep = { | |
| element?: string | Element; | |
| popover?: Popover; | |
| }; | |
| export function driver(options: Config = {}) { | |
| configure(options); | |
| function handleClose() { | |
| if (!getConfig("allowClose")) { | |
| return; | |
| } | |
| const activeStep = getState("activeStep"); | |
| const activeElement = getState("activeElement"); | |
| const onDeselected = getConfig("onDeselected"); | |
| if (activeStep && activeElement && onDeselected) { | |
| onDeselected(activeElement.id === "driver-dummy-element" ? undefined : activeElement, activeStep); | |
| } | |
| destroy(); | |
| } | |
| function init() { | |
| if (getState("isInitialized")) { | |
| return; | |
| } | |
| setState("isInitialized", true); | |
| document.body.classList.add("driver-active", getConfig("animate") ? "driver-fade" : "driver-simple"); | |
| initEvents(); | |
| listen("overlayClick", handleClose); | |
| listen("escape", handleClose); | |
| } | |
| function destroy() { | |
| const activeElement = getState("activeElement"); | |
| const activeStep = getState("activeStep"); | |
| document.body.classList.remove("driver-active", "driver-fade", "driver-simple"); | |
| destroyEvents(); | |
| destroyPopover(); | |
| destroyHighlight(); | |
| destroyStage(); | |
| destroyEmitter(); | |
| resetState(); | |
| const onClose = getConfig("onClose"); | |
| if (onClose && activeElement && activeStep) { | |
| const isActiveDummyElement = activeElement.id === "driver-dummy-element"; | |
| onClose(isActiveDummyElement ? undefined : activeElement, activeStep); | |
| } | |
| } | |
| return { | |
| isActive: () => getState("isInitialized") || false, | |
| refresh: () => { | |
| refreshActiveHighlight(); | |
| }, | |
| drive: (steps: DriveStep[]) => console.log(steps), | |
| highlight: (step: DriveStep) => { | |
| init(); | |
| highlight({ | |
| ...step, | |
| popover: step.popover | |
| ? { | |
| showButtons: false, | |
| ...step.popover!, | |
| } | |
| : undefined, | |
| }); | |
| }, | |
| destroy, | |
| }; | |
| } | |