@alshdavid/reactive
Version:
Generic object mutation observation
43 lines (40 loc) • 1.11 kB
JavaScript
import { useState, useMemo, useEffect } from 'preact/hooks';
import { create } from '../reactive/create.module.js';
import { observe } from '../reactive/observe.module.js';
import '../reactive/index.module.js';
const isConstructor = (f) => {
try {
Reflect.construct(String, [], f);
}
catch (e) {
return false;
}
return true;
};
const useViewModel = (ctor, args = []) => {
const [, forceUpdate] = useState(false);
const vm = useMemo(() => {
if (isConstructor(ctor)) {
const $Ctor = create(ctor);
return new $Ctor(...args);
}
else {
return create(ctor());
}
}, [window]);
useEffect(() => {
if (vm.onInit) {
vm.onInit();
}
const sub = observe(vm).subscribe(() => forceUpdate(s => !s));
return () => {
sub.unsubscribe();
if (vm.onDestroy) {
vm.onDestroy();
}
};
}, [window]);
return vm;
};
export default useViewModel;
export { useViewModel };