File size: 1,458 Bytes
b8874fd
aa3b624
3833190
 
 
63b089b
66a740c
6770eb3
aa3b624
 
 
8480986
aa3b624
 
4c98241
 
66a740c
 
 
63b089b
 
 
 
 
 
 
 
aa3b624
4c98241
 
 
 
 
 
66a740c
 
4c98241
66a740c
aa3b624
 
3833190
4c98241
63b089b
 
aa3b624
 
 
4c98241
66a740c
 
4c98241
66a740c
aa3b624
 
b8874fd
aa3b624
 
63b089b
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
import { destroyPopover, Popover } from "./popover";
import { destroyStage } from "./stage";
import { destroyEvents, initEvents } from "./events";
import { Config, configure, getConfig } from "./config";
import { destroyHighlight, highlight } from "./highlight";
import { destroyEmitter, listen } from "./emitter";

import "./style.css";

export type DriveStep = {
  element?: string | Element;
  popover?: Popover;
};

let isInitialized = false;

export function driver(options: Config = {}) {
  configure(options);

  function handleClose() {
    if (!getConfig("allowClose")) {
      return;
    }

    destroy();
  }

  function init() {
    // Avoid multiple initialization
    if (isInitialized) {
      return;
    }

    isInitialized = true;
    document.body.classList.add(
      "driver-active",
      getConfig("animate") ? "driver-fade" : "driver-simple"
    );

    initEvents();

    // Register hooks
    listen("overlayClick", handleClose);
    listen("escape", handleClose);
  }

  function destroy() {
    isInitialized = false;
    document.body.classList.remove(
      "driver-active",
      getConfig("animate") ? "driver-fade" : "driver-simple"
    );

    destroyEvents();
    destroyPopover();
    destroyHighlight();
    destroyStage();
    destroyEmitter();
  }

  return {
    drive: (steps: DriveStep[]) => console.log(steps),
    highlight: (step: DriveStep) => {
      init();
      highlight(step);
    },
    destroy,
  };
}