Implemented pre-loading external style functionality

This commit is contained in:
Alicia Sykes
2021-04-08 19:53:04 +01:00
parent 99dc9299ed
commit 0cb6cc7d62
4 changed files with 177 additions and 18 deletions

38
src/utils/ThemeHelper.js Normal file
View File

@@ -0,0 +1,38 @@
/**
* A function for pre-loading, and easy switching of external stylesheets
*/
const ThemeHelper = function th() {
/* Preload content, to avoid FOUC */
const preloadTheme = (href) => {
const link = document.createElement('link');
link.rel = 'stylesheet';
link.href = href;
document.head.appendChild(link);
return new Promise((resolve, reject) => {
link.onload = e => {
const { sheet } = e.target;
sheet.disabled = true;
resolve(sheet);
};
link.onerror = reject;
});
};
const selectTheme = (themes, name) => {
const themeResults = themes;
if (name && !themes[name]) {
throw new Error(`'${name}' has not been defined as a theme.`);
}
Object.keys(themeResults).forEach(n => { themeResults[n].disabled = (n !== name); });
};
const themes = {};
return {
add(name, href) { return preloadTheme(href).then(s => { themes[name] = s; }); },
set theme(name) { selectTheme(themes, name); },
get theme() { return Object.keys(themes).find(n => !themes[n].disabled); },
};
};
export default ThemeHelper;