UNPKG

@alshdavid/reactive

Version:

Generic object mutation observation

43 lines (40 loc) 1.11 kB
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 };