Refactor hooks
Browse files- src/driver.ts +12 -9
- src/emitter.ts +15 -0
- src/events.ts +8 -0
- src/hooks.ts +0 -15
- src/stage.ts +2 -2
src/driver.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { destroyStage } from "./stage";
|
|
| 3 |
import { destroyEvents, initEvents } from "./events";
|
| 4 |
import { Config, configure, getConfig } from "./config";
|
| 5 |
import { destroyHighlight, highlight } from "./highlight";
|
| 6 |
-
import {
|
| 7 |
|
| 8 |
import "./style.css";
|
| 9 |
|
|
@@ -17,6 +17,14 @@ let isInitialized = false;
|
|
| 17 |
export function driver(options: Config = {}) {
|
| 18 |
configure(options);
|
| 19 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 20 |
function init() {
|
| 21 |
// Avoid multiple initialization
|
| 22 |
if (isInitialized) {
|
|
@@ -32,13 +40,8 @@ export function driver(options: Config = {}) {
|
|
| 32 |
initEvents();
|
| 33 |
|
| 34 |
// Register hooks
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
return;
|
| 38 |
-
}
|
| 39 |
-
|
| 40 |
-
destroy();
|
| 41 |
-
});
|
| 42 |
}
|
| 43 |
|
| 44 |
function destroy() {
|
|
@@ -51,7 +54,7 @@ export function driver(options: Config = {}) {
|
|
| 51 |
destroyEvents();
|
| 52 |
destroyHighlight();
|
| 53 |
destroyStage();
|
| 54 |
-
|
| 55 |
}
|
| 56 |
|
| 57 |
return {
|
|
|
|
| 3 |
import { destroyEvents, initEvents } from "./events";
|
| 4 |
import { Config, configure, getConfig } from "./config";
|
| 5 |
import { destroyHighlight, highlight } from "./highlight";
|
| 6 |
+
import { destroyEmitter, listen } from "./emitter";
|
| 7 |
|
| 8 |
import "./style.css";
|
| 9 |
|
|
|
|
| 17 |
export function driver(options: Config = {}) {
|
| 18 |
configure(options);
|
| 19 |
|
| 20 |
+
function handleClose() {
|
| 21 |
+
if (!getConfig("allowClose")) {
|
| 22 |
+
return;
|
| 23 |
+
}
|
| 24 |
+
|
| 25 |
+
destroy();
|
| 26 |
+
}
|
| 27 |
+
|
| 28 |
function init() {
|
| 29 |
// Avoid multiple initialization
|
| 30 |
if (isInitialized) {
|
|
|
|
| 40 |
initEvents();
|
| 41 |
|
| 42 |
// Register hooks
|
| 43 |
+
listen("overlayClick", handleClose);
|
| 44 |
+
listen("escape", handleClose);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 45 |
}
|
| 46 |
|
| 47 |
function destroy() {
|
|
|
|
| 54 |
destroyEvents();
|
| 55 |
destroyHighlight();
|
| 56 |
destroyStage();
|
| 57 |
+
destroyEmitter();
|
| 58 |
}
|
| 59 |
|
| 60 |
return {
|
src/emitter.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
type allowedEvents = "overlayClick" | "escape";
|
| 2 |
+
|
| 3 |
+
let registeredListeners: Partial<{ [key in allowedEvents]: () => void }> = {};
|
| 4 |
+
|
| 5 |
+
export function listen(hook: allowedEvents, callback: () => void) {
|
| 6 |
+
registeredListeners[hook] = callback;
|
| 7 |
+
}
|
| 8 |
+
|
| 9 |
+
export function emit(hook: allowedEvents) {
|
| 10 |
+
registeredListeners[hook]?.();
|
| 11 |
+
}
|
| 12 |
+
|
| 13 |
+
export function destroyEmitter() {
|
| 14 |
+
registeredListeners = {};
|
| 15 |
+
}
|
src/events.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
| 1 |
import { refreshActiveHighlight } from "./highlight";
|
|
|
|
| 2 |
|
| 3 |
let resizeTimeout: number;
|
| 4 |
|
|
@@ -10,6 +11,12 @@ function requireRefresh() {
|
|
| 10 |
resizeTimeout = window.requestAnimationFrame(refreshActiveHighlight);
|
| 11 |
}
|
| 12 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 13 |
/**
|
| 14 |
* Attaches click handler to the elements created by driver.js. It makes
|
| 15 |
* sure to give the listener the first chance to handle the event, and
|
|
@@ -64,6 +71,7 @@ export function onDriverClick(
|
|
| 64 |
}
|
| 65 |
|
| 66 |
export function initEvents() {
|
|
|
|
| 67 |
window.addEventListener("resize", requireRefresh);
|
| 68 |
window.addEventListener("scroll", requireRefresh);
|
| 69 |
}
|
|
|
|
| 1 |
import { refreshActiveHighlight } from "./highlight";
|
| 2 |
+
import { emit } from "./emitter";
|
| 3 |
|
| 4 |
let resizeTimeout: number;
|
| 5 |
|
|
|
|
| 11 |
resizeTimeout = window.requestAnimationFrame(refreshActiveHighlight);
|
| 12 |
}
|
| 13 |
|
| 14 |
+
function onKeyup(e: KeyboardEvent) {
|
| 15 |
+
if (e.key === "Escape") {
|
| 16 |
+
emit("escape");
|
| 17 |
+
}
|
| 18 |
+
}
|
| 19 |
+
|
| 20 |
/**
|
| 21 |
* Attaches click handler to the elements created by driver.js. It makes
|
| 22 |
* sure to give the listener the first chance to handle the event, and
|
|
|
|
| 71 |
}
|
| 72 |
|
| 73 |
export function initEvents() {
|
| 74 |
+
window.addEventListener("keyup", onKeyup, false);
|
| 75 |
window.addEventListener("resize", requireRefresh);
|
| 76 |
window.addEventListener("scroll", requireRefresh);
|
| 77 |
}
|
src/hooks.ts
DELETED
|
@@ -1,15 +0,0 @@
|
|
| 1 |
-
type allowedHooks = "overlayClick";
|
| 2 |
-
|
| 3 |
-
let registeredHooks: Partial<{ [key in allowedHooks]: () => void }> = {};
|
| 4 |
-
|
| 5 |
-
export function register(hook: allowedHooks, callback: () => void) {
|
| 6 |
-
registeredHooks[hook] = callback;
|
| 7 |
-
}
|
| 8 |
-
|
| 9 |
-
export function trigger(hook: allowedHooks) {
|
| 10 |
-
registeredHooks[hook]?.();
|
| 11 |
-
}
|
| 12 |
-
|
| 13 |
-
export function destroyHooks() {
|
| 14 |
-
registeredHooks = {};
|
| 15 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
src/stage.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
| 1 |
import { easeInOutQuad } from "./utils";
|
| 2 |
import { onDriverClick } from "./events";
|
| 3 |
-
import {
|
| 4 |
import { getConfig } from "./config";
|
| 5 |
|
| 6 |
export type StageDefinition = {
|
|
@@ -108,7 +108,7 @@ function mountStage(stagePosition: StageDefinition) {
|
|
| 108 |
return;
|
| 109 |
}
|
| 110 |
|
| 111 |
-
|
| 112 |
});
|
| 113 |
}
|
| 114 |
|
|
|
|
| 1 |
import { easeInOutQuad } from "./utils";
|
| 2 |
import { onDriverClick } from "./events";
|
| 3 |
+
import { emit } from "./emitter";
|
| 4 |
import { getConfig } from "./config";
|
| 5 |
|
| 6 |
export type StageDefinition = {
|
|
|
|
| 108 |
return;
|
| 109 |
}
|
| 110 |
|
| 111 |
+
emit("overlayClick");
|
| 112 |
});
|
| 113 |
}
|
| 114 |
|