280 lines
		
	
	
		
			No EOL
		
	
	
		
			11 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			280 lines
		
	
	
		
			No EOL
		
	
	
		
			11 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| (async function() {
 | |
|           while (!Spicetify.React || !Spicetify.ReactDOM) {
 | |
|             await new Promise(resolve => setTimeout(resolve, 10));
 | |
|           }
 | |
|           "use strict";
 | |
| var library = (() => {
 | |
|   var __create = Object.create;
 | |
|   var __defProp = Object.defineProperty;
 | |
|   var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
 | |
|   var __getOwnPropNames = Object.getOwnPropertyNames;
 | |
|   var __getOwnPropSymbols = Object.getOwnPropertySymbols;
 | |
|   var __getProtoOf = Object.getPrototypeOf;
 | |
|   var __hasOwnProp = Object.prototype.hasOwnProperty;
 | |
|   var __propIsEnum = Object.prototype.propertyIsEnumerable;
 | |
|   var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
 | |
|   var __spreadValues = (a, b) => {
 | |
|     for (var prop in b || (b = {}))
 | |
|       if (__hasOwnProp.call(b, prop))
 | |
|         __defNormalProp(a, prop, b[prop]);
 | |
|     if (__getOwnPropSymbols)
 | |
|       for (var prop of __getOwnPropSymbols(b)) {
 | |
|         if (__propIsEnum.call(b, prop))
 | |
|           __defNormalProp(a, prop, b[prop]);
 | |
|       }
 | |
|     return a;
 | |
|   };
 | |
|   var __commonJS = (cb, mod) => function __require() {
 | |
|     return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
 | |
|   };
 | |
|   var __export = (target, all) => {
 | |
|     for (var name in all)
 | |
|       __defProp(target, name, { get: all[name], enumerable: true });
 | |
|   };
 | |
|   var __copyProps = (to, from, except, desc) => {
 | |
|     if (from && typeof from === "object" || typeof from === "function") {
 | |
|       for (let key of __getOwnPropNames(from))
 | |
|         if (!__hasOwnProp.call(to, key) && key !== except)
 | |
|           __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
 | |
|     }
 | |
|     return to;
 | |
|   };
 | |
|   var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
 | |
|     isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
 | |
|     mod
 | |
|   ));
 | |
|   var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
 | |
| 
 | |
|   // external-global-plugin:react
 | |
|   var require_react = __commonJS({
 | |
|     "external-global-plugin:react"(exports, module) {
 | |
|       module.exports = Spicetify.React;
 | |
|     }
 | |
|   });
 | |
| 
 | |
|   // src/extensions/config_loader.tsx
 | |
|   var config_loader_exports = {};
 | |
|   __export(config_loader_exports, {
 | |
|     default: () => config_loader_default
 | |
|   });
 | |
| 
 | |
|   // src/components/settings_modal.tsx
 | |
|   var import_react = __toESM(require_react());
 | |
|   var TextInput = (props) => {
 | |
|     const textId = `text-input:${props.storageKey}`;
 | |
|     return /* @__PURE__ */ import_react.default.createElement("label", {
 | |
|       className: "text-input-wrapper"
 | |
|     }, /* @__PURE__ */ import_react.default.createElement("input", {
 | |
|       className: "text-input",
 | |
|       type: "text",
 | |
|       value: props.value || "",
 | |
|       "data-storage-key": props.storageKey,
 | |
|       placeholder: props.placeholder,
 | |
|       id: textId,
 | |
|       title: `Text input for ${props.storageKey}`,
 | |
|       onChange: props.onChange
 | |
|     }));
 | |
|   };
 | |
|   var Dropdown = (props) => {
 | |
|     const dropdownId = `dropdown:${props.storageKey}`;
 | |
|     return /* @__PURE__ */ import_react.default.createElement("label", {
 | |
|       className: "dropdown-wrapper"
 | |
|     }, /* @__PURE__ */ import_react.default.createElement("select", {
 | |
|       className: "dropdown-input",
 | |
|       value: props.value,
 | |
|       "data-storage-key": props.storageKey,
 | |
|       id: dropdownId,
 | |
|       title: `Dropdown for ${props.storageKey}`,
 | |
|       onChange: props.onChange
 | |
|     }, props.options.map((option, index) => /* @__PURE__ */ import_react.default.createElement("option", {
 | |
|       key: index,
 | |
|       value: option
 | |
|     }, option))));
 | |
|   };
 | |
|   var TooltipIcon = () => {
 | |
|     return /* @__PURE__ */ import_react.default.createElement("svg", {
 | |
|       role: "img",
 | |
|       height: "16",
 | |
|       width: "16",
 | |
|       className: "Svg-sc-ytk21e-0 uPxdw nW1RKQOkzcJcX6aDCZB4",
 | |
|       viewBox: "0 0 16 16"
 | |
|     }, /* @__PURE__ */ import_react.default.createElement("path", {
 | |
|       d: "M8 1.5a6.5 6.5 0 100 13 6.5 6.5 0 000-13zM0 8a8 8 0 1116 0A8 8 0 010 8z"
 | |
|     }), /* @__PURE__ */ import_react.default.createElement("path", {
 | |
|       d: "M7.25 12.026v-1.5h1.5v1.5h-1.5zm.884-7.096A1.125 1.125 0 007.06 6.39l-1.431.448a2.625 2.625 0 115.13-.784c0 .54-.156 1.015-.503 1.488-.3.408-.7.652-.973.818l-.112.068c-.185.116-.26.203-.302.283-.046.087-.097.245-.097.57h-1.5c0-.47.072-.898.274-1.277.206-.385.507-.645.827-.846l.147-.092c.285-.177.413-.257.526-.41.169-.23.213-.397.213-.602 0-.622-.503-1.125-1.125-1.125z"
 | |
|     }));
 | |
|   };
 | |
|   var ConfigRow = (props) => {
 | |
|     console.log(props);
 | |
|     const enabled = !!props.modalConfig[props.storageKey];
 | |
|     const value = props.modalConfig[props.storageKey];
 | |
|     const updateItem = (storageKey, state) => {
 | |
|       props.modalConfig[storageKey] = state;
 | |
|       console.debug(`toggling ${storageKey} to ${state}`);
 | |
|       localStorage.setItem(`library:config:${storageKey}`, String(state));
 | |
|       props.updateConfig(props.modalConfig);
 | |
|     };
 | |
|     const settingsToggleChange = (newValue, storageKey) => {
 | |
|       updateItem(storageKey, newValue);
 | |
|       if (props.callback)
 | |
|         props.callback(newValue);
 | |
|     };
 | |
|     const settingsTextChange = (event) => {
 | |
|       console.log("yoohoo");
 | |
|       updateItem(event.target.dataset.storageKey, event.target.value);
 | |
|       console.log(props.callback);
 | |
|       if (props.callback)
 | |
|         props.callback(event.target.value);
 | |
|     };
 | |
|     const settingsDropdownChange = (event) => {
 | |
|       updateItem(event.target.dataset.storageKey, event.target.value);
 | |
|       if (props.callback)
 | |
|         props.callback(event.target.value);
 | |
|     };
 | |
|     const element = () => {
 | |
|       switch (props.type) {
 | |
|         case "dropdown":
 | |
|           return /* @__PURE__ */ import_react.default.createElement(Dropdown, {
 | |
|             name: props.name,
 | |
|             storageKey: props.storageKey,
 | |
|             value,
 | |
|             options: props.options || [],
 | |
|             onChange: settingsDropdownChange
 | |
|           });
 | |
|         case "text":
 | |
|           return /* @__PURE__ */ import_react.default.createElement(TextInput, {
 | |
|             name: props.name,
 | |
|             storageKey: props.storageKey,
 | |
|             value,
 | |
|             placeholder: props.placeholder,
 | |
|             onChange: settingsTextChange
 | |
|           });
 | |
|         default:
 | |
|           return /* @__PURE__ */ import_react.default.createElement(Spicetify.ReactComponent.Toggle, {
 | |
|             id: `toggle:${props.storageKey}`,
 | |
|             value: enabled,
 | |
|             onSelected: (newValue) => {
 | |
|               settingsToggleChange(newValue, props.storageKey);
 | |
|             }
 | |
|           });
 | |
|       }
 | |
|     };
 | |
|     return /* @__PURE__ */ import_react.default.createElement("div", {
 | |
|       className: "setting-row"
 | |
|     }, /* @__PURE__ */ import_react.default.createElement("label", {
 | |
|       className: "col description"
 | |
|     }, props.name, props.desc && /* @__PURE__ */ import_react.default.createElement(Spicetify.ReactComponent.TooltipWrapper, {
 | |
|       label: /* @__PURE__ */ import_react.default.createElement("div", {
 | |
|         dangerouslySetInnerHTML: { __html: props.desc }
 | |
|       }),
 | |
|       renderInline: true,
 | |
|       showDelay: 10,
 | |
|       placement: "top",
 | |
|       labelClassName: "tooltip",
 | |
|       disabled: false
 | |
|     }, /* @__PURE__ */ import_react.default.createElement("div", {
 | |
|       className: "tooltip-icon"
 | |
|     }, /* @__PURE__ */ import_react.default.createElement(TooltipIcon, null)))), /* @__PURE__ */ import_react.default.createElement("div", {
 | |
|       className: "col action"
 | |
|     }, element()));
 | |
|   };
 | |
|   var SettingsModal = ({ CONFIG, settings, updateAppConfig }) => {
 | |
|     const [modalConfig, setModalConfig] = import_react.default.useState(__spreadValues({}, CONFIG));
 | |
|     const updateConfig = (CONFIG2) => {
 | |
|       updateAppConfig(__spreadValues({}, CONFIG2));
 | |
|       setModalConfig(__spreadValues({}, CONFIG2));
 | |
|     };
 | |
|     const configRows = settings.map((setting, index) => {
 | |
|       console.log(setting);
 | |
|       if (setting.sectionHeader) {
 | |
|         return /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, index != 0 ? /* @__PURE__ */ import_react.default.createElement("br", null) : /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null), /* @__PURE__ */ import_react.default.createElement("h2", {
 | |
|           className: "section-header"
 | |
|         }, setting.sectionHeader), /* @__PURE__ */ import_react.default.createElement(ConfigRow, {
 | |
|           name: setting.name,
 | |
|           storageKey: setting.key,
 | |
|           type: setting.type,
 | |
|           options: setting.options,
 | |
|           placeholder: setting.placeholder,
 | |
|           desc: setting.desc,
 | |
|           modalConfig,
 | |
|           updateConfig,
 | |
|           callback: setting.callback
 | |
|         }));
 | |
|       }
 | |
|       return /* @__PURE__ */ import_react.default.createElement(ConfigRow, {
 | |
|         name: setting.name,
 | |
|         storageKey: setting.key,
 | |
|         type: setting.type,
 | |
|         options: setting.options,
 | |
|         placeholder: setting.placeholder,
 | |
|         desc: setting.desc,
 | |
|         modalConfig,
 | |
|         updateConfig,
 | |
|         callback: setting.callback
 | |
|       });
 | |
|     });
 | |
|     return /* @__PURE__ */ import_react.default.createElement("div", {
 | |
|       id: "stats-config-container"
 | |
|     }, configRows);
 | |
|   };
 | |
|   var settings_modal_default = SettingsModal;
 | |
| 
 | |
|   // src/extensions/config_loader.tsx
 | |
|   var import_react2 = __toESM(require_react());
 | |
|   var getLocalStorageDataFromKey = (key, fallback) => {
 | |
|     const data = localStorage.getItem(key);
 | |
|     if (data) {
 | |
|       try {
 | |
|         return JSON.parse(data);
 | |
|       } catch (err) {
 | |
|         return data;
 | |
|       }
 | |
|     } else {
 | |
|       return fallback;
 | |
|     }
 | |
|   };
 | |
|   (function wait() {
 | |
|     const { LocalStorageAPI } = Spicetify == null ? void 0 : Spicetify.Platform;
 | |
|     if (!LocalStorageAPI) {
 | |
|       setTimeout(wait, 100);
 | |
|       return;
 | |
|     }
 | |
|   })();
 | |
|   async function loadConfig(configSettings) {
 | |
|     const { PopupModal } = Spicetify;
 | |
|     await new Promise((resolve) => {
 | |
|       (function checkPopupModal() {
 | |
|         if (PopupModal) {
 | |
|           resolve(void 0);
 | |
|         } else {
 | |
|           setTimeout(checkPopupModal, 100);
 | |
|         }
 | |
|       })();
 | |
|     });
 | |
|     const settingsArray = configSettings.map((setting) => {
 | |
|       return { [setting.key]: getLocalStorageDataFromKey(`library:config:${setting.key}`, setting.def) };
 | |
|     });
 | |
|     let CONFIG = window.CONFIG = Object.assign({}, ...settingsArray);
 | |
|     const updateConfig = (config) => {
 | |
|       window.CONFIG = __spreadValues({}, config);
 | |
|       console.log("updated config", config);
 | |
|     };
 | |
|     const launchModal = window.launchModal = () => {
 | |
|       console.log(settingsArray);
 | |
|       PopupModal.display({
 | |
|         title: "Library Settings",
 | |
|         content: /* @__PURE__ */ import_react2.default.createElement(settings_modal_default, {
 | |
|           CONFIG,
 | |
|           settings: configSettings,
 | |
|           updateAppConfig: updateConfig
 | |
|         }),
 | |
|         isLarge: true
 | |
|       });
 | |
|     };
 | |
|     return { CONFIG, launchModal };
 | |
|   }
 | |
|   var config_loader_default = loadConfig;
 | |
|   return __toCommonJS(config_loader_exports);
 | |
| })();
 | |
| 
 | |
|         })(); | 
