UNPKG

@expressive/react

Version:
124 lines (121 loc) 3.27 kB
// src/model.as.ts import { Model } from "@expressive/mvc"; import { Context, createProvider } from "./context"; Model.as = function(render) { if (this === Model) throw new Error("Cannot create component from base Model."); const Component = (props) => { const local = this.use((self) => { self.set(props); if (props.is) return props.is(self); }); local.set(props); return createProvider(Context.get(local), render(props, local)); }; Component.Model = this; Component.displayName = this.name; return Component; }; // src/model.use.ts import { Model as Model2, Context as Context2 } from "@expressive/mvc"; import { Pragma } from "./adapter"; Model2.use = function(argument, repeat) { const context = Context2.use(true); const render = Pragma.useFactory((refresh) => { let enabled; let local; const instance = new this(argument); context.include(instance); const unwatch = instance.get((current) => { local = current; if (enabled) refresh(); }); function didMount() { enabled = true; return () => { unwatch(); context.pop(); instance.set(null); }; } return (props) => { Pragma.useLifecycle(didMount); if (enabled && repeat && props) { enabled = false; if (typeof props == "function") { props.call(instance, instance); props = void 0; } const update = instance.set(props); if (update) update.then(() => enabled = true); else enabled = true; } return local; }; }); return render(argument); }; // src/model.get.ts import { createEffect, Model as Model3 } from "@expressive/mvc"; import { Pragma as Pragma2 } from "./adapter"; Model3.get = function(argument) { const context = Pragma2.useContext(); const render = Pragma2.useFactory((refresh) => { function forceUpdate(action) { if (typeof action == "function") action = action(); refresh(); if (action) return action.finally(refresh); } const instance = context.get(this); if (!instance) if (argument === false) return () => void 0; else throw new Error(`Could not find ${this} in context.`); let unwatch; let value; unwatch = createEffect(instance, (current) => { if (typeof argument === "function") { const next = argument.call(current, current, forceUpdate); if (next === value) return; value = next; } else value = current; if (unwatch) refresh(); }, argument === true); if (value instanceof Promise) { let error; unwatch(); value.then((x) => value = x, (e) => error = e).finally(refresh); value = null; return () => { if (error) throw error; return value === void 0 ? null : value; }; } if (value === null) { unwatch(); return () => null; } return () => { Pragma2.useLifecycle(() => unwatch); return value === void 0 ? null : value; }; }); return render(); }; // src/adapter.ts var Pragma3 = {}; export { Pragma3 as Pragma }; //# sourceMappingURL=adapter.js.map