File size: 2,397 Bytes
b8874fd
aa3b624
7fbff02
3833190
7fbff02
63b089b
66a740c
6770eb3
836d49f
aa3b624
 
 
8480986
aa3b624
 
66a740c
 
 
63b089b
 
 
 
 
d656141
 
 
 
eb375ea
d656141
 
63b089b
 
 
aa3b624
9bde4cc
4c98241
 
 
9bde4cc
 
aa3b624
 
3833190
63b089b
 
aa3b624
 
 
215369d
 
 
9bde4cc
aa3b624
 
b8874fd
aa3b624
 
63b089b
836d49f
 
215369d
 
 
 
 
 
 
aa3b624
 
 
ff5f16d
40c6a95
7fbff02
40c6a95
aa3b624
 
9a49612
aa3b624
40c6a95
 
d656141
 
fe7906f
d656141
 
 
40c6a95
aa3b624
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import { destroyPopover, Popover } from "./popover";
import { destroyStage } from "./stage";
import { destroyEvents, initEvents, requireRefresh } from "./events";
import { Config, configure, getConfig } from "./config";
import { destroyHighlight, highlight } 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: () => {
      requireRefresh();
    },
    drive: (steps: DriveStep[]) => console.log(steps),
    highlight: (step: DriveStep) => {
      console.log(step.popover?.showButtons);
      init();
      highlight({
        ...step,
        popover: step.popover
          ? {
              showButtons: [],
              ...step.popover!,
            }
          : undefined,
      });
    },
    destroy,
  };
}