Initial Settings UI work

This commit is contained in:
Vendicated
2023-04-09 00:49:47 +02:00
parent 8b68eef9a7
commit 7e0532444d
16 changed files with 169 additions and 37 deletions

12
src/shared/settings.d.ts vendored Normal file
View File

@@ -0,0 +1,12 @@
export interface Settings {
maximized?: boolean;
minimized?: boolean;
windowBounds?: {
x: number;
y: number;
width: number;
height: number;
};
discordBranch?: "stable" | "canary" | "ptb";
openLinksWithElectron?: boolean;
}

View File

@@ -0,0 +1,20 @@
export function makeChangeListenerProxy<T extends object>(object: T, onChange: (object: T) => void, _root = object): T {
return new Proxy(object, {
get(target, key) {
const v = target[key];
if (typeof v === "object" && !Array.isArray(v) && v !== null)
return makeChangeListenerProxy(v, onChange, _root);
return v;
},
set(target, key, value) {
if (target[key] === value) return true;
Reflect.set(target, key, value);
onChange(_root);
return true;
},
});
}

View File

@@ -0,0 +1,13 @@
type Func = (...args: any[]) => any;
export function monkeyPatch<O extends object>(object: O, key: keyof O, replacement: (original: Func, ...args: any[]) => any): void {
const original = object[key] as Func;
const replacer = object[key] = function (this: unknown, ...args: any[]) {
return replacement.call(this, original, ...args);
} as any;
Object.defineProperties(replacer, Object.getOwnPropertyDescriptors(original));
replacer.toString = () => original.toString();
replacer.$$original = original;
}