|
1 | | -import { SnackbarNotification, ToasterNotification, NotificationButton } from "./types"; |
| 1 | +import { SnackbarNotification, ToasterNotification } from "./types"; |
2 | 2 | import { SnackbarComponent } from "./snackbar-component"; |
3 | 3 | import { ToastComponent } from "./toast-component"; |
4 | 4 |
|
5 | 5 | export class Notifier { |
6 | 6 | private snackbarQueue: Array<SnackbarNotification>; |
7 | 7 | private toaster: Array<ToasterNotification>; |
8 | 8 | private time: number; |
| 9 | + private shell: HTMLElement; |
9 | 10 |
|
10 | 11 | constructor() { |
| 12 | + this.shell = document.createElement("toaster-component"); |
| 13 | + document.body.appendChild(this.shell); |
11 | 14 | this.snackbarQueue = []; |
12 | 15 | this.toaster = []; |
13 | 16 | this.time = performance.now(); |
@@ -61,209 +64,70 @@ export class Notifier { |
61 | 64 | } |
62 | 65 |
|
63 | 66 | public snackbar(settings: Partial<SnackbarNotification>) { |
64 | | - const snackbar: Partial<SnackbarNotification> = {}; |
| 67 | + const snackbar: SnackbarNotification = Object.assign({ |
| 68 | + message: "Snackbar notificaitons require a message", |
| 69 | + uid: this.uid(), |
| 70 | + el: null, |
| 71 | + duration: 30, |
| 72 | + closeable: true, |
| 73 | + buttons: [], |
| 74 | + force: true, |
| 75 | + classes: [], |
| 76 | + autofocus: true, |
| 77 | + }, settings); |
65 | 78 |
|
66 | | - if (!settings?.message || settings?.message?.length === 0) { |
67 | | - console.error("Snackbar notificaitons require a message"); |
68 | | - return; |
| 79 | + if (!Array.isArray(snackbar.buttons)) { |
| 80 | + snackbar.buttons = [snackbar.buttons]; |
69 | 81 | } |
70 | 82 |
|
71 | | - snackbar.message = settings.message; |
72 | | - snackbar.uid = this.uid(); |
73 | | - snackbar.el = null; |
74 | | - |
75 | | - let classes: Array<string> = []; |
76 | | - if (settings?.classes) { |
77 | | - if (Array.isArray(settings.classes)) { |
78 | | - classes = settings.classes; |
79 | | - } else { |
80 | | - classes = [settings.classes]; |
81 | | - } |
82 | | - } |
83 | | - snackbar.classes = classes; |
84 | | - |
85 | | - if (typeof settings?.duration === "number" || settings?.duration === Infinity) { |
86 | | - snackbar.duration = settings.duration; |
87 | | - } else { |
88 | | - snackbar.duration = 3; |
89 | | - } |
90 | | - |
91 | | - if (typeof settings?.closeable !== "undefined" && typeof settings?.closeable === "boolean") { |
92 | | - snackbar.closeable = settings?.closeable; |
93 | | - } else { |
94 | | - snackbar.closeable = true; |
95 | | - } |
96 | | - |
97 | | - if (typeof settings?.force !== "undefined" && typeof settings?.force === "boolean") { |
98 | | - snackbar.force = settings?.force; |
99 | | - } else { |
100 | | - snackbar.force = false; |
101 | | - } |
102 | | - |
103 | | - if (typeof settings?.autofocus !== "undefined" && typeof settings?.autofocus === "boolean"){ |
104 | | - snackbar.autofocus = settings.autofocus; |
105 | | - }else{ |
106 | | - snackbar.autofocus = true; |
107 | | - } |
108 | | - |
109 | | - let buttons: Array<NotificationButton> = []; |
110 | | - if (settings?.buttons) { |
111 | | - if (Array.isArray(settings.buttons)) { |
112 | | - buttons = settings.buttons; |
113 | | - } else { |
114 | | - buttons = [settings.buttons]; |
115 | | - } |
116 | | - } |
117 | | - snackbar.buttons = buttons; |
118 | | - for (let i = 0; i < snackbar.buttons.length; i++) { |
119 | | - if (snackbar.buttons[i]?.classes) { |
120 | | - if (Array.isArray(snackbar.buttons[i].classes)) { |
121 | | - snackbar.buttons[i].classes = snackbar.buttons[i].classes; |
122 | | - } else { |
123 | | - // @ts-ignore |
124 | | - snackbar.buttons[i].classes = [snackbar.buttons[i].classes]; |
125 | | - } |
126 | | - } else { |
127 | | - snackbar.buttons[i].classes = []; |
128 | | - } |
129 | | - if (!snackbar.buttons[i]?.ariaLabel) { |
130 | | - snackbar.buttons[i].ariaLabel = null; |
131 | | - } |
132 | | - if (!snackbar.buttons[i]?.label) { |
133 | | - console.error("Snackbar buttons require a label"); |
134 | | - snackbar.buttons[i].label = null; |
135 | | - } |
136 | | - if (!snackbar.buttons[i]?.callback) { |
137 | | - console.error("Snackbar buttons require a callback function"); |
138 | | - snackbar.buttons[i].callback = () => {}; |
139 | | - } |
140 | | - if (!snackbar.buttons[i]?.autofocus){ |
141 | | - snackbar.buttons[i].autofocus = false; |
142 | | - }else{ |
143 | | - snackbar.autofocus = false; |
144 | | - } |
| 83 | + if (!Array.isArray(snackbar.classes)) { |
| 84 | + snackbar.classes = [snackbar.classes]; |
145 | 85 | } |
146 | 86 |
|
147 | 87 | if (snackbar.force && this.snackbarQueue.length) { |
148 | 88 | if (this.snackbarQueue[0]?.el?.isConnected){ |
149 | 89 | this.snackbarQueue[0].el.remove(); |
150 | 90 | } |
151 | | - this.snackbarQueue.splice(0, 1, snackbar as SnackbarNotification); |
| 91 | + this.snackbarQueue.splice(0, 1, snackbar); |
152 | 92 | } else { |
153 | | - this.snackbarQueue.push(snackbar as SnackbarNotification); |
| 93 | + this.snackbarQueue.push(snackbar); |
154 | 94 | } |
155 | 95 | } |
156 | 96 |
|
157 | 97 | public toast(settings: Partial<ToasterNotification>) { |
158 | | - const toast: Partial<ToasterNotification> = {}; |
159 | | - |
160 | | - if (!settings?.message || settings?.message?.length === 0) { |
161 | | - console.error("Toast notificaitons require a message"); |
162 | | - return; |
163 | | - } else if (!settings?.title || settings?.title?.length === 0) { |
164 | | - console.error("Toast notificaitons require a title"); |
165 | | - return; |
166 | | - } |
167 | | - |
168 | | - toast.title = settings.title; |
169 | | - toast.message = settings.message; |
170 | | - toast.uid = this.uid(); |
171 | | - |
172 | | - let classes: Array<string> = []; |
173 | | - if (settings?.classes) { |
174 | | - if (Array.isArray(settings.classes)) { |
175 | | - classes = settings.classes; |
176 | | - } else { |
177 | | - classes = [settings.classes]; |
178 | | - } |
179 | | - } |
180 | | - toast.classes = classes; |
181 | | - |
182 | | - if (typeof settings?.duration === "number" || settings?.duration === Infinity) { |
183 | | - toast.duration = settings.duration; |
184 | | - } else { |
185 | | - toast.duration = 3; |
186 | | - } |
187 | | - |
188 | | - if (typeof settings?.closeable !== "undefined" && typeof settings?.closeable === "boolean") { |
189 | | - toast.closeable = settings.closeable; |
190 | | - } else { |
191 | | - toast.closeable = true; |
192 | | - } |
193 | | - |
194 | | - if (settings?.icon && typeof settings?.icon === "string") { |
195 | | - toast.icon = settings.icon; |
196 | | - } else { |
197 | | - toast.icon = null; |
198 | | - } |
199 | | - |
200 | | - if (typeof settings?.autofocus !== "undefined" && typeof settings?.autofocus === "boolean"){ |
201 | | - toast.autofocus = settings.autofocus; |
202 | | - }else{ |
203 | | - toast.autofocus = false; |
204 | | - } |
205 | | - |
206 | | - let buttons: Array<NotificationButton> = []; |
207 | | - if (settings?.buttons) { |
208 | | - if (Array.isArray(settings.buttons)) { |
209 | | - buttons = settings.buttons; |
210 | | - } else { |
211 | | - buttons = [settings.buttons]; |
212 | | - } |
213 | | - } |
214 | | - toast.buttons = buttons; |
215 | | - for (let i = 0; i < toast.buttons.length; i++) { |
216 | | - if (toast.buttons[i]?.classes) { |
217 | | - if (Array.isArray(toast.buttons[i].classes)) { |
218 | | - toast.buttons[i].classes = toast.buttons[i].classes; |
219 | | - } else { |
220 | | - // @ts-ignore |
221 | | - toast.buttons[i].classes = [toast.buttons[i].classes]; |
222 | | - } |
223 | | - } else { |
224 | | - toast.buttons[i].classes = []; |
225 | | - } |
226 | | - if (!toast.buttons[i]?.ariaLabel) { |
227 | | - toast.buttons[i].ariaLabel = null; |
228 | | - } |
229 | | - if (!toast.buttons[i]?.label) { |
230 | | - console.error("Toaster buttons require a label"); |
231 | | - toast.buttons[i].label = null; |
232 | | - } |
233 | | - if (!toast.buttons[i]?.callback) { |
234 | | - console.error("Toaster buttons require a callback function"); |
235 | | - toast.buttons[i].callback = () => {}; |
236 | | - } |
237 | | - if (!toast.buttons[i]?.autofocus){ |
238 | | - toast.buttons[i].autofocus = false; |
239 | | - }else{ |
240 | | - toast.autofocus = false; |
241 | | - } |
242 | | - } |
243 | | - |
244 | | - if (settings?.timer && toast.duration !== Infinity){ |
245 | | - if (settings.timer === "vertical" || settings.timer === "horizontal"){ |
246 | | - toast.timer = settings.timer; |
247 | | - }else{ |
248 | | - console.error("Toaster timer value only accpets 'vertical' or 'horizontal'"); |
249 | | - toast.timer = null; |
250 | | - } |
| 98 | + const toast: ToasterNotification = Object.assign({ |
| 99 | + title: "Title Required", |
| 100 | + message: "Toast notificaitons require a message", |
| 101 | + closeable: true, |
| 102 | + icon: null, |
| 103 | + duration: 30, |
| 104 | + classes: [], |
| 105 | + uid: this.uid(), |
| 106 | + el: null, |
| 107 | + timerEl: null, |
| 108 | + autofocus: true, |
| 109 | + buttons: [], |
| 110 | + timer: null, |
| 111 | + timerDuration: 30, |
| 112 | + }, settings); |
| 113 | + |
| 114 | + if (!Array.isArray(toast.buttons)) { |
| 115 | + toast.buttons = [toast.buttons]; |
| 116 | + } |
| 117 | + |
| 118 | + if (!Array.isArray(toast.classes)) { |
| 119 | + toast.classes = [toast.classes]; |
| 120 | + } |
| 121 | + |
| 122 | + if (toast.duration !== Infinity && toast.timer === "vertical" || toast.timer === "horizontal"){ |
251 | 123 | toast.timerDuration = toast.duration; |
252 | | - }else{ |
253 | | - toast.timer = null; |
254 | 124 | } |
255 | 125 |
|
256 | | - toast.el = new ToastComponent(toast as ToasterNotification); |
| 126 | + toast.el = new ToastComponent(toast); |
257 | 127 | if (toast.timer){ |
258 | 128 | toast.timerEl = toast.el.querySelector("toast-timer"); |
259 | 129 | } |
260 | | - this.toaster.push(toast as ToasterNotification); |
261 | | - |
262 | | - let shell = document.body.querySelector("toaster-component") || null; |
263 | | - if (!shell) { |
264 | | - shell = document.createElement("toaster-component"); |
265 | | - document.body.appendChild(shell); |
266 | | - } |
267 | | - shell.appendChild(toast.el); |
| 130 | + this.toaster.push(toast); |
| 131 | + this.shell.appendChild(toast.el); |
268 | 132 | } |
269 | 133 | } |
0 commit comments