-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathevents.js
69 lines (55 loc) · 1.61 KB
/
events.js
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
import { PADDLE_MOVE_SPEED } from './constants';
import { setPaddleMovment } from './state';
let handlers = {};
const once = (fn) => {
let executed = false;
return () => {
if (!executed) {
fn();
}
executed = true;
}
}
export const bus = {
events: {},
on: function (eventName, callback) {
const events = this.events[eventName] || [];
this.events[eventName] = [...events, callback];
},
off: function (eventName, callback) {
this.events[eventName] = this.events[eventName]
.filter((event) => callback && event !== callback);
},
trigger: function (eventName) {
const events = this.events[eventName] || [];
events.forEach((event) => event());
},
};
const attachButtonEvents = once(() => {
document
.querySelector('[role="restart"]')
.addEventListener('click', () => bus.trigger('restart'));
});
const attachKeyboardEvents = () => {
const moveEvents = ['ArrowLeft', 'ArrowRight'];
const paddleMoveHanlder = (event) => {
if (moveEvents.includes(event.code)) {
setPaddleMovment(
(event.code === 'ArrowLeft' ? -1 : 1) * PADDLE_MOVE_SPEED
);
}
};
const paddleStopHandler = () => setPaddleMovment(0);
document.addEventListener('keydown', paddleMoveHanlder);
document.addEventListener('keyup', paddleStopHandler);
handlers.keydown = paddleMoveHanlder;
handlers.keydown = paddleStopHandler;
}
export const attach = () => {
attachKeyboardEvents();
attachButtonEvents();
};
export const detach = () => {
document.removeEventListener('keydown', handlers.keydown);
document.removeEventListener('keyup', handlers.keydown);
};