-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsnackbar.js
96 lines (84 loc) · 3.12 KB
/
snackbar.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
import { WIDTH_MOBILE, WIDTH_DESKTOP, DATA_CONTAINER, DATA_CONTENT, DATA_BUTTON } from './constants.js'
const snackbarArray = [];
let snackbarLooperBusy = false;
let snackbarDelay = 300;
export const Snackbar = (content, timeout, button, callback) => {
if (content && timeout) {
snackbarArray.push({
'element': createSnackbar(content, button, callback),
'time': timeout,
});
if (!snackbarLooperBusy) {
snackbarLooper();
}
} else throw 'No content or time provided for snackbar!';
}
const snackbarLooper = () => {
snackbarLooperBusy = true;
showSnackbar(snackbarArray[0]);
setTimeout(() => {
removeSnackbar();
snackbarArray.shift();
if (snackbarArray.length === 0) {
snackbarLooperBusy = false;
} else {
setTimeout(() => {
snackbarLooper();
}, snackbarDelay + getTransitionDelay());
}
}, snackbarArray[0].time + getTransitionDelay());
}
const showSnackbar = snackObject => {
if (document && snackObject) {
document.body.appendChild(snackObject.element);
setTimeout(() => {
document.body.querySelector(`[${DATA_CONTAINER}]`).classList.add('active');
});
}
}
const removeSnackbar = () => {
if (document.body.querySelector(`[${DATA_CONTAINER}]`)) {
document.body.querySelector(`[${DATA_CONTAINER}]`).classList.remove('active');
setTimeout(() => {
document.body.querySelector(`[${DATA_CONTAINER}]`).remove();
}, getTransitionDelay());
}
}
const createSnackbar = (content, button, callback) => {
let snackbar = createContainerElement();
snackbar.appendChild(createContentElement(content));
if (button && callback) {
snackbar.appendChild(createButtonElement(button, callback));
}
return snackbar;
}
const createContainerElement = () => {
let snackbarContainerElement = document.createElement('div');
snackbarContainerElement.setAttribute(DATA_CONTAINER, '');
return snackbarContainerElement;
}
const createContentElement = (content) => {
let snackbarContentElement = document.createElement('span');
snackbarContentElement.setAttribute(DATA_CONTENT, '');
snackbarContentElement.innerHTML = content;
return snackbarContentElement;
}
const createButtonElement = (button, callback) => {
if (button && callback) {
let snackbarButtonElement = document.createElement('button');
snackbarButtonElement.setAttribute(DATA_BUTTON, '');
snackbarButtonElement.addEventListener('click', callback);
snackbarButtonElement.innerHTML = button;
return snackbarButtonElement;
} else throw 'A callback or button text is missing';
}
const getTransitionDelay = () => {
// Get transition time if set
let transitionStyling = JSON.stringify(getComputedStyle(document.body.querySelector(`[${DATA_CONTAINER}]`)).transition);
let transitionDelay = 0;
if (transitionStyling) {
// Parse transition delay and convert to ms
transitionDelay = parseFloat(transitionStyling.split(' ')[1]) * 1000;
}
return transitionDelay
}