BetterDiscordApp-rauenzi/renderer/src/modules/thememanager.js

93 lines
3.7 KiB
JavaScript
Raw Normal View History

2023-05-20 00:37:21 +02:00
import path from "path";
import Config from "@data/config";
import AddonError from "@structs/addonerror";
2019-06-27 22:18:40 +02:00
import AddonManager from "./addonmanager";
2019-06-09 04:24:05 +02:00
import Settings from "./settingsmanager";
2019-06-19 05:09:49 +02:00
import DOMManager from "./dommanager";
2019-06-25 22:36:34 +02:00
import Strings from "./strings";
2023-05-20 00:37:21 +02:00
import Toasts from "@ui/toasts";
import Modals from "@ui/modals";
import SettingsRenderer from "@ui/settings";
2019-05-28 20:19:48 +02:00
2019-06-27 22:18:40 +02:00
export default new class ThemeManager extends AddonManager {
2019-06-08 08:35:43 +02:00
get name() {return "ThemeManager";}
get extension() {return ".theme.css";}
get duplicatePattern() {return /\.theme\s?\([0-9]+\)\.css/;}
2019-06-27 22:18:40 +02:00
get addonFolder() {return path.resolve(Config.dataPath, "themes");}
2019-06-08 08:35:43 +02:00
get prefix() {return "theme";}
2019-06-30 07:32:14 +02:00
get language() {return "css";}
2019-05-28 20:19:48 +02:00
initialize() {
const errors = super.initialize();
2022-10-03 10:40:18 +02:00
Settings.registerPanel("themes", Strings.Panels.themes, {
order: 4,
2023-03-20 04:41:39 +01:00
element: SettingsRenderer.getAddonPanel(Strings.Panels.themes, this.addonList, this.state, {
2022-10-03 10:40:18 +02:00
type: this.prefix,
folder: this.addonFolder,
onChange: this.toggleTheme.bind(this),
reload: this.reloadTheme.bind(this),
refreshList: this.updateThemeList.bind(this),
saveAddon: this.saveAddon.bind(this),
editAddon: this.editAddon.bind(this),
deleteAddon: this.deleteAddon.bind(this),
enableAll: this.enableAllAddons.bind(this),
disableAll: this.disableAllAddons.bind(this),
2022-10-03 10:40:18 +02:00
prefix: this.prefix
})
});
2019-06-24 21:47:24 +02:00
return errors;
2019-06-09 04:24:05 +02:00
}
2019-05-28 20:19:48 +02:00
2019-06-24 21:47:24 +02:00
/* Aliases */
updateThemeList() {return this.updateList();}
2019-06-27 22:18:40 +02:00
loadAllThemes() {return this.loadAllAddons();}
2019-06-24 21:47:24 +02:00
2019-06-27 22:18:40 +02:00
enableTheme(idOrAddon) {return this.enableAddon(idOrAddon);}
disableTheme(idOrAddon) {return this.disableAddon(idOrAddon);}
toggleTheme(id) {return this.toggleAddon(id);}
2019-05-28 20:19:48 +02:00
2019-06-27 22:18:40 +02:00
unloadTheme(idOrFileOrAddon) {return this.unloadAddon(idOrFileOrAddon);}
loadTheme(filename) {return this.loadAddon(filename);}
reloadTheme(idOrFileOrAddon) {return this.reloadAddon(idOrFileOrAddon);}
2019-05-28 20:19:48 +02:00
2021-04-06 20:09:43 +02:00
loadAddon(filename, shouldCTE = true) {
2021-04-07 03:40:19 +02:00
const error = super.loadAddon(filename, shouldCTE);
2021-04-06 20:09:43 +02:00
if (error && shouldCTE) Modals.showAddonErrors({themes: [error]});
return error;
2019-05-28 20:19:48 +02:00
}
2019-06-08 08:35:43 +02:00
/* Overrides */
initializeAddon(addon) {
if (!addon.name || !addon.author || !addon.description || !addon.version) return new AddonError(addon.name || addon.filename, addon.filename, "Addon is missing name, author, description, or version", {message: "Addon must provide name, author, description, and version.", stack: ""}, this.prefix);
}
requireAddon(filename) {
const addon = super.requireAddon(filename);
addon.css = addon.fileContent;
delete addon.fileContent;
if (addon.format == "json") addon.css = addon.css.split("\n").slice(1).join("\n");
return addon;
2019-06-19 21:24:05 +02:00
}
2019-06-08 08:35:43 +02:00
2019-06-27 22:18:40 +02:00
startAddon(id) {return this.addTheme(id);}
stopAddon(id) {return this.removeTheme(id);}
2019-06-08 08:35:43 +02:00
2019-06-27 22:18:40 +02:00
addTheme(idOrAddon) {
const addon = typeof(idOrAddon) == "string" ? this.addonList.find(p => p.id == idOrAddon) : idOrAddon;
if (!addon) return;
DOMManager.injectTheme(addon.slug + "-theme-container", addon.css);
Toasts.show(Strings.Addons.enabled.format({name: addon.name, version: addon.version}));
2019-05-28 20:19:48 +02:00
}
2019-06-27 22:18:40 +02:00
removeTheme(idOrAddon) {
const addon = typeof(idOrAddon) == "string" ? this.addonList.find(p => p.id == idOrAddon) : idOrAddon;
if (!addon) return;
DOMManager.removeTheme(addon.slug + "-theme-container");
Toasts.show(Strings.Addons.disabled.format({name: addon.name, version: addon.version}));
2019-06-08 08:35:43 +02:00
}
};