BetterDiscordApp-v2/client/src/structs/settings/types/custom.js

82 lines
2.6 KiB
JavaScript

/**
* BetterDiscord Custom Setting Struct
* Copyright (c) 2015-present Jiiks/JsSucks - https://github.com/Jiiks / https://github.com/JsSucks
* All rights reserved.
* https://betterdiscord.net
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
import { Globals } from 'modules';
import path from 'path';
import Setting from './basesetting';
import SettingsCategory from '../settingscategory';
import SettingsScheme from '../settingsscheme';
export default class CustomSetting extends Setting {
constructor(args, ...merge) {
super(args, ...merge);
if (this.args.class_file && this.path)
this.setClass(this.args.class_file, this.args.class);
}
/**
* The file to load the custom setting from.
*/
get file() {
return this.args.file;
}
/**
* The name of a function on the plugin's main object that will be called to get a Vue component or a HTML element.
*/
get function() {
return this.args.function;
}
/**
* The name of an export of {file}, or a Vue component.
*/
get component() {
return this.args.component;
}
/**
* Whether to show a debug view under the custom setting's component.
*/
get debug() {
return this.args.debug || false;
}
/**
* Sets the path of the plugin/theme this setting is part of.
* Used by settings of type "array", "custom" and "file".
* @param {String} contentPath The plugin/theme's directory path
*/
setContentPath(_path) {
this.args.path = _path;
if (this.args.class_file)
this.setClass(this.args.class_file, this.args.class);
}
/**
* Replaces the custom setting's prototype with a new one that extends CustomSetting.
* @param {String} classFile The path of a file relative to the plugin/theme's directory that will be required
* @param {String} classExport The name of a property of the file's exports that will be used (optional)
*/
setClass(class_file, class_export) {
const component = Globals.require(path.join(this.path, class_file));
const setting_class = class_export ? component[class_export](CustomSetting) : component.default ? component.default(CustomSetting) : component(CustomSetting);
if (!(setting_class.prototype instanceof CustomSetting))
throw {message: 'Custom setting class function returned a class that doesn\'t extend from CustomSetting.'};
this.__proto__ = setting_class.prototype;
}
}