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
16 const formatFailureCount = () => failedKeys.size === 0
18 : `(${failedKeys.size} failed)`
20 const formatProgress = () => done()
22 : `<p><progress value='${loadedKeys.size}' max='${allKeys.size}'></progress></p>`
24 const render = () => `
25 <div class='${className()}'>
26 <p>${formatPercentLoaded()} ${formatFailureCount()}</p>
31 const didLoad = (key, success) => new Promise((resolve, reject) => {
32 if (allKeys.has(key)) {
34 if (!success) failedKeys.add(key)
42 success: key => didLoad(key, true),
43 failure: key => didLoad(key, false),
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list