on 12266f0 help sign in
webring/scripts/progress.js
41 lines 990 B history raw
1'use strict'
3const Progress = keys => {
4 const stack = new Set(keys.filter(key => key))
5 const loaded = new Set()
6 const failed = new Set()
8 this.ratio = () => {
9 return loaded.size / stack.size
10 }
12 this.percentage = () => {
13 return (100 * this.ratio()).toFixed(2)
14 }
16 const render = () => `
17 <div class='${loaded.size !== stack.size ? 'busy' : 'done'}'>
18 <p>
19 ${'|'.repeat(this.ratio() * 10)}
20 ${loaded.size !== stack.size ? this.percentage() + '% ' : ''}
21 ${loaded.size === stack.size ? 'Complete' : 'Loading'}
22 ${failed.size !== 0 ? `(${failed.size} failed)` : ''}
23 </p>
24 </div>`
26 const didLoad = (key, success) => new Promise((resolve, reject) => {
27 if (stack.has(key)) {
28 loaded.add(key)
29 if (!success) failed.add(key)
30 return resolve()
31 } else {
32 return reject()
33 }
34 })
36 return {
37 success: key => didLoad(key, true),
38 failure: key => didLoad(key, false),
39 toString: render
40 }