driver.js / src /driver.ts
kamrify's picture
Add onClose hook
215369d
raw
history blame
2.37 kB
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,
};
}