2019-05-29 05:48:41 +02:00
|
|
|
import {SettingsInfo, SettingsCookie, Plugins, Themes} from "data";
|
|
|
|
import {BDV2, Utilities, ContentManager, Emitter, EmoteModule, EmoteMenu, PluginManager, ThemeManager} from "modules";
|
2019-05-28 23:27:25 +02:00
|
|
|
import Sidebar from "./sidebar";
|
|
|
|
import Scroller from "../scroller";
|
|
|
|
import List from "../list";
|
|
|
|
import ContentColumn from "./contentcolumn";
|
|
|
|
import SectionedSettingsPanel from "./sectionedsettings";
|
|
|
|
import Tools from "./exitbutton";
|
|
|
|
import SettingsPanel from "./panel";
|
|
|
|
import PluginCard from "./plugincard";
|
|
|
|
import ThemeCard from "./themecard";
|
|
|
|
import ReloadIcon from "../icons/reload";
|
|
|
|
|
|
|
|
import CssEditor from "../customcss/editor";
|
|
|
|
|
2019-05-28 20:19:48 +02:00
|
|
|
export default class V2_SettingsPanel {
|
|
|
|
|
2019-05-29 05:48:41 +02:00
|
|
|
constructor(props) {
|
|
|
|
this.sideBarOnClick = this.sideBarOnClick.bind(this);
|
|
|
|
this.onChange = props.onChange;
|
|
|
|
this.sidebar = new Sidebar(this.sideBarOnClick);
|
2019-05-28 20:19:48 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
get root() {
|
|
|
|
let _root = $("#bd-settingspane-container");
|
|
|
|
if (!_root.length) {
|
|
|
|
if (!this.injectRoot()) return null;
|
|
|
|
return this.root;
|
|
|
|
}
|
|
|
|
return _root[0];
|
|
|
|
}
|
|
|
|
|
|
|
|
injectRoot() {
|
|
|
|
if (!$(".layer-3QrUeG .standardSidebarView-3F1I7i, .layer-3QrUeG .ui-standard-sidebar-view").length) return false;
|
|
|
|
const root = $("<div/>", {
|
|
|
|
"class": "contentRegion-3nDuYy content-region",
|
|
|
|
"id": "bd-settingspane-container"
|
|
|
|
});
|
|
|
|
$(".layer-3QrUeG .standardSidebarView-3F1I7i, .layer-3QrUeG .ui-standard-sidebar-view").append(root);
|
|
|
|
|
2019-05-28 23:27:25 +02:00
|
|
|
Utilities.onRemoved(root[0], () => {
|
2019-05-28 20:19:48 +02:00
|
|
|
BDV2.reactDom.unmountComponentAtNode(root[0]);
|
|
|
|
});
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
get coreSettings() {
|
2019-05-28 20:55:07 +02:00
|
|
|
const settings = this.getSettings("core");
|
|
|
|
const categories = [...new Set(settings.map(s => s.category))];
|
|
|
|
const sections = categories.map(c => {return {title: c, settings: settings.filter(s => s.category == c)};});
|
|
|
|
return sections;
|
2019-05-28 20:19:48 +02:00
|
|
|
}
|
2019-05-28 20:55:07 +02:00
|
|
|
|
2019-05-28 20:19:48 +02:00
|
|
|
get emoteSettings() {
|
|
|
|
return this.getSettings("emote");
|
|
|
|
}
|
|
|
|
getSettings(category) {
|
2019-05-28 23:27:25 +02:00
|
|
|
return Object.keys(SettingsInfo).reduce((arr, key) => {
|
|
|
|
let setting = SettingsInfo[key];
|
2019-05-28 20:19:48 +02:00
|
|
|
if (setting.cat === category && setting.implemented && !setting.hidden) {
|
|
|
|
setting.text = key;
|
|
|
|
arr.push(setting);
|
|
|
|
}
|
|
|
|
return arr;
|
|
|
|
}, []);
|
|
|
|
}
|
|
|
|
|
|
|
|
sideBarOnClick(id) {
|
|
|
|
let self = this;
|
|
|
|
$(".contentRegion-3nDuYy, .content-region").first().hide();
|
|
|
|
$(self.root).show();
|
|
|
|
switch (id) {
|
|
|
|
case "core":
|
|
|
|
self.renderCoreSettings();
|
|
|
|
break;
|
|
|
|
case "emotes":
|
|
|
|
self.renderEmoteSettings();
|
|
|
|
break;
|
|
|
|
case "customcss":
|
|
|
|
self.renderCustomCssEditor();
|
|
|
|
break;
|
|
|
|
case "plugins":
|
|
|
|
self.renderPluginPane();
|
|
|
|
break;
|
|
|
|
case "themes":
|
|
|
|
self.renderThemePane();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
renderSidebar() {
|
|
|
|
let self = this;
|
|
|
|
$("[class*='side-'] > [class*='item-']").off("click.v2settingspanel").on("click.v2settingspanel", () => {
|
|
|
|
BDV2.reactDom.unmountComponentAtNode(self.root);
|
|
|
|
$(self.root).hide();
|
|
|
|
$(".contentRegion-3nDuYy, .content-region").first().show();
|
|
|
|
});
|
|
|
|
self.sidebar.render();
|
|
|
|
}
|
|
|
|
|
|
|
|
get coreComponent() {
|
2019-05-28 23:27:25 +02:00
|
|
|
return BDV2.react.createElement(Scroller, {contentColumn: true, fade: true, dark: true, children: [
|
|
|
|
BDV2.react.createElement(SectionedSettingsPanel, {key: "cspanel", onChange: this.onChange, sections: this.coreSettings}),
|
|
|
|
BDV2.react.createElement(Tools, {key: "tools"})
|
2019-05-28 20:55:07 +02:00
|
|
|
]});
|
2019-05-28 20:19:48 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
get emoteComponent() {
|
2019-05-28 23:27:25 +02:00
|
|
|
return BDV2.react.createElement(Scroller, {
|
2019-05-28 20:55:07 +02:00
|
|
|
contentColumn: true, fade: true, dark: true, children: [
|
2019-05-28 23:27:25 +02:00
|
|
|
BDV2.react.createElement(SettingsPanel, {key: "espanel", title: "Emote Settings", onChange: this.onChange, settings: this.emoteSettings, button: {
|
2019-05-28 20:55:07 +02:00
|
|
|
title: "Clear Emote Cache",
|
2019-05-29 05:48:41 +02:00
|
|
|
onClick: () => { EmoteModule.clearEmoteData(); EmoteModule.init(); EmoteMenu.init(); }
|
2019-05-28 20:55:07 +02:00
|
|
|
}}),
|
2019-05-28 23:27:25 +02:00
|
|
|
BDV2.react.createElement(Tools, {key: "tools"})
|
2019-05-28 20:55:07 +02:00
|
|
|
]});
|
2019-05-28 20:19:48 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
get customCssComponent() {
|
2019-05-28 23:27:25 +02:00
|
|
|
return BDV2.react.createElement(Scroller, {contentColumn: true, fade: true, dark: true, children: [BDV2.react.createElement(CssEditor, {key: "csseditor"}), BDV2.react.createElement(Tools, {key: "tools"})]});
|
2019-05-28 20:19:48 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
contentComponent(type) {
|
|
|
|
const componentElement = type == "plugins" ? this.pluginsComponent : this.themesComponent;
|
|
|
|
const prefix = type.replace("s", "");
|
|
|
|
const settingsList = this;
|
|
|
|
class ContentList extends BDV2.react.Component {
|
|
|
|
constructor(props) {
|
|
|
|
super(props);
|
|
|
|
this.onChange = this.onChange.bind(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
componentDidMount() {
|
2019-05-28 23:27:25 +02:00
|
|
|
Emitter.on(`${prefix}-reloaded`, this.onChange);
|
|
|
|
Emitter.on(`${prefix}-loaded`, this.onChange);
|
|
|
|
Emitter.on(`${prefix}-unloaded`, this.onChange);
|
2019-05-28 20:19:48 +02:00
|
|
|
}
|
2019-05-28 20:55:07 +02:00
|
|
|
|
2019-05-28 20:19:48 +02:00
|
|
|
componentWillUnmount() {
|
2019-05-28 23:27:25 +02:00
|
|
|
Emitter.off(`${prefix}-reloaded`, this.onChange);
|
|
|
|
Emitter.off(`${prefix}-loaded`, this.onChange);
|
|
|
|
Emitter.off(`${prefix}-unloaded`, this.onChange);
|
2019-05-28 20:19:48 +02:00
|
|
|
}
|
2019-05-28 20:55:07 +02:00
|
|
|
|
2019-05-28 20:19:48 +02:00
|
|
|
onChange() {
|
|
|
|
settingsList.sideBarOnClick(type);
|
|
|
|
}
|
|
|
|
|
|
|
|
render() {return componentElement;}
|
|
|
|
}
|
|
|
|
return BDV2.react.createElement(ContentList);
|
|
|
|
}
|
|
|
|
|
|
|
|
get pluginsComponent() {
|
2019-05-29 05:48:41 +02:00
|
|
|
let plugins = Object.keys(Plugins).sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase())).reduce((arr, key) => {
|
|
|
|
arr.push(BDV2.react.createElement(PluginCard, {key: key, plugin: Plugins[key].plugin}));return arr;
|
2019-05-28 20:19:48 +02:00
|
|
|
}, []);
|
2019-05-28 23:27:25 +02:00
|
|
|
let list = BDV2.react.createElement(List, {key: "plugin-list", className: "bda-slist", children: plugins});
|
2019-05-29 05:48:41 +02:00
|
|
|
let refreshIcon = !SettingsCookie["fork-ps-5"] && BDV2.react.createElement(ReloadIcon, {className: "bd-reload-header", size: "18px", onClick: async () => {
|
|
|
|
PluginManager.updatePluginList();
|
2019-05-28 20:19:48 +02:00
|
|
|
this.sideBarOnClick("plugins");
|
|
|
|
}});
|
|
|
|
let pfBtn = BDV2.react.createElement("button", {key: "folder-button", className: "bd-pfbtn", onClick: () => { require("electron").shell.openItem(ContentManager.pluginsFolder); }}, "Open Plugin Folder");
|
2019-05-28 23:27:25 +02:00
|
|
|
let contentColumn = BDV2.react.createElement(ContentColumn, {key: "pcolumn", title: "Plugins", children: [refreshIcon, pfBtn, list]});
|
|
|
|
return BDV2.react.createElement(Scroller, {contentColumn: true, fade: true, dark: true, children: [contentColumn, BDV2.react.createElement(Tools, {key: "tools"})]});
|
2019-05-28 20:19:48 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
get themesComponent() {
|
2019-05-29 05:48:41 +02:00
|
|
|
let themes = Object.keys(Themes).sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase())).reduce((arr, key) => {
|
|
|
|
arr.push(BDV2.react.createElement(ThemeCard, {key: key, theme: Themes[key]}));return arr;
|
2019-05-28 20:19:48 +02:00
|
|
|
}, []);
|
2019-05-28 23:27:25 +02:00
|
|
|
let list = BDV2.react.createElement(List, {key: "theme-list", className: "bda-slist", children: themes});
|
2019-05-29 05:48:41 +02:00
|
|
|
let refreshIcon = !SettingsCookie["fork-ps-5"] && BDV2.react.createElement(ReloadIcon, {className: "bd-reload-header", size: "18px", onClick: async () => {
|
|
|
|
ThemeManager.updateThemeList();
|
2019-05-28 20:19:48 +02:00
|
|
|
this.sideBarOnClick("themes");
|
|
|
|
}});
|
|
|
|
let tfBtn = BDV2.react.createElement("button", {key: "folder-button", className: "bd-pfbtn", onClick: () => { require("electron").shell.openItem(ContentManager.themesFolder); }}, "Open Theme Folder");
|
2019-05-28 23:27:25 +02:00
|
|
|
let contentColumn = BDV2.react.createElement(ContentColumn, {key: "tcolumn", title: "Themes", children: [refreshIcon, tfBtn, list]});
|
|
|
|
return BDV2.react.createElement(Scroller, {contentColumn: true, fade: true, dark: true, children: [contentColumn, BDV2.react.createElement(Tools, {key: "tools"})]});
|
2019-05-28 20:19:48 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
renderCoreSettings() {
|
|
|
|
let root = this.root;
|
|
|
|
if (!root) {
|
|
|
|
console.log("FAILED TO LOCATE ROOT: .layer-3QrUeG .standardSidebarView-3F1I7i");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
BDV2.reactDom.render(this.coreComponent, root);
|
|
|
|
}
|
|
|
|
|
|
|
|
renderEmoteSettings() {
|
|
|
|
let root = this.root;
|
|
|
|
if (!root) {
|
|
|
|
console.log("FAILED TO LOCATE ROOT: .layer-3QrUeG .standardSidebarView-3F1I7i");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
BDV2.reactDom.render(this.emoteComponent, root);
|
|
|
|
}
|
|
|
|
|
|
|
|
renderCustomCssEditor() {
|
|
|
|
let root = this.root;
|
|
|
|
if (!root) {
|
|
|
|
console.log("FAILED TO LOCATE ROOT: .layer-3QrUeG .standardSidebarView-3F1I7i");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
BDV2.reactDom.render(this.customCssComponent, root);
|
|
|
|
}
|
|
|
|
|
|
|
|
renderPluginPane() {
|
|
|
|
let root = this.root;
|
|
|
|
if (!root) {
|
|
|
|
console.log("FAILED TO LOCATE ROOT: .layer-3QrUeG .standardSidebarView-3F1I7i");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
BDV2.reactDom.render(this.contentComponent("plugins"), root);
|
|
|
|
}
|
|
|
|
|
|
|
|
renderThemePane() {
|
|
|
|
let root = this.root;
|
|
|
|
if (!root) {
|
|
|
|
console.log("FAILED TO LOCATE ROOT: .layer-3QrUeG .standardSidebarView-3F1I7i");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
BDV2.reactDom.render(this.contentComponent("themes"), root);
|
|
|
|
}
|
|
|
|
}
|