all repos — discord-utils @ 492186c2891cfcdb565eed0850083c9d6f577d4b

src/utils/reactivity.ts (view raw)

 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
export function createReactive<T extends object>(initialState: T, onChange: (state: T) => void): T {
	const handler: ProxyHandler<any> = {
		get(target, prop, receiver) {
			const value = Reflect.get(target, prop, receiver);
			if (typeof value === "object" && value !== null) return new Proxy(value, handler);

			return value;
		},
		set(target, prop, value, receiver) {
			const oldValue = Reflect.get(target, prop, receiver);
			const success = Reflect.set(target, prop, value, receiver);

			if (success && oldValue !== value) onChange(initialState);

			return success;
		},
		deleteProperty(target, prop) {
			const success = Reflect.deleteProperty(target, prop);
			if (success) onChange(initialState);

			return success;
		},
	};

	return new Proxy(initialState, handler);
}