2020-10-16 13:28:46 +00:00
|
|
|
interface IconFile {
|
|
|
|
ok: boolean;
|
|
|
|
status: number;
|
|
|
|
svg: string;
|
|
|
|
}
|
2020-07-15 21:30:37 +00:00
|
|
|
|
2020-10-16 13:28:46 +00:00
|
|
|
const iconFiles = new Map<string, Promise<IconFile>>();
|
2020-07-15 21:30:37 +00:00
|
|
|
|
2020-10-16 13:28:46 +00:00
|
|
|
export const requestIcon = (url: string) => {
|
|
|
|
if (iconFiles.has(url)) {
|
|
|
|
return iconFiles.get(url);
|
|
|
|
} else {
|
|
|
|
const request = fetch(url).then(async response => {
|
|
|
|
if (response.ok) {
|
2020-07-15 21:30:37 +00:00
|
|
|
const div = document.createElement('div');
|
2020-10-16 13:28:46 +00:00
|
|
|
div.innerHTML = await response.text();
|
2020-07-15 21:30:37 +00:00
|
|
|
const svg = div.firstElementChild;
|
2020-10-16 13:28:46 +00:00
|
|
|
|
|
|
|
return {
|
|
|
|
ok: response.ok,
|
|
|
|
status: response.status,
|
|
|
|
svg: svg && svg.tagName.toLowerCase() === 'svg' ? svg.outerHTML : ''
|
|
|
|
};
|
2020-07-15 21:30:37 +00:00
|
|
|
} else {
|
2020-10-16 13:28:46 +00:00
|
|
|
return {
|
|
|
|
ok: response.ok,
|
|
|
|
status: response.status,
|
|
|
|
svg: null
|
|
|
|
};
|
2020-07-15 21:30:37 +00:00
|
|
|
}
|
2021-02-26 14:09:13 +00:00
|
|
|
}) as Promise<IconFile>;
|
2020-07-15 21:30:37 +00:00
|
|
|
|
2020-10-16 13:28:46 +00:00
|
|
|
iconFiles.set(url, request);
|
|
|
|
return request;
|
2020-07-15 21:30:37 +00:00
|
|
|
}
|
|
|
|
};
|