on ad21395 help sign in
webring/scripts/progress.js
47 lines 1.1 kB history raw
1'use strict'
3const Progress = keys => {
4 const allKeys = new Set(keys.filter(key => key))
5 const loadedKeys = new Set()
6 const failedKeys = new Set()
8 const done = () => loadedKeys.size === allKeys.size
10 const className = () => done() ? 'done' : 'busy'
12 const formatPercentLoaded = () => `
13 ${Math.round(100 * loadedKeys.size / Math.max(allKeys.size, 1))}% loaded
14 `
16 const formatFailureCount = () => failedKeys.size === 0
17 ? ''
18 : `(${failedKeys.size} failed)`
20 const formatProgress = () => done()
21 ? ''
22 : `<p><progress value='${loadedKeys.size}' max='${allKeys.size}'></progress></p>`
24 const render = () => `
25 <div class='${className()}'>
26 <p>${formatPercentLoaded()} ${formatFailureCount()}</p>
27 ${formatProgress()}
28 </div>
29 `
31 const didLoad = (key, success) => new Promise((resolve, reject) => {
32 if (allKeys.has(key)) {
33 loadedKeys.add(key)
34 if (!success) failedKeys.add(key)
35 return resolve()
36 } else {
37 return reject()
38 }
39 })
41 return {
42 success: key => didLoad(key, true),
43 failure: key => didLoad(key, false),
44 done,
45 render,
46 }