subapp-web
Version:
Electrode subapp web support
1 lines • 3.27 kB
JavaScript
import{createBrowserHistory}from"history";import makeSubAppSpec from"./make-subapp-spec";import xarc from"./xarc";export{default as makeSubAppSpec}from"./make-subapp-spec";export{default as xarc}from"./xarc";let FrameworkLib;export function setupFramework(e){FrameworkLib=e}export function loadSubApp(e,r,t){setTimeout(()=>xarc.watchSubAppOnLoad(),0);const n=(e=makeSubAppSpec(e)).name,o=e.ns;let p=xarc.getSubApp(n)||{info:e};if(xarc.getBundle(n,o)||xarc.setBundle(n,1,o),p._started)return e;p._started=[],xarc.setSubApp(n,p),p._renderStart=r||((e,r)=>new FrameworkLib({subApp:p,element:r,options:e}).renderStart()),p.getInstance=e=>{let r,t=e.id||e.elementId;t?r=document.getElementById(t):t=e._genId;let o=p._started.find(e=>e.id===t);return o?o.element!==r&&(o.element=r):(o=Object.assign({},e,{id:t,element:r}),p._started.push(o)),r&&console.debug("rendering subapp",n,"into",r),o},p.preStart=(e,r,t)=>(e=e||p.getInstance(r),t=t||p.info,e._prepared||(t.prepare?e._prepared=t.prepare(e,r,t):e._prepared=r.initialState||{}),e),p.preRender=e.__preRender,p.signalReady=e.__signalReady,p.start=(e,r,t)=>{e=e||p.preStart(e,r,t),t=t||p.info,e&&!e.props&&r&&(e.props=r.props);const n=()=>t.start?t.start(e,e.element):p._renderStart(e,e.element);return e._prepared&&e._prepared.then?e._prepared.then(r=>(e._prepared=r,n())):n()};const a=(e,r,t)=>e.queue.find(e=>{if(e.options.name===t&&e.options.group===r&&e.options.inline)return e.instance});return p.inline=({group:e,props:r})=>{const t=e=>(console.error(e),`\x3c!--\n****** ${e}\n--\x3e`);let o;if(e){const r=xarc.rt.groups[e];if(!r)return t(`subApp inline unable to find group ${e}`);if(o=a(r,e,p.info.name),!o)return t(`subApp inline unable to find instance in group ${e} for subapp ${p.info.name}`)}else if(o=(({name:e})=>{for(let r in xarc.rt.groups){const t=xarc.rt.groups[r];return a(t,t.group,e)}})(r),!o)return t(`subApp inline unable to find a group with instance for subApp ${n}`);return p.start(o.instance,Object.assign({},o.options,{props:r}),o.info)},e}export function getSubAppComponent({name:e,timeout:r=15e3,onReady:t,onError:n,fallback:o}){}export function waitForSubApp(e,r=15e3){return new Promise((t,n)=>{lazyLoadSubApp({name:e,onLoad:()=>t(),onError:()=>n(),timeout:r})})}export function isLoaded(e){return Boolean(xarc.getSubApp(e))}export function lazyLoadSubApp({name:e,id:r,timeout:t=15e3,onLoad:n,onError:o,fallback:p,ns:a,props:s}){const i=e.toLowerCase();if(void 0===xarc.getBundle(e,a))xarc.loadSubAppBundles(i,null,a);else if(!r&&!n){const r=(()=>{const r=xarc.getSubApp(e);return!!r&&r.start(null,{})})();if(r)return r}const u=Date.now(),c=p=>{setTimeout(()=>{const p=xarc.getSubApp(e);if(p)return xarc.startSubApp(p,{id:r},!0).then(()=>((e,t)=>{if(!r)return n&&n();if(document.getElementById(r)&&t.start)return t.start(e,{id:r,props:s})})(null,p));if(t>50&&Date.now()-u>t){const r="lazyLoadSubApp Timeout: "+e;return o?o(new Error(r)):console.error(r)}return c(50)},p)};return c(0),p}export{lazyLoadSubApp as dynamicLoadSubApp};export function getBrowserHistory(){return xarc.rt.history||(xarc.rt.history=createBrowserHistory()),xarc.rt.history}export function hotReloadSubApp(e){e=e.default||e;const r=xarc.getSubApp(e.name);r.info=e,r._started.forEach(e=>setTimeout(()=>r.start(e),0))}