forked from firefox-devtools/profiler
-
Notifications
You must be signed in to change notification settings - Fork 0
/
icons.js
66 lines (56 loc) · 1.49 KB
/
icons.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
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
// @flow
import type { Action, ThunkAction } from '../types/store';
export function iconHasLoaded(icon: string): Action {
return {
type: 'ICON_HAS_LOADED',
icon,
};
}
export function iconIsInError(icon: string): Action {
return {
type: 'ICON_IN_ERROR',
icon,
};
}
const icons: Set<string> = new Set();
type IconRequestResult = 'loaded' | 'error' | 'cached';
function _getIcon(icon: string): Promise<IconRequestResult> {
if (icons.has(icon)) {
return Promise.resolve('cached');
}
icons.add(icon);
const result = new Promise(resolve => {
const image = new Image();
image.src = icon;
image.referrerPolicy = 'no-referrer';
image.onload = () => {
resolve('loaded');
};
image.onerror = () => {
resolve('error');
};
});
return result;
}
export function iconStartLoading(icon: string): ThunkAction<Promise<void>> {
return dispatch => {
return _getIcon(icon).then(result => {
switch (result) {
case 'loaded':
dispatch(iconHasLoaded(icon));
break;
case 'error':
dispatch(iconIsInError(icon));
break;
case 'cached':
// nothing to do
break;
default:
throw new Error(`Unknown icon load result ${result}`);
}
});
};
}