@netless/window-manager 0.4.0-canary.12 → 0.4.0-canary.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1 -1
- package/README.md +1 -0
- package/dist/App/MagixEvent/index.d.ts +2 -1
- package/dist/App/Storage/index.d.ts +2 -1
- package/dist/App/Storage/typings.d.ts +1 -0
- package/dist/AppManager.d.ts +2 -1
- package/dist/BoxManager.d.ts +2 -1
- package/dist/Register/storage.d.ts +5 -1
- package/dist/Utils/Common.d.ts +4 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.es.js +3844 -1
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +1 -1
- package/dist/index.umd.js.map +1 -1
- package/dist/style.css +1 -1
- package/docs/api.md +8 -6
- package/docs/concept.md +4 -0
- package/package.json +3 -3
- package/pnpm-lock.yaml +4334 -0
- package/src/App/MagixEvent/index.ts +3 -1
- package/src/App/Storage/index.ts +6 -1
- package/src/App/Storage/typings.ts +4 -2
- package/src/AppContext.ts +6 -6
- package/src/AppManager.ts +37 -19
- package/src/AppProxy.ts +5 -2
- package/src/BoxManager.ts +5 -0
- package/src/Register/index.ts +25 -16
- package/src/Register/loader.ts +1 -1
- package/src/Register/storage.ts +6 -1
- package/src/Utils/Common.ts +32 -1
- package/src/Utils/RoomHacker.ts +1 -0
- package/src/View/ViewManager.ts +1 -2
- package/src/index.ts +20 -0
package/dist/index.es.js
CHANGED
@@ -1,2 +1,3845 @@
|
|
1
|
-
var e,t,i=Object.defineProperty,s=Object.defineProperties,a=Object.getOwnPropertyDescriptors,r=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,o=Object.prototype.propertyIsEnumerable,h=(e,t,s)=>t in e?i(e,t,{enumerable:!0,configurable:!0,writable:!0,value:s}):e[t]=s,c=(e,t)=>{for(var i in t||(t={}))n.call(t,i)&&h(e,i,t[i]);if(r)for(var i of r(t))o.call(t,i)&&h(e,i,t[i]);return e},d=(e,t)=>s(e,a(t));import l from"emittery";import p from"p-retry";import{ResizeObserver as g}from"@juggle/resize-observer";import{debounce as u,isObject as M,has as m,get as w,size as I,mapValues as A,noop as x,pick as C,isEqual as y,isEmpty as b,sortBy as v,maxBy as S,omit as N,compact as D,uniq as f,isFunction as j,isNull as T}from"lodash";import{TELE_BOX_MANAGER_EVENT as E,TELE_BOX_STATE as z,TeleBoxManager as L,TeleBoxCollector as B}from"@netless/telebox-insider";import{UpdateEventKind as P,listenUpdated as V,unlistenUpdated as U,reaction as k,autorun as O,toJS as R,listenDisposed as Z,unlistenDisposed as Q,AnimationMode as G,isPlayer as W,isRoom as Y,ScenePathType as F,ApplianceNames as H,RoomPhase as X,InvisiblePlugin as J,ViewMode as K,WhiteVersion as _}from"white-web-sdk";import{v4 as q}from"uuid";import{genUID as $,SideEffectManager as ee}from"side-effect-manager";import te from"@netless/app-docs-viewer";import ie,{setOptions as se}from"@netless/app-media-player";(t=e||(e={})).AppMove="AppMove",t.AppFocus="AppFocus",t.AppResize="AppResize",t.AppBoxStateChange="AppBoxStateChange",t.GetAttributes="GetAttributes",t.UpdateWindowManagerWrapper="UpdateWindowManagerWrapper",t.InitReplay="InitReplay",t.WindowCreated="WindowCreated",t.SetMainViewScenePath="SetMainViewScenePath",t.SetMainViewSceneIndex="SetMainViewSceneIndex",t.SwitchViewsToFreedom="SwitchViewsToFreedom",t.MoveCameraToContain="MoveCameraToContain";var ae,re,ne,oe,he,ce,de;(re=ae||(ae={})).Size="size",re.Position="position",re.SceneIndex="SceneIndex",re.ZIndex="zIndex",(oe=ne||(ne={})).setBoxSize="setBoxSize",oe.setBoxMinSize="setBoxMinSize",oe.destroy="destroy",(he||(he={})).StartCreate="StartCreate",(de=ce||(ce={})).Leave="leave",de.Normal="normal";const le=340/720,pe=340/720;let ge,ue;const Me=async()=>{ge=await new Promise(((e,t)=>{const i=indexedDB.open("__WindowManagerAppCache",2);i.onerror=e=>{t(e)},i.onupgradeneeded=e=>{const t=e.target.result;t.objectStoreNames.contains("apps")||(ue=t.createObjectStore("apps",{keyPath:"kind"}),ue.createIndex("kind","kind",{unique:!0}))},i.onsuccess=()=>{const t=i.result;e(t)}}))},me=(e,t)=>{var i,s;if(ge)return i=ge,s={kind:e,sourceCode:t},new Promise(((e,t)=>{const a=i.transaction(["apps"],"readwrite").objectStore("apps").add(s);a.onsuccess=()=>e(),a.onerror=()=>t()}))},we=async e=>{return ge?await(t=ge,i=e,new Promise(((e,s)=>{const a=t.transaction(["apps"]).objectStore("apps").index("kind").get(i);a.onerror=e=>s(e),a.onsuccess=()=>{a.result?e(a.result):e(null)}}))):null;var t,i};const Ie=async e=>{const t=await we(e);if(t)return t;{const t=await async function(e,t){const{timeout:i=1e4}=t,s=new AbortController,a=setTimeout((()=>s.abort()),i),r=await fetch(e,d(c({},t),{signal:s.signal,headers:{"content-type":"text/plain"}}));return clearTimeout(a),r}(e,{timeout:1e4}),i=await t.text();return await me(e,i),i}},Ae=(e,t)=>{let i=Function(e+`;return ${t}`)();return void 0===i&&(i=window[t]),i};const xe=new class{constructor(){this.kindEmitters=new Map,this.registered=new Map,this.appClassesCache=new Map,this.appClasses=new Map}async register(e){this.registered.set(e.kind,e);const t=e.src;let i;if(i="string"==typeof t?async()=>{const i=await(async(e,t,i)=>{const s=i||"NetlessApp"+t,a=await Ie(e);try{return Ae(a,s)}catch(r){if(r.message.includes("Can only have one anonymous define call per script file")){const e=window.define;return"function"==typeof e&&e.amd&&delete e.amd,Ae(a,s)}}})(t,e.kind);if(i)return i;throw new Error(`[WindowManager]: load remote script failed, ${t}`)}:"function"==typeof t?t:async()=>t,this.appClasses.set(e.kind,(async()=>{let t=this.appClassesCache.get(e.kind);return t||(t=i(),this.appClassesCache.set(e.kind,t)),t})),e.addHooks){const t=this.createKindEmitter(e.kind);t&&e.addHooks(t)}}async notifyApp(e,t,i){const s=this.kindEmitters.get(e);await(null==s?void 0:s.emit(t,i))}createKindEmitter(e){if(!this.kindEmitters.has(e)){const t=new l;this.kindEmitters.set(e,t)}return this.kindEmitters.get(e)}},Ce=(e,t)=>{e.focusScenePath!==t&&(e.focusScenePath=t)},ye=(e,t)=>{e&&e.isWritable&&e.state.sceneState.scenePath!==t&&e.setScenePath(t)};u(((e,t)=>{e.emit("mainViewModeChange",t)}),200);const be=(e,t,i=0)=>{const s=ve(e)[t];if(!s)return;const a=s[i].name;return"/"===t?`/${a}`:`${t}/${a}`},ve=e=>e.entireScenes(),Se=e=>{const t=e.split(".").map((e=>e.padStart(2,"0"))).join("");return parseInt(t)},Ne=e=>new Promise((t=>setTimeout(t,e)));class De{constructor(t){this.manager=t,this.displayer=this.manager.displayer,this.mainMagixEventListener=t=>{if(t.authorId!==this.displayer.observerId){const i=t.payload;switch(i.eventName){case e.AppMove:this.appMoveHandler(i.payload);break;case e.AppResize:this.appResizeHandler(i.payload);break;case e.AppBoxStateChange:this.boxStateChangeHandler(i.payload);break;case e.SetMainViewScenePath:this.setMainViewScenePathHandler(i.payload);break;case e.MoveCameraToContain:this.moveCameraToContainHandler(i.payload)}}},this.appMoveHandler=e=>{var t;null==(t=this.boxManager)||t.moveBox(e)},this.appResizeHandler=e=>{var t,i;null==(t=this.boxManager)||t.resizeBox(Object.assign(e,{skipUpdate:!0})),null==(i=this.manager.room)||i.refreshViewSize()},this.boxStateChangeHandler=e=>{Kt.emit("boxStateChange",e)},this.setMainViewScenePathHandler=({nextScenePath:e})=>{Ce(this.manager.mainView,e),Kt.emit("mainViewScenePathChange",e)},this.moveCameraToContainHandler=e=>{this.manager.mainView.moveCameraToContain(e)}}get boxManager(){return this.manager.boxManager}addListeners(){this.displayer.addMagixEventListener("__WindowManger",this.mainMagixEventListener)}removeListeners(){this.displayer.removeMagixEventListener("__WindowManger",this.mainMagixEventListener)}}class fe extends Error{constructor(){super(...arguments),this.message="[WindowManager]: app duplicate exists and cannot be created again"}}class je extends Error{constructor(){super(...arguments),this.message="[WindowManager]: AppManager must be initialized"}}class Te extends Error{constructor(e){super(`[WindowManager]: white-web-sdk version must large than ${e}`)}}class Ee extends Error{constructor(){super(...arguments),this.message="[WindowManager]: kind must be a valid string"}}class ze extends Error{constructor(){super(...arguments),this.message="[WindowManager]: box need created"}}class Le extends Error{constructor(){super(...arguments),this.message='[WindowManager]: ScenePath should start with "/"'}}class Be extends Error{constructor(){super(...arguments),this.message="[WindowManager]: boxManager not found"}}const Pe=e=>(t,i)=>{if(void 0!==t){if(V){const s=t=>{t.map((e=>e.kind)).includes(e)&&i()};return V(t,s),i(),()=>U(t,s)}return k((()=>t),(()=>{i()}),{fireImmediately:!0})}},Ve=(e,t,i)=>{let s=null;const a=k(e,(()=>{s&&(s(),s=null);const a=e();M(a)?(s=()=>U(a,t),V(a,t)):null==i||i(a)}),{fireImmediately:!0});return()=>{null==s||s(),a()}},Ue=Pe(P.Removed),ke=Pe(P.Inserted),Oe=Object.keys;function Re(e){return Boolean(m(e,"__isRef"))}class Ze{constructor(){this.listeners=new Set}get length(){return this.listeners.size}dispatch(e){this.listeners.forEach((t=>t(e)))}addListener(e){this.listeners.add(e)}removeListener(e){this.listeners.delete(e)}}const Qe="_WM-STORAGE_";class Ge{constructor(e,t,i){if(this._sideEffect=new ee,this._destroyed=!1,this._refMap=new WeakMap,this._lastValue=new Map,this.onStateChanged=new Ze,i&&!M(i))throw new Error(`Default state for Storage ${t} is not an object.`);this._context=e,this.id=t||null,this._state={};const s=this._getRawState(this._state);null!==this.id&&this._context.getIsWritable()&&(s!==this._state&&M(s)||(w(this._context.getAttributes(),[Qe])||this._context.updateAttributes([Qe],{}),this._context.updateAttributes([Qe,this.id],this._state)),i&&this.setState(i)),Oe(s).forEach((e=>{if(null!==this.id||e!==Qe)try{const t=M(s[e])?JSON.parse(JSON.stringify(s[e])):s[e];Re(t)?(this._state[e]=t.v,M(t.v)&&this._refMap.set(t.v,t)):this._state[e]=t}catch(t){console.error(t)}})),this._sideEffect.addDisposer(Ve((()=>null===this.id?e.getAttributes():w(e.getAttributes(),[Qe,this.id])),this._updateProperties.bind(this),this.destroy.bind(this)))}get state(){return this._destroyed&&console.warn(`Accessing state on destroyed Storage "${this.id}"`),this._state}ensureState(e){return this.setState(Oe(e).reduce(((t,i)=>(m(this._state,i)||(t[i]=e[i]),t)),{}))}setState(e){if(this._destroyed)return void console.error(new Error(`Cannot call setState on destroyed Storage "${this.id}".`));if(!this._context.getIsWritable())return void console.error(new Error(`Cannot setState on Storage "${this.id}" without writable access`),e);const t=Oe(e);t.length>0&&t.forEach((t=>{const i=e[t];var s;if(i!==this._state[t])if(void 0===i)this._lastValue.set(t,this._state[t]),delete this._state[t],this._setRawState(t,i);else{this._lastValue.set(t,this._state[t]),this._state[t]=i;let e=i;if(M(i)){let t=this._refMap.get(i);t||(s=i,t={k:$(),v:s,__isRef:!0},this._refMap.set(i,t)),e=t}this._setRawState(t,e)}}))}emptyStorage(){I(this._state)<=0||(this._destroyed?console.error(new Error(`Cannot empty destroyed Storage "${this.id}".`)):this._context.getIsWritable()?this.setState(A(this._state,x)):console.error(new Error(`Cannot empty Storage "${this.id}" without writable access.`)))}deleteStorage(){if(null===this.id)throw new Error("Cannot delete main Storage");this._context.getIsWritable()?(this.destroy(),this._context.updateAttributes([Qe,this.id],void 0)):console.error(new Error(`Cannot delete Storage "${this.id}" without writable access.`))}get destroyed(){return this._destroyed}destroy(){this._destroyed=!0,this._sideEffect.flushAll()}_getRawState(e){return null===this.id?w(this._context.getAttributes(),[],e):w(this._context.getAttributes(),[Qe,this.id],e)}_setRawState(e,t){if(null===this.id){if(e===Qe)throw new Error('Cannot set attribute internal filed "_WM-STORAGE_"');return this._context.updateAttributes([e],t)}return this._context.updateAttributes([Qe,this.id,e],t)}_updateProperties(e){var t;if(this._destroyed)console.error(new Error(`Cannot call _updateProperties on destroyed Storage "${this.id}".`));else if(e.length>0){const s={};for(let a=0;a<e.length;a++)try{const i=e[a],r=i.key;if(null===this.id&&r===Qe)continue;const n=M(i.value)?JSON.parse(JSON.stringify(i.value)):i.value;let o;switch(this._lastValue.has(r)&&(o=this._lastValue.get(r),this._lastValue.delete(r)),i.kind){case 2:m(this._state,r)&&(o=this._state[r],delete this._state[r]),s[r]={oldValue:o};break;default:{let e=n;if(Re(n)){const{k:i,v:s}=n,a=this._state[r];M(a)&&(null==(t=this._refMap.get(a))?void 0:t.k)===i?e=a:(e=s,M(s)&&this._refMap.set(s,n))}e!==this._state[r]&&(o=this._state[r],this._state[r]=e),s[r]={newValue:e,oldValue:o};break}}}catch(i){console.error(i)}this.onStateChanged.dispatch(s)}}}class We{constructor(e,t,i,s,a){this.manager=e,this.boxManager=t,this.appId=i,this.appProxy=s,this.appOptions=a,this.mobxUtils={autorun:O,reaction:k,toJS:R},this.objectUtils={listenUpdated:V,unlistenUpdated:U,listenDisposed:Z,unlistenDisposed:Q},this.store=this.manager.store,this.isReplay=this.manager.isReplay,this.getDisplayer=()=>this.manager.displayer,this.getAttributes=()=>this.appProxy.attributes,this.getScenes=()=>{const e=this.store.getAppAttributes(this.appId);if(!(null==e?void 0:e.isDynamicPPT))return null==e?void 0:e.options.scenes;{const e=this.manager.appProxies.get(this.appId);if(e)return e.scenes}},this.getView=()=>this.appProxy.view,this.getInitScenePath=()=>this.manager.getAppInitPath(this.appId),this.getIsWritable=()=>this.manager.canOperate,this.getBox=()=>{const e=this.boxManager.getBox(this.appId);if(e)return e;throw new ze},this.getRoom=()=>this.manager.room,this.setAttributes=e=>{this.manager.safeSetAttributes({[this.appId]:e})},this.updateAttributes=(e,t)=>{this.manager.attributes[this.appId]&&this.manager.safeUpdateAttributes([this.appId,...e],t)},this.setScenePath=async e=>{var t;this.appProxy.box&&(this.appProxy.setFullPath(e),null==(t=this.getRoom())||t.setScenePath(e))},this.mountView=e=>{const t=this.getView();t&&(t.divElement=e,setTimeout((()=>{var e;null==(e=this.getRoom())||e.refreshViewSize()}),1e3))},this.getAppOptions=()=>"function"==typeof this.appOptions?this.appOptions():this.appOptions,this.createStorage=(e,t)=>{const i=new Ge(this,e,t);return this.emitter.on("destroy",(()=>{i.destroy()})),i},this.dispatchMagixEvent=this.manager.displayer.dispatchMagixEvent.bind(this.manager.displayer),this.addMagixEventListener=this.manager.displayer.addMagixEventListener.bind(this.manager.displayer),this.removeMagixEventListener=this.manager.displayer.removeMagixEventListener.bind(this.manager.displayer),this.emitter=s.appEmitter,this.isAddApp=s.isAddApp}get storage(){return this._storage||(this._storage=new Ge(this)),this._storage}}var Ye,Fe;(Fe=Ye||(Ye={})).Apps="apps",Fe.Focus="focus",Fe.State="state",Fe.BoxState="boxState",Fe.MainViewCamera="mainViewCamera",Fe.MainViewSize="mainViewSize",Fe.Broadcaster="broadcaster",Fe.Cursors="cursors",Fe.Position="position",Fe.CursorState="cursorState",Fe.FullPath="fullPath";const He=new class{constructor(e){this.context=e}setContext(e){this.context=e}get attributes(){return this.context.getAttributes()}apps(){return w(this.attributes,[Ye.Apps])}get focus(){return w(this.attributes,[Ye.Focus])}getAppAttributes(e){return w(this.apps(),[e])}getAppState(e){return w(this.apps(),[e,Ye.State])}getMaximized(){return w(this.attributes,["maximized"])}getMinimized(){return w(this.attributes,["minimized"])}setupAppAttributes(e,t,i){this.attributes.apps||this.context.safeSetAttributes({apps:{}});const s=["scenePath","title"];i||s.push("scenes");const a=C(e.options,s),r={kind:e.kind,options:a,isDynamicPPT:i};"string"==typeof e.src&&(r.src=e.src),r.createdAt=Date.now(),this.context.safeUpdateAttributes([Ye.Apps,t],r),this.context.safeUpdateAttributes([Ye.Apps,t,Ye.State],{[ae.Size]:{},[ae.Position]:{},[ae.SceneIndex]:0})}updateAppState(e,t,i){w(this.attributes,[Ye.Apps,e,Ye.State])&&this.context.safeUpdateAttributes([Ye.Apps,e,Ye.State,t],i)}cleanAppAttributes(e){this.context.safeUpdateAttributes([Ye.Apps,e],void 0),this.context.safeSetAttributes({[e]:void 0});this.attributes[Ye.Focus]===e&&this.cleanFocus()}cleanFocus(){this.context.safeSetAttributes({[Ye.Focus]:void 0})}getAppSceneIndex(e){var t;return null==(t=this.getAppState(e))?void 0:t[ae.SceneIndex]}getAppScenePath(e){var t,i;return null==(i=null==(t=this.getAppAttributes(e))?void 0:t.options)?void 0:i.scenePath}getMainViewScenePath(){return this.attributes._mainScenePath}getMainViewSceneIndex(){return this.attributes._mainSceneIndex}getBoxState(){return this.attributes[Ye.BoxState]}setMainViewScenePath(e){this.context.safeSetAttributes({_mainScenePath:e})}setMainViewSceneIndex(e){this.context.safeSetAttributes({_mainSceneIndex:e})}getMainViewCamera(){return w(this.attributes,[Ye.MainViewCamera])}getMainViewSize(){return w(this.attributes,[Ye.MainViewSize])}setMainViewCamera(e){this.context.safeSetAttributes({[Ye.MainViewCamera]:c({},e)})}setMainViewSize(e){this.context.safeSetAttributes({[Ye.MainViewSize]:c({},e)})}setAppFocus(e,t){t?this.context.safeSetAttributes({[Ye.Focus]:e}):this.context.safeSetAttributes({[Ye.Focus]:void 0})}updateCursor(e,t){w(this.attributes,[Ye.Cursors])||this.context.safeUpdateAttributes([Ye.Cursors],{}),w(this.attributes,[Ye.Cursors,e])||this.context.safeUpdateAttributes([Ye.Cursors,e],{}),this.context.safeUpdateAttributes([Ye.Cursors,e,Ye.Position],t)}updateCursorState(e,t){w(this.attributes,[Ye.Cursors,e])||this.context.safeUpdateAttributes([Ye.Cursors,e],{}),this.context.safeUpdateAttributes([Ye.Cursors,e,Ye.CursorState],t)}getCursorState(e){return w(this.attributes,[Ye.Cursors,e,Ye.CursorState])}cleanCursor(e){this.context.safeUpdateAttributes([Ye.Cursors,e],void 0)}setMainViewFocusPath(e){const t=this.getMainViewScenePath();t&&Ce(e,t)}}({getAttributes:()=>{throw new Error("getAttributes not implemented")},safeSetAttributes:()=>{throw new Error("safeSetAttributes not implemented")},safeUpdateAttributes:()=>{throw new Error("safeUpdateAttributes not implemented")}}),Xe=(...e)=>{$t.debug&&console.log("[WindowManager]:",...e)};class Je{constructor(e){this.manager=e,this.findMember=e=>{var t;const i=null==(t=this.manager.room)?void 0:t.state.roomMembers;return null==i?void 0:i.find((t=>t.memberId===e))},this.findMemberByUid=e=>{var t;const i=null==(t=this.manager.room)?void 0:t.state.roomMembers;return null==i?void 0:i.find((t=>{var i;return(null==(i=t.payload)?void 0:i.uid)===e}))},this.observerId=e.displayer.observerId,Jt.on("observerIdChange",(e=>{this.observerId=e}))}get uid(){var e;return(null==(e=this.manager.room)?void 0:e.uid)||""}updateManagerRect(){var e;null==(e=this.manager.boxManager)||e.updateManagerRect()}blurFocusBox(){var e;null==(e=this.manager.boxManager)||e.blurAllBox()}}let Ke;class _e{constructor(e){this.manager=e,this.store=He,this.context=(e=>(Ke||(Ke=new Je(e)),Ke))(this.manager)}}class qe extends _e{constructor(e,t,i,s){var a;super(t),this.params=e,this.boxManager=this.manager.boxManager,this.appProxies=this.manager.appProxies,this.viewManager=this.manager.viewManager,this.status="normal",this.getAppInitState=e=>{var t,i;const s=this.store.getAppState(e);if(!s)return;const a=null==s?void 0:s[ae.Position],r=this.store.focus,n=null==s?void 0:s[ae.Size],o=null==s?void 0:s[ae.SceneIndex];let h={maximized:null==(t=this.attributes)?void 0:t.maximized,minimized:null==(i=this.attributes)?void 0:i.minimized,zIndex:null==s?void 0:s.zIndex};return a&&(h=d(c({},h),{id:e,x:a.x,y:a.y})),r===e&&(h=d(c({},h),{focus:!0})),n&&(h=d(c({},h),{width:n.width,height:n.height})),o&&(h=d(c({},h),{sceneIndex:o})),h},this.appAttributesUpdateListener=e=>{var t,i,s;null==(t=this.manager.refresher)||t.add(e,(()=>O((()=>{const t=this.manager.attributes[e];t&&this.appEmitter.emit("attributesUpdate",t)})))),null==(i=this.manager.refresher)||i.add(this.stateKey,(()=>O((()=>{var t,i,s;const a=null==(t=this.appAttributes)?void 0:t.state;(null==a?void 0:a.zIndex)>0&&a.zIndex!==(null==(i=this.box)?void 0:i.zIndex)&&(null==(s=this.boxManager)||s.setZIndex(e,a.zIndex))})))),null==(s=this.manager.refresher)||s.add(`${e}-fullPath`,(()=>O((()=>{const e=this.appAttributes.fullPath;this.setFocusScenePathHandler(e)}))))},this.setFocusScenePathHandler=u((e=>{var t;this.view&&e&&e!==(null==(t=this.view)?void 0:t.focusScenePath)&&Ce(this.view,e)}),50),this.kind=e.kind,this.id=i,this.stateKey=`${this.id}_state`,this.appProxies.set(this.id,this),this.appEmitter=new l,this.appListener=this.makeAppEventListener(this.id),this.isAddApp=s,this.initScenes(),(null==(a=this.params.options)?void 0:a.scenePath)&&this.createView()}initScenes(){var e;const t=this.params.options;t&&(this.scenePath=t.scenePath,(null==(e=this.appAttributes)?void 0:e.isDynamicPPT)&&this.scenePath?this.scenes=this.manager.displayer.entireScenes()[this.scenePath]:this.scenes=t.scenes)}get view(){return this.manager.viewManager.getView(this.id)}get isWritable(){var e;return this.manager.canOperate&&!(null==(e=this.box)?void 0:e.readonly)}get attributes(){return this.manager.attributes[this.id]}get appAttributes(){return this.store.getAppAttributes(this.id)}getFullScenePath(){if(this.scenePath)return w(this.appAttributes,[Ye.FullPath],this.getFullScenePathFromScenes())}getFullScenePathFromScenes(){const e=w(this.appAttributes,["state","SceneIndex"],0),t=((e,t,i)=>{var s;if(e&&t){const a=null==(s=ve(e)[t])?void 0:s[i];if(a)return`${t}/${a.name}`}})(this.manager.room,this.scenePath,e);return t&&this.setFullPath(t),t}setFullPath(e){this.manager.safeUpdateAttributes(["apps",this.id,Ye.FullPath],e)}async baseInsertApp(e=!1){var t;const i=this.params;if(!i.kind)throw new Error("[WindowManager]: kind require");const s=await(null==(t=xe.appClasses.get(i.kind))?void 0:t()),a=xe.registered.get(i.kind);if(!s)throw new Error(`[WindowManager]: app load failed ${i.kind} ${i.src}`);return await this.setupApp(this.id,e,s,i.options,null==a?void 0:a.appOptions),this.context.updateManagerRect(),{appId:this.id,app:s}}focusApp(){this.focusBox(),this.store.setMainViewFocusPath(this.manager.mainView)}get box(){var e;return null==(e=this.boxManager)?void 0:e.getBox(this.id)}focusBox(){var e;null==(e=this.boxManager)||e.focusBox({appId:this.id})}async setupApp(t,i,s,a,r){var n;if(Xe("setupApp",t,s,a),!this.boxManager)throw new Be;const o=new We(this.manager,this.boxManager,t,this,r);this.appContext=o;try{Jt.once(`${t}${e.WindowCreated}`).then((async()=>{var e;let a;i||(a=this.getAppInitState(t),null==(e=this.boxManager)||e.updateBoxState(a)),this.appEmitter.onAny(this.appListener),this.appAttributesUpdateListener(t),this.setViewFocusScenePath(),setTimeout((async()=>{const e=await s.setup(o);this.appResult=e,xe.notifyApp(s.kind,"created",{appId:t,result:e}),this.afterSetupApp(a),this.fixMobileSize()}),50)})),null==(n=this.boxManager)||n.createBox({appId:t,app:s,options:a,canOperate:this.manager.canOperate,smartPosition:this.isAddApp})}catch(h){throw console.error(h),new Error(`[WindowManager]: app setup error: ${h.message}`)}}fixMobileSize(){var e,t;const i=null==(e=this.boxManager)?void 0:e.getBox(this.id);i&&(null==(t=this.boxManager)||t.resizeBox({appId:this.id,width:i.intrinsicWidth+.001,height:i.intrinsicHeight+.001,skipUpdate:!0}))}afterSetupApp(e){var t;e&&((null==e?void 0:e.x)&&e.y||null==(t=this.boxManager)||t.setBoxInitState(this.id))}onSeek(e){var t;this.appEmitter.emit("seek",e);const i=this.getAppInitState(this.id);null==(t=this.boxManager)||t.updateBoxState(i)}async onReconnected(){var e;this.appEmitter.emit("reconnected",void 0);const t=this.getAppInitState(this.id);await this.destroy(!0,!1,!0);const i=this.params,s=new qe(i,this.manager,this.id,this.isAddApp);await s.baseInsertApp(!0),null==(e=this.boxManager)||e.updateBoxState(t)}emitAppSceneStateChange(e){this.appEmitter.emit("sceneStateChange",e)}emitAppIsWritableChange(){this.appEmitter.emit("writableChange",this.isWritable)}makeAppEventListener(e){return(t,i)=>{var s,a,r,n;if(this.manager.canOperate)switch(t){case"setBoxSize":null==(s=this.boxManager)||s.resizeBox({appId:e,width:i.width,height:i.height,skipUpdate:!1});break;case"setBoxMinSize":null==(a=this.boxManager)||a.setBoxMinSize({appId:e,minWidth:i.minwidth,minHeight:i.minheight});break;case"setBoxTitle":null==(r=this.boxManager)||r.setBoxTitle({appId:e,title:i.title});break;case ne.destroy:if("destroyed"===this.status)return;this.destroy(!0,!1,!0,null==i?void 0:i.error),(null==i?void 0:i.error)&&console.error(null==i?void 0:i.error);break;case"focus":null==(n=this.boxManager)||n.focusBox({appId:this.id}),Jt.emit("focus",{appId:this.id})}}}setScenePath(){if(!this.manager.canOperate)return;const e=this.getFullScenePath();this.manager.room&&e&&this.view&&ye(this.manager.room,e)}setViewFocusScenePath(){const e=this.getFullScenePath();e&&this.view&&Ce(this.view,e)}async createView(){const e=await this.viewManager.createView(this.id);return this.setViewFocusScenePath(),e}async destroy(e,t,i,s){var a,r,n,o;"destroyed"!==this.status&&(this.status="destroyed",await xe.notifyApp(this.kind,"destroy",{appId:this.id}),await this.appEmitter.emit("destroy",{error:s}),this.appEmitter.clearListeners(),Jt.emit(`destroy-${this.id}`,{error:s}),e&&(null==(a=this.boxManager)||a.closeBox(this.id,i)),t&&this.store.cleanAppAttributes(this.id),this.appProxies.delete(this.id),this.viewManager.destroyView(this.id),this.manager.appStatus.delete(this.id),null==(r=this.manager.refresher)||r.remove(this.id),null==(n=this.manager.refresher)||n.remove(this.stateKey),null==(o=this.manager.refresher)||o.remove(`${this.id}-fullPath`))}close(){return this.destroy(!0,!0,!1)}}class $e{constructor(e){this.displayer=e,this.views=new Map}createView(e){const t=et(this.displayer);return this.views.set(e,t),t}getView(e){return this.views.get(e)}destroyView(e){const t=this.views.get(e);t&&(t.release(),this.views.delete(e))}setViewScenePath(e,t){const i=this.views.get(e);i&&(i.focusScenePath=t)}destroy(){this.views.forEach((e=>{e.release()})),this.views.clear()}}const et=e=>{const t=e.views.createView();return tt(t),t},tt=e=>{e.setCameraBound({maxContentMode:()=>10,minContentMode:()=>.1})};class it extends _e{constructor(e){super(e),this.started=!1,this.mainViewIsAddListener=!1,this.viewId="mainView",this.sideEffectManager=new ee,this.cameraReaction=()=>k((()=>this.mainViewCamera),(e=>{e&&e.id!==this.context.uid&&(this.moveCameraToContian(this.mainViewSize),this.moveCamera(e))}),{fireImmediately:!0}),this.sizeChangeHandler=u((e=>{e&&(this.moveCameraToContian(e),this.moveCamera(this.mainViewCamera))}),30),this.onCameraUpdatedByDevice=e=>{this.store.setMainViewCamera(d(c({},e),{id:this.context.uid})),y(this.mainViewSize,d(c({},this.mainView.size),{id:this.context.uid}))||this.setMainViewSize(this.view.size)},this.mainViewClickListener=()=>{this.mainViewClickHandler()},this.setMainViewSize=u((e=>{this.store.setMainViewSize(d(c({},e),{id:this.context.uid}))}),50),this.onCameraOrSizeUpdated=()=>{Kt.emit("cameraStateChange",this.cameraState)},this.mainView=this.createMainView(),this.moveCameraSizeByAttributes(),Jt.once("mainViewMounted").then((()=>{this.addMainViewListener(),setTimeout((()=>{this.start(),this.mainViewCamera&&this.mainViewSize||this.setCameraAndSize()}),200)}));const t=()=>{this.sizeChangeHandler(this.mainViewSize)};this.sideEffectManager.add((()=>(Jt.on("playgroundSizeChange",t),()=>Jt.off("playgroundSizeChange",t))))}get mainViewCamera(){return this.store.getMainViewCamera()}get mainViewSize(){return this.store.getMainViewSize()}moveCameraSizeByAttributes(){this.moveCameraToContian(this.mainViewSize),this.moveCamera(this.mainViewCamera)}start(){var e;this.started||(this.sizeChangeHandler(this.mainViewSize),this.addCameraListener(),null==(e=this.manager.refresher)||e.add(Ye.MainViewCamera,this.cameraReaction),this.started=!0)}setCameraAndSize(){this.store.setMainViewCamera(d(c({},this.mainView.camera),{id:this.context.uid})),this.store.setMainViewSize(d(c({},this.mainView.size),{id:this.context.uid}))}get view(){return this.mainView}get cameraState(){return c(c({},this.view.camera),this.view.size)}createMainView(){const e=et(this.manager.displayer),t=this.store.getMainViewScenePath();return t&&Ce(e,t),e}addMainViewListener(){this.mainViewIsAddListener||this.view.divElement&&(this.view.divElement.addEventListener("click",this.mainViewClickListener),this.view.divElement.addEventListener("touchend",this.mainViewClickListener),this.mainViewIsAddListener=!0)}removeMainViewListener(){this.view.divElement&&(this.view.divElement.removeEventListener("click",this.mainViewClickListener),this.view.divElement.removeEventListener("touchend",this.mainViewClickListener))}async mainViewClickHandler(){this.manager.canOperate&&(this.store.cleanFocus(),this.context.blurFocusBox())}addCameraListener(){this.view.callbacks.on("onCameraUpdatedByDevice",this.onCameraUpdatedByDevice),this.view.callbacks.on("onCameraUpdated",this.onCameraOrSizeUpdated),this.view.callbacks.on("onSizeUpdated",this.onCameraOrSizeUpdated)}removeCameraListener(){this.view.callbacks.off("onCameraUpdatedByDevice",this.onCameraUpdatedByDevice),this.view.callbacks.off("onCameraUpdated",this.onCameraOrSizeUpdated),this.view.callbacks.off("onSizeUpdated",this.onCameraOrSizeUpdated)}moveCameraToContian(e){b(e)||(this.view.moveCameraToContain({width:e.width,height:e.height,originX:-e.width/2,originY:-e.height/2,animationMode:G.Immediately}),this.scale=this.view.camera.scale)}moveCamera(e){if(!b(e)){if(y(e,this.view.camera))return;const{centerX:t,centerY:i,scale:s}=e,a=s*(this.scale||1);this.view.moveCamera({centerX:t,centerY:i,scale:a,animationMode:G.Immediately})}}stop(){var e,t;this.removeMainViewListener(),this.removeCameraListener(),null==(e=this.manager.refresher)||e.remove(Ye.MainViewCamera),null==(t=this.manager.refresher)||t.remove(Ye.MainViewSize),this.started=!1}destroy(){this.stop(),this.sideEffectManager.flushAll()}}class st{constructor(t){this.windowManger=t,this.appProxies=new Map,this.appStatus=new Map,this.store=He,this.isReplay=this.windowManger.isReplay,this.onAppDelete=e=>{const t=Object.keys(e);this.appProxies.forEach(((e,i)=>{t.includes(i)||e.destroy(!0,!1,!0)}))},this.displayerStateListener=e=>{var t,i;const s=e.sceneState;if(s){const e=s.scenePath;this.appProxies.forEach((t=>{t.scenePath&&e.startsWith(t.scenePath)&&(t.emitAppSceneStateChange(s),t.setFullPath(e))}))}e.roomMembers&&(null==(t=this.windowManger.cursorManager)||t.setRoomMembers(e.roomMembers),null==(i=this.windowManger.cursorManager)||i.cleanMemberAttributes(e.roomMembers)),this.appProxies.forEach((t=>{t.appEmitter.emit("roomStateChange",e)})),Jt.emit("observerIdChange",this.displayer.observerId)},this.displayerWritableListener=e=>{var t,i;const s=!e,a=void 0===this.windowManger.readonly||!1===this.windowManger.readonly;void 0===this.windowManger.readonly?null==(t=this.boxManager)||t.setReadonly(e):null==(i=this.boxManager)||i.setReadonly(!(s&&a)),this.appProxies.forEach((e=>{e.emitAppIsWritableChange()})),!0===s?(this.mainView.disableCameraTransform=!1,this.room&&!0===this.room.disableSerialization&&(this.room.disableSerialization=!1)):this.mainView.disableCameraTransform=!0},this.boxEventListener=(t,i)=>{switch(t){case"move":this.dispatchInternalEvent(e.AppMove,i),this.store.updateAppState(i.appId,ae.Position,{x:i.x,y:i.y});break;case"focus":this.windowManger.safeSetAttributes({focus:i.appId});break;case"resize":i.width&&i.height&&(this.dispatchInternalEvent(e.AppResize,i),this.store.updateAppState(i.appId,ae.Size,{width:i.width,height:i.height}));break;case"close":{const e=this.appProxies.get(i.appId);e&&e.destroy(!1,!0,i.error);break}case"boxStateChange":this.dispatchInternalEvent(e.AppBoxStateChange,i)}},this.displayer=t.displayer,this.store.setContext({getAttributes:()=>this.attributes,safeSetAttributes:e=>this.safeSetAttributes(e),safeUpdateAttributes:(e,t)=>this.safeUpdateAttributes(e,t)}),this.mainViewProxy=new it(this),this.viewManager=new $e(this.displayer),this.appListeners=new De(this),this.displayer.callbacks.on(this.eventName,this.displayerStateListener),this.appListeners.addListeners(),this.refresher=_t,this.refresher.setRoom(this.room),this.refresher.setContext({emitter:Jt}),Jt.once("onCreated").then((()=>this.onCreated())),Jt.on("onReconnected",(()=>this.onReconnected())),W(this.displayer)&&Jt.on("seek",(e=>{this.appProxies.forEach((t=>{t.onSeek(e)})),this.attributesUpdateCallback(this.attributes.apps),this.onAppDelete(this.attributes.apps)}))}async onCreated(){var e,t,i,s,a,r,n,o;if(await this.attributesUpdateCallback(this.attributes.apps),null==(e=this.boxManager)||e.updateManagerRect(),Jt.onAny(this.boxEventListener),null==(t=this.refresher)||t.add("apps",(()=>Ve((()=>this.attributes.apps),(()=>{this.attributesUpdateCallback(this.attributes.apps)})))),null==(i=this.refresher)||i.add("appsClose",(()=>Ue(this.attributes.apps,(()=>{this.onAppDelete(this.attributes.apps)})))),null==(s=this.refresher)||s.add("maximized",(()=>O((()=>{var e;const t=this.attributes.maximized;null==(e=this.boxManager)||e.setMaximized(Boolean(t))})))),null==(a=this.refresher)||a.add("minimized",(()=>O((()=>{var e,t;const i=this.attributes.minimized;(null==(e=this.boxManager)?void 0:e.minimized)!==i&&(!0===i&&(null==(t=this.boxManager)||t.blurAllBox()),setTimeout((()=>{var e;null==(e=this.boxManager)||e.setMinimized(Boolean(i))}),0))})))),null==(r=this.refresher)||r.add("mainViewIndex",(()=>O((()=>{const e=w(this.attributes,"_mainSceneIndex");void 0!==e&&this._prevSceneIndex!==e&&(Kt.emit("mainViewSceneIndexChange",e),this._prevSceneIndex=e)})))),null==(n=this.refresher)||n.add("focusedChange",(()=>O((()=>{const e=w(this.attributes,"focus");this._prevFocused!==e&&(Kt.emit("focusedChange",e),this._prevFocused=e)})))),!this.attributes.apps||0===Object.keys(this.attributes.apps).length){const e=this.store.getMainViewScenePath();if(!e)return;this.displayer.state.sceneState.scenePath!==e&&ye(this.room,e)}this.displayerWritableListener(!(null==(o=this.room)?void 0:o.isWritable)),this.displayer.callbacks.on("onEnableWriteNowChanged",this.displayerWritableListener),this._prevFocused=this.attributes.focus}async attributesUpdateCallback(e){if(e&&$t.container){const t=Object.keys(e).map((t=>({id:t,createdAt:e[t].createdAt})));for(const{id:i}of v(t,"createdAt"))if(!this.appProxies.has(i)&&!this.appStatus.has(i)){const t=e[i];p((async()=>{this.appStatus.set(i,he.StartCreate);if(!this.attributes[i])throw new Error("appAttributes is undefined");await this.baseInsertApp({kind:t.kind,options:t.options,isDynamicPPT:t.isDynamicPPT},i,!1),this.focusByAttributes(e)}),{retries:3}).catch((e=>{console.warn("[WindowManager]: Insert App Error",e),this.appStatus.delete(i)}))}}}refresh(){this.attributesUpdateCallback(this.attributes.apps)}setBoxManager(e){this.boxManager=e}resetMaximized(){var e;null==(e=this.boxManager)||e.setMaximized(Boolean(this.store.getMaximized()))}resetMinimized(){var e;null==(e=this.boxManager)||e.setMinimized(Boolean(this.store.getMinimized()))}bindMainView(e,t){const i=this.mainViewProxy.view;i.disableCameraTransform=t,i.divElement=e,i.focusScenePath||this.setMainViewFocusPath(),Jt.emit("mainViewMounted")}setMainViewFocusPath(){const e=this.store.getMainViewScenePath();e&&Ce(this.mainView,e)}async addApp(e,t){Xe("addApp",e);const{appId:i,needFocus:s}=await this.beforeAddApp(e,t),a=await this.baseInsertApp(e,i,!0,s);return this.afterAddApp(a),null==a?void 0:a.id}async beforeAddApp(e,t){var i,s;const a=await(async e=>{var t,i;const s=await(null==(t=xe.appClasses.get(e))?void 0:t());return s&&(null==(i=s.config)?void 0:i.singleton)?e:`${e}-${q().replace("-","").slice(0,8)}`})(e.kind);this.appStatus.set(a,he.StartCreate);const r=null!=(i=e.attributes)?i:{};this.safeUpdateAttributes([a],r),this.store.setupAppAttributes(e,a,t);const n=!(null==(s=this.boxManager)?void 0:s.minimized);return n&&this.store.setAppFocus(a,!0),{appId:a,needFocus:n}}afterAddApp(e){var t,i;if(e&&e.box){const t=e.box;Jt.emit("move",{appId:e.id,x:null==t?void 0:t.intrinsicX,y:null==t?void 0:t.intrinsicY}),this.store.updateAppState(e.id,ae.ZIndex,t.zIndex)}(null==(t=this.boxManager)?void 0:t.minimized)&&(null==(i=this.boxManager)||i.setMinimized(!1,!1))}async closeApp(e){const t=this.appProxies.get(e);t&&t.destroy(!0,!0,!1)}async baseInsertApp(e,t,i,s){if(this.appProxies.has(t))return void console.warn("[WindowManager]: app duplicate exists and cannot be created again");const a=new qe(e,this,t,i);if(a)return await a.baseInsertApp(s),this.appStatus.delete(t),a;throw this.appStatus.delete(t),new Error("[WindowManger]: initialize AppProxy failed")}get eventName(){return Y(this.displayer)?"onRoomStateChanged":"onPlayerStateChanged"}get attributes(){return this.windowManger.attributes}get canOperate(){return this.windowManger.canOperate}get room(){return Y(this.displayer)?this.displayer:void 0}get mainView(){return this.mainViewProxy.view}get focusApp(){if(this.store.focus)return this.appProxies.get(this.store.focus)}safeSetAttributes(e){this.windowManger.safeSetAttributes(e)}safeUpdateAttributes(e,t){this.windowManger.safeUpdateAttributes(e,t)}async setMainViewScenePath(e){if(this.room){const t=this.displayer.scenePathType(e);if(t===F.None)throw new Error(`[WindowManager]: ${e} not valid scene`);if(t===F.Page)await this._setMainViewScenePath(e);else if(t===F.Dir){const t=be(this.displayer,e);t&&await this._setMainViewScenePath(t)}}}async _setMainViewScenePath(t){this.safeSetAttributes({_mainScenePath:t}),this.setMainViewFocusPath(),this.store.setMainViewFocusPath(this.mainView),this.dispatchInternalEvent(e.SetMainViewScenePath,{nextScenePath:t})}async setMainViewSceneIndex(e){if(this.room){this.safeSetAttributes({_mainSceneIndex:e});const t=this.store.getMainViewScenePath();if(t){const i=t.split("/");i.pop();let s=i.join("/");""===s&&(s="/");const a=be(this.displayer,s,e);a&&(this.store.setMainViewScenePath(a),this.setMainViewFocusPath())}}}getAppInitPath(e){var t;const i=this.store.getAppAttributes(e);if(i)return null==(t=null==i?void 0:i.options)?void 0:t.scenePath}safeDispatchMagixEvent(e,t){this.canOperate&&this.displayer.dispatchMagixEvent(e,t)}focusByAttributes(e){var t;if(e&&Object.keys(e).length===(null==(t=this.boxManager)?void 0:t.boxSize)){const e=this.store.focus;e&&this.boxManager.focusBox({appId:e})}}async onReconnected(){const e=Array.from(this.appProxies.values()).map((e=>e.onReconnected()));await Promise.all(e)}notifyContainerRectUpdate(e){this.appProxies.forEach((t=>{t.appEmitter.emit("containerRectUpdate",e)}))}dispatchInternalEvent(e,t){this.safeDispatchMagixEvent("__WindowManger",{eventName:e,payload:t})}destroy(){var e,t;this.displayer.callbacks.off(this.eventName,this.displayerStateListener),this.displayer.callbacks.off("onEnableWriteNowChanged",this.displayerWritableListener),this.appListeners.removeListeners(),Jt.offAny(this.boxEventListener),Jt.clearListeners(),this.appProxies.size&&this.appProxies.forEach((e=>{e.destroy(!0,!1,!0)})),this.viewManager.destroy(),null==(e=this.boxManager)||e.destroy(),null==(t=this.refresher)||t.destroy(),this.mainViewProxy.destroy(),Kt.clearListeners(),this._prevSceneIndex=void 0}}const at=window.ResizeObserver||g;class rt{constructor(e){this.emitter=e}static create(e,t,i,s){const a=new rt(s);return a.observePlaygroundSize(e,t,i),a}observePlaygroundSize(e,t,i){this.updateSizer(e.getBoundingClientRect(),t,i),this.containerResizeObserver=new at((e=>{var s;const a=null==(s=e[0])?void 0:s.contentRect;a&&(this.updateSizer(a,t,i),this.emitter.emit("playgroundSizeChange",a))})),this.containerResizeObserver.observe(e)}updateSizer({width:e,height:t},i,s){e&&t&&(t/e>$t.containerSizeRatio?(t=e*$t.containerSizeRatio,i.classList.toggle("netless-window-manager-sizer-horizontal",!0)):(e=t/$t.containerSizeRatio,i.classList.toggle("netless-window-manager-sizer-horizontal",!1)),s.style.width=`${e}px`,s.style.height=`${t}px`)}disconnect(){var e;null==(e=this.containerResizeObserver)||e.disconnect()}}class nt{constructor(e,t){this.context=e,this.createTeleBoxManagerConfig=t,this.playgroundSizeChangeListener=()=>{this.updateManagerRect()};const{emitter:i,callbacks:s}=e;this.teleBoxManager=this.setupBoxManager(t),this.teleBoxManager.events.on(E.State,(e=>{e&&(this.context.callbacks.emit("boxStateChange",e),this.context.emitter.emit("boxStateChange",e))})),this.teleBoxManager.events.on("minimized",(e=>{this.context.safeSetAttributes({minimized:e}),e&&(this.context.cleanFocus(),this.blurAllBox())})),this.teleBoxManager.events.on("maximized",(e=>{this.context.safeSetAttributes({maximized:e})})),this.teleBoxManager.events.on("removed",(e=>{e.forEach((e=>{i.emit("close",{appId:e.id})}))})),this.teleBoxManager.events.on("intrinsic_move",u((e=>{i.emit("move",{appId:e.id,x:e.intrinsicX,y:e.intrinsicY})}),50)),this.teleBoxManager.events.on("intrinsic_resize",u((e=>{i.emit("resize",{appId:e.id,width:e.intrinsicWidth,height:e.intrinsicHeight})}),200)),this.teleBoxManager.events.on("focused",(e=>{e&&(this.canOperate?i.emit("focus",{appId:e.id}):this.teleBoxManager.blurBox(e.id))})),this.teleBoxManager.events.on("dark_mode",(e=>{s.emit("darkModeChange",e)})),this.teleBoxManager.events.on("prefers_color_scheme",(e=>{s.emit("prefersColorSchemeChange",e)})),this.teleBoxManager.events.on("z_index",(e=>{this.context.updateAppState(e.id,ae.ZIndex,e.zIndex)})),i.on("playgroundSizeChange",this.playgroundSizeChangeListener)}get mainView(){return this.context.getMainView()}get canOperate(){return this.context.canOperate()}get boxState(){return this.teleBoxManager.state}get maximized(){return this.teleBoxManager.maximized}get minimized(){return this.teleBoxManager.minimized}get darkMode(){return this.teleBoxManager.darkMode}get prefersColorScheme(){return this.teleBoxManager.prefersColorScheme}get boxSize(){return this.teleBoxManager.boxes.length}createBox(t){var i,s,a;if(!this.teleBoxManager)return;let{minwidth:r=le,minheight:n=pe}=null!=(i=t.app.config)?i:{};const{width:o,height:h}=null!=(s=t.app.config)?s:{},c=(null==(a=t.options)?void 0:a.title)||t.appId,d=this.teleBoxManager.containerRect;r>1&&(r/=d.width),n>1&&(n/=d.height);const l={title:c,minWidth:r,minHeight:n,width:o,height:h,id:t.appId};this.teleBoxManager.create(l,t.smartPosition),this.context.emitter.emit(`${t.appId}${e.WindowCreated}`)}setBoxInitState(e){const t=this.teleBoxManager.queryOne({id:e});t&&t.state===z.Maximized&&this.context.emitter.emit("resize",{appId:e,x:t.x,y:t.y,width:t.intrinsicWidth,height:t.intrinsicHeight})}setupBoxManager(e){const t=$t.wrapper?$t.wrapper:document.body,i=t.getBoundingClientRect(),s={root:t,containerRect:{x:0,y:0,width:i.width,height:i.height},fence:!1,prefersColorScheme:null==e?void 0:e.prefersColorScheme},a=new L(s);this.teleBoxManager&&this.teleBoxManager.destroy(),this.teleBoxManager=a;const r=(null==e?void 0:e.collectorContainer)||$t.wrapper;return r&&this.setCollectorContainer(r),a}setCollectorContainer(e){var t;const i=new B({styles:null==(t=this.createTeleBoxManagerConfig)?void 0:t.collectorStyles}).mount(e);this.teleBoxManager.setCollector(i)}getBox(e){return this.teleBoxManager.queryOne({id:e})}closeBox(e,t=!1){return this.teleBoxManager.remove(e,t)}boxIsFocus(e){const t=this.getBox(e);return null==t?void 0:t.focus}getFocusBox(){return this.teleBoxManager.query({focus:!0})[0]}getTopBox(){const e=this.teleBoxManager.query();return S(e,"zIndex")}updateBoxState(e){if(!e)return;const t=this.getBox(e.id);t&&(this.teleBoxManager.update(t.id,{x:e.x,y:e.y,width:e.width||.5,height:e.height||.5,zIndex:e.zIndex},!0),setTimeout((()=>{e.focus&&this.teleBoxManager.focusBox(t.id,!0),null!=e.maximized&&this.teleBoxManager.setMaximized(Boolean(e.maximized),!0),null!=e.minimized&&this.teleBoxManager.setMinimized(Boolean(e.minimized),!0)}),50),this.context.callbacks.emit("boxStateChange",this.teleBoxManager.state))}updateManagerRect(){var e;const t=null==(e=this.mainView.divElement)?void 0:e.getBoundingClientRect();if(t&&t.width>0&&t.height>0){const e={x:0,y:0,width:t.width,height:t.height};this.teleBoxManager.setContainerRect(e),this.context.notifyContainerRectUpdate(this.teleBoxManager.containerRect)}}moveBox({appId:e,x:t,y:i}){this.teleBoxManager.update(e,{x:t,y:i},!0)}focusBox({appId:e},t=!0){this.teleBoxManager.focusBox(e,t)}resizeBox({appId:e,width:t,height:i,skipUpdate:s}){this.teleBoxManager.update(e,{width:t,height:i},s)}setBoxMinSize(e){this.teleBoxManager.update(e.appId,{minWidth:e.minWidth,minHeight:e.minHeight},!0)}setBoxTitle(e){this.teleBoxManager.update(e.appId,{title:e.title},!0)}blurAllBox(){this.teleBoxManager.blurAll()}updateAll(e){this.teleBoxManager.updateAll(e)}setMaximized(e){e!==this.maximized&&this.teleBoxManager.setMaximized(e,!0)}setMinimized(e,t=!0){this.teleBoxManager.setMinimized(e,t)}focusTopBox(){if(this.teleBoxManager.query().length>=1){const e=this.getTopBox();e&&this.focusBox({appId:e.id},!1)}}setReadonly(e){this.teleBoxManager.setReadonly(e)}setPrefersColorScheme(e){this.teleBoxManager.setPrefersColorScheme(e)}setZIndex(e,t,i=!0){this.teleBoxManager.update(e,{zIndex:t},i)}destroy(){Jt.off("playgroundSizeChange",this.playgroundSizeChangeListener),this.teleBoxManager.destroy()}}function ot(){}function ht(e){return e()}function ct(){return Object.create(null)}function dt(e){e.forEach(ht)}function lt(e){return"function"==typeof e}function pt(e,t){return e!=e?t==t:e!==t||e&&"object"==typeof e||"function"==typeof e}let gt,ut;function Mt(e,t){return gt||(gt=document.createElement("a")),gt.href=t,e===gt.href}function mt(e,t){e.appendChild(t)}function wt(e,t,i){e.insertBefore(t,i||null)}function It(e){e.parentNode.removeChild(e)}function At(e){return document.createElement(e)}function xt(e){return document.createTextNode(e)}function Ct(){return xt(" ")}function yt(e,t,i){null==i?e.removeAttribute(t):e.getAttribute(t)!==i&&e.setAttribute(t,i)}function bt(e,t){t=""+t,e.wholeText!==t&&(e.data=t)}function vt(e,t,i,s){e.style.setProperty(t,i,s?"important":"")}function St(e){ut=e}const Nt=[],Dt=[],ft=[],jt=[],Tt=Promise.resolve();let Et=!1;function zt(e){ft.push(e)}let Lt=!1;const Bt=new Set;function Pt(){if(!Lt){Lt=!0;do{for(let e=0;e<Nt.length;e+=1){const t=Nt[e];St(t),Vt(t.$$)}for(St(null),Nt.length=0;Dt.length;)Dt.pop()();for(let e=0;e<ft.length;e+=1){const t=ft[e];Bt.has(t)||(Bt.add(t),t())}ft.length=0}while(Nt.length);for(;jt.length;)jt.pop()();Et=!1,Lt=!1,Bt.clear()}}function Vt(e){if(null!==e.fragment){e.update(),dt(e.before_update);const t=e.dirty;e.dirty=[-1],e.fragment&&e.fragment.p(e.ctx,t),e.after_update.forEach(zt)}}const Ut=new Set;function kt(e,t){-1===e.$$.dirty[0]&&(Nt.push(e),Et||(Et=!0,Tt.then(Pt)),e.$$.dirty.fill(0)),e.$$.dirty[t/31|0]|=1<<t%31}function Ot(e,t,i,s,a,r,n,o=[-1]){const h=ut;St(e);const c=e.$$={fragment:null,ctx:null,props:r,update:ot,not_equal:a,bound:ct(),on_mount:[],on_destroy:[],on_disconnect:[],before_update:[],after_update:[],context:new Map(h?h.$$.context:t.context||[]),callbacks:ct(),dirty:o,skip_bound:!1,root:t.target||h.$$.root};n&&n(c.root);let d=!1;if(c.ctx=i?i(e,t.props||{},((t,i,...s)=>{const r=s.length?s[0]:i;return c.ctx&&a(c.ctx[t],c.ctx[t]=r)&&(!c.skip_bound&&c.bound[t]&&c.bound[t](r),d&&kt(e,t)),i})):[],c.update(),d=!0,dt(c.before_update),c.fragment=!!s&&s(c.ctx),t.target){if(t.hydrate){const e=(g=t.target,Array.from(g.childNodes));c.fragment&&c.fragment.l(e),e.forEach(It)}else c.fragment&&c.fragment.c();t.intro&&((l=e.$$.fragment)&&l.i&&(Ut.delete(l),l.i(p))),function(e,t,i,s){const{fragment:a,on_mount:r,on_destroy:n,after_update:o}=e.$$;a&&a.m(t,i),s||zt((()=>{const t=r.map(ht).filter(lt);n?n.push(...t):dt(t),e.$$.on_mount=[]})),o.forEach(zt)}(e,t.target,t.anchor,t.customElement),Pt()}var l,p,g;St(h)}function Rt(e){let t,i,s;return{c(){t=At("img"),yt(t,"class","netless-window-manager-cursor-selector-avatar"),yt(t,"style",i=e[15]()),Mt(t.src,s=e[7])||yt(t,"src",s),yt(t,"alt","avatar")},m(e,i){wt(e,t,i)},p(e,i){128&i&&!Mt(t.src,s=e[7])&&yt(t,"src",s)},d(e){e&&It(t)}}}function Zt(e){let t,i;return{c(){t=At("span"),i=xt(e[1]),yt(t,"class","netless-window-manager-cursor-tag-name"),vt(t,"background-color",e[10])},m(e,s){wt(e,t,s),mt(t,i)},p(e,s){2&s&&bt(i,e[1]),1024&s&&vt(t,"background-color",e[10])},d(e){e&&It(t)}}}function Qt(e){let t,i,s,a,r,n,o,h,c,d,l,p,g=e[13]&&Rt(e),u=e[14]&&Zt(e);return{c(){t=At("div"),i=At("div"),s=At("div"),g&&g.c(),a=Ct(),r=At("span"),n=xt(e[0]),o=Ct(),u&&u.c(),h=Ct(),c=At("div"),d=At("img"),vt(r,"overflow","hidden"),vt(r,"white-space","nowrap"),vt(r,"text-overflow","ellipsis"),vt(r,"max-width","80px"),yt(s,"class",e[8]),vt(s,"background-color",e[2]),vt(s,"color",e[9]),vt(s,"opacity",e[11]),yt(i,"class","netless-window-manager-cursor-name"),yt(d,"class",l="netless-window-manager-cursor-"+e[3]+"-image"),Mt(d.src,p=e[6])||yt(d,"src",p),yt(d,"alt",e[3]),yt(c,"class","cursor-image-wrapper"),yt(t,"class","netless-window-manager-cursor-mid"),vt(t,"transform","translateX("+e[4]+"px) translateY("+e[5]+"px)"),vt(t,"display",e[12])},m(e,l){wt(e,t,l),mt(t,i),mt(i,s),g&&g.m(s,null),mt(s,a),mt(s,r),mt(r,n),mt(s,o),u&&u.m(s,null),mt(t,h),mt(t,c),mt(c,d)},p(e,[i]){e[13]?g?g.p(e,i):(g=Rt(e),g.c(),g.m(s,a)):g&&(g.d(1),g=null),1&i&&bt(n,e[0]),e[14]?u?u.p(e,i):(u=Zt(e),u.c(),u.m(s,null)):u&&(u.d(1),u=null),256&i&&yt(s,"class",e[8]),4&i&&vt(s,"background-color",e[2]),512&i&&vt(s,"color",e[9]),2048&i&&vt(s,"opacity",e[11]),8&i&&l!==(l="netless-window-manager-cursor-"+e[3]+"-image")&&yt(d,"class",l),64&i&&!Mt(d.src,p=e[6])&&yt(d,"src",p),8&i&&yt(d,"alt",e[3]),48&i&&vt(t,"transform","translateX("+e[4]+"px) translateY("+e[5]+"px)"),4096&i&&vt(t,"display",e[12])},i:ot,o:ot,d(e){e&&It(t),g&&g.d(),u&&u.d()}}}function Gt(e,t,i){let s,a,r,n,{cursorName:o}=t,{tagName:h}=t,{backgroundColor:c}=t,{appliance:d}=t,{x:l}=t,{y:p}=t,{src:g}=t,{visible:u}=t,{avatar:M}=t,{theme:m}=t,{color:w}=t,{cursorTagBackgroundColor:I}=t,{opacity:A}=t;return e.$$set=e=>{"cursorName"in e&&i(0,o=e.cursorName),"tagName"in e&&i(1,h=e.tagName),"backgroundColor"in e&&i(2,c=e.backgroundColor),"appliance"in e&&i(3,d=e.appliance),"x"in e&&i(4,l=e.x),"y"in e&&i(5,p=e.y),"src"in e&&i(6,g=e.src),"visible"in e&&i(16,u=e.visible),"avatar"in e&&i(7,M=e.avatar),"theme"in e&&i(8,m=e.theme),"color"in e&&i(9,w=e.color),"cursorTagBackgroundColor"in e&&i(10,I=e.cursorTagBackgroundColor),"opacity"in e&&i(11,A=e.opacity)},e.$$.update=()=>{1&e.$$.dirty&&(s=!b(o)),2&e.$$.dirty&&i(14,a=!b(h)),128&e.$$.dirty&&i(13,r=!b(M)),65536&e.$$.dirty&&i(12,n=u?"initial":"none")},[o,h,c,d,l,p,g,M,m,w,I,A,n,r,a,()=>Object.entries({width:(s?19:28)+"px",height:(s?19:28)+"px",position:s?"initial":"absolute","border-color":s?"white":c,"margin-right":(s?4:0)+"px"}).map((([e,t])=>`${e}: ${t}`)).join(";"),u]}class Wt extends class{$destroy(){!function(e,t){const i=e.$$;null!==i.fragment&&(dt(i.on_destroy),i.fragment&&i.fragment.d(t),i.on_destroy=i.fragment=null,i.ctx=[])}(this,1),this.$destroy=ot}$on(e,t){const i=this.$$.callbacks[e]||(this.$$.callbacks[e]=[]);return i.push(t),()=>{const e=i.indexOf(t);-1!==e&&i.splice(e,1)}}$set(e){var t;this.$$set&&(t=e,0!==Object.keys(t).length)&&(this.$$.skip_bound=!0,this.$$set(e),this.$$.skip_bound=!1)}}{constructor(e){super(),Ot(this,e,Gt,Qt,pt,{cursorName:0,tagName:1,backgroundColor:2,appliance:3,x:4,y:5,src:6,visible:16,avatar:7,theme:8,color:9,cursorTagBackgroundColor:10,opacity:11})}}const Yt={[H.pencil]:"data:image/png;base64,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",[H.selector]:"data:image/png;base64,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",[H.eraser]:"data:image/png;base64,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",[H.shape]:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNDBweCIgaGVpZ2h0PSI0MHB4IiB2aWV3Qm94PSIwIDAgNDAgNDAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDYwLjEgKDg4MTMzKSAtIGh0dHBzOi8vc2tldGNoLmNvbSAtLT4KICAgIDx0aXRsZT5zaGFwZS1jdXJzb3I8L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZGVmcz4KICAgICAgICA8cGF0aCBkPSJNMjAsMjEuNSBDMjAuMjQ1NDU5OSwyMS41IDIwLjQ0OTYwODQsMjEuNjc2ODc1MiAyMC40OTE5NDQzLDIxLjkxMDEyNDQgTDIwLjUsMjIgTDIwLjUsMjcgQzIwLjUsMjcuMjc2MTQyNCAyMC4yNzYxNDI0LDI3LjUgMjAsMjcuNSBDMTkuNzU0NTQwMSwyNy41IDE5LjU1MDM5MTYsMjcuMzIzMTI0OCAxOS41MDgwNTU3LDI3LjA4OTg3NTYgTDE5LjUsMjcgTDE5LjUsMjIgQzE5LjUsMjEuNzIzODU3NiAxOS43MjM4NTc2LDIxLjUgMjAsMjEuNSBaIE0yNywxOS41IEMyNy4yNzYxNDI0LDE5LjUgMjcuNSwxOS43MjM4NTc2IDI3LjUsMjAgQzI3LjUsMjAuMjQ1NDU5OSAyNy4zMjMxMjQ4LDIwLjQ0OTYwODQgMjcuMDg5ODc1NiwyMC40OTE5NDQzIEwyNywyMC41IEwyMiwyMC41IEMyMS43MjM4NTc2LDIwLjUgMjEuNSwyMC4yNzYxNDI0IDIxLjUsMjAgQzIxLjUsMTkuNzU0NTQwMSAyMS42NzY4NzUyLDE5LjU1MDM5MTYgMjEuOTEwMTI0NCwxOS41MDgwNTU3IEwyMiwxOS41IEwyNywxOS41IFogTTE4LDE5LjUgQzE4LjI3NjE0MjQsMTkuNSAxOC41LDE5LjcyMzg1NzYgMTguNSwyMCBDMTguNSwyMC4yNDU0NTk5IDE4LjMyMzEyNDgsMjAuNDQ5NjA4NCAxOC4wODk4NzU2LDIwLjQ5MTk0NDMgTDE4LDIwLjUgTDEzLDIwLjUgQzEyLjcyMzg1NzYsMjAuNSAxMi41LDIwLjI3NjE0MjQgMTIuNSwyMCBDMTIuNSwxOS43NTQ1NDAxIDEyLjY3Njg3NTIsMTkuNTUwMzkxNiAxMi45MTAxMjQ0LDE5LjUwODA1NTcgTDEzLDE5LjUgTDE4LDE5LjUgWiBNMjAsMTIuNSBDMjAuMjQ1NDU5OSwxMi41IDIwLjQ0OTYwODQsMTIuNjc2ODc1MiAyMC40OTE5NDQzLDEyLjkxMDEyNDQgTDIwLjUsMTMgTDIwLjUsMTggQzIwLjUsMTguMjc2MTQyNCAyMC4yNzYxNDI0LDE4LjUgMjAsMTguNSBDMTkuNzU0NTQwMSwxOC41IDE5LjU1MDM5MTYsMTguMzIzMTI0OCAxOS41MDgwNTU3LDE4LjA4OTg3NTYgTDE5LjUsMTggTDE5LjUsMTMgQzE5LjUsMTIuNzIzODU3NiAxOS43MjM4NTc2LDEyLjUgMjAsMTIuNSBaIiBpZD0icGF0aC0xIj48L3BhdGg+CiAgICAgICAgPGZpbHRlciB4PSItNjQuNiUiIHk9Ii01OS41JSIgd2lkdGg9IjIyOS4zJSIgaGVpZ2h0PSIyNDYuMSUiIGZpbHRlclVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgaWQ9ImZpbHRlci0yIj4KICAgICAgICAgICAgPGZlTW9ycGhvbG9neSByYWRpdXM9IjEiIG9wZXJhdG9yPSJkaWxhdGUiIGluPSJTb3VyY2VBbHBoYSIgcmVzdWx0PSJzaGFkb3dTcHJlYWRPdXRlcjEiPjwvZmVNb3JwaG9sb2d5PgogICAgICAgICAgICA8ZmVPZmZzZXQgZHg9IjAiIGR5PSIyIiBpbj0ic2hhZG93U3ByZWFkT3V0ZXIxIiByZXN1bHQ9InNoYWRvd09mZnNldE91dGVyMSI+PC9mZU9mZnNldD4KICAgICAgICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMyIgaW49InNoYWRvd09mZnNldE91dGVyMSIgcmVzdWx0PSJzaGFkb3dCbHVyT3V0ZXIxIj48L2ZlR2F1c3NpYW5CbHVyPgogICAgICAgICAgICA8ZmVDb21wb3NpdGUgaW49InNoYWRvd0JsdXJPdXRlcjEiIGluMj0iU291cmNlQWxwaGEiIG9wZXJhdG9yPSJvdXQiIHJlc3VsdD0ic2hhZG93Qmx1ck91dGVyMSI+PC9mZUNvbXBvc2l0ZT4KICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggdmFsdWVzPSIwIDAgMCAwIDAgICAwIDAgMCAwIDAgICAwIDAgMCAwIDAgIDAgMCAwIDAuMTYgMCIgdHlwZT0ibWF0cml4IiBpbj0ic2hhZG93Qmx1ck91dGVyMSI+PC9mZUNvbG9yTWF0cml4PgogICAgICAgIDwvZmlsdGVyPgogICAgPC9kZWZzPgogICAgPGcgaWQ9Iumhtemdoi00IiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0iV2hpdGVib2FyZC1HdWlkZWxpbmVzIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMzQ0LjAwMDAwMCwgLTc1MS4wMDAwMDApIj4KICAgICAgICAgICAgPGcgaWQ9InNoYXBlLWN1cnNvciIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzQ0LjAwMDAwMCwgNzUxLjAwMDAwMCkiPgogICAgICAgICAgICAgICAgPHJlY3QgaWQ9IuefqeW9ouWkh+S7vS00NCIgZmlsbD0iI0ZGRkZGRiIgb3BhY2l0eT0iMC4wMSIgeD0iMCIgeT0iMCIgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiByeD0iMiI+PC9yZWN0PgogICAgICAgICAgICAgICAgPGcgaWQ9IuW9oueKtue7k+WQiCIgZmlsbC1ydWxlPSJub256ZXJvIj4KICAgICAgICAgICAgICAgICAgICA8dXNlIGZpbGw9ImJsYWNrIiBmaWxsLW9wYWNpdHk9IjEiIGZpbHRlcj0idXJsKCNmaWx0ZXItMikiIHhsaW5rOmhyZWY9IiNwYXRoLTEiPjwvdXNlPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIHN0cm9rZT0iI0ZGRkZGRiIgc3Ryb2tlLXdpZHRoPSIxIiBkPSJNMjAsMjEgQzIwLjQ4NTQxMDMsMjEgMjAuODk4MDg1LDIxLjM0Nzk5OTMgMjAuOTg5OTQ3OSwyMS44NjU0ODc3IEwyMSwyMiBMMjEsMjcgQzIxLDI3LjU1MjI4NDcgMjAuNTUyMjg0NywyOCAyMCwyOCBDMTkuNTE0NTg5NywyOCAxOS4xMDE5MTUsMjcuNjUyMDAwNyAxOS4wMTAwNTIxLDI3LjEzNDUxMjMgTDE5LDI3IEwxOSwyMiBDMTksMjEuNDQ3NzE1MyAxOS40NDc3MTUzLDIxIDIwLDIxIFogTTI3LDE5IEMyNy41NTIyODQ3LDE5IDI4LDE5LjQ0NzcxNTMgMjgsMjAgQzI4LDIwLjQ4NTQxMDMgMjcuNjUyMDAwNywyMC44OTgwODUgMjcuMTM0NTEyMywyMC45ODk5NDc5IEwyNywyMSBMMjIsMjEgQzIxLjQ0NzcxNTMsMjEgMjEsMjAuNTUyMjg0NyAyMSwyMCBDMjEsMTkuNTE0NTg5NyAyMS4zNDc5OTkzLDE5LjEwMTkxNSAyMS44NjU0ODc3LDE5LjAxMDA1MjEgTDIyLDE5IEwyNywxOSBaIE0xOCwxOSBDMTguNTUyMjg0NywxOSAxOSwxOS40NDc3MTUzIDE5LDIwIEMxOSwyMC40ODU0MTAzIDE4LjY1MjAwMDcsMjAuODk4MDg1IDE4LjEzNDUxMjMsMjAuOTg5OTQ3OSBMMTgsMjEgTDEzLDIxIEMxMi40NDc3MTUzLDIxIDEyLDIwLjU1MjI4NDcgMTIsMjAgQzEyLDE5LjUxNDU4OTcgMTIuMzQ3OTk5MywxOS4xMDE5MTUgMTIuODY1NDg3NywxOS4wMTAwNTIxIEwxMywxOSBMMTgsMTkgWiBNMjAsMTIgQzIwLjQ4NTQxMDMsMTIgMjAuODk4MDg1LDEyLjM0Nzk5OTMgMjAuOTg5OTQ3OSwxMi44NjU0ODc3IEwyMSwxMyBMMjEsMTggQzIxLDE4LjU1MjI4NDcgMjAuNTUyMjg0NywxOSAyMCwxOSBDMTkuNTE0NTg5NywxOSAxOS4xMDE5MTUsMTguNjUyMDAwNyAxOS4wMTAwNTIxLDE4LjEzNDUxMjMgTDE5LDE4IEwxOSwxMyBDMTksMTIuNDQ3NzE1MyAxOS40NDc3MTUzLDEyIDIwLDEyIFoiIGZpbGw9IiMyMTIzMjQiIGZpbGwtcnVsZT0iZXZlbm9kZCI+PC9wYXRoPgogICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgPHJlY3QgaWQ9IuefqeW9oiIgZmlsbD0iI0ZGRkZGRiIgeD0iMTguNSIgeT0iMTciIHdpZHRoPSIzIiBoZWlnaHQ9IjYiPjwvcmVjdD4KICAgICAgICAgICAgICAgIDxyZWN0IGlkPSLnn6nlvaIiIGZpbGw9IiNGRkZGRkYiIHg9IjE3IiB5PSIxOC41IiB3aWR0aD0iNiIgaGVpZ2h0PSIzIj48L3JlY3Q+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMjAsMjEuNSBDMjAuMjQ1NDU5OSwyMS41IDIwLjQ0OTYwODQsMjEuNjc2ODc1MiAyMC40OTE5NDQzLDIxLjkxMDEyNDQgTDIwLjUsMjIgTDIwLjUsMjcgQzIwLjUsMjcuMjc2MTQyNCAyMC4yNzYxNDI0LDI3LjUgMjAsMjcuNSBDMTkuNzU0NTQwMSwyNy41IDE5LjU1MDM5MTYsMjcuMzIzMTI0OCAxOS41MDgwNTU3LDI3LjA4OTg3NTYgTDE5LjUsMjcgTDE5LjUsMjIgQzE5LjUsMjEuNzIzODU3NiAxOS43MjM4NTc2LDIxLjUgMjAsMjEuNSBaIE0yNywxOS41IEMyNy4yNzYxNDI0LDE5LjUgMjcuNSwxOS43MjM4NTc2IDI3LjUsMjAgQzI3LjUsMjAuMjQ1NDU5OSAyNy4zMjMxMjQ4LDIwLjQ0OTYwODQgMjcuMDg5ODc1NiwyMC40OTE5NDQzIEwyNywyMC41IEwyMiwyMC41IEMyMS43MjM4NTc2LDIwLjUgMjEuNSwyMC4yNzYxNDI0IDIxLjUsMjAgQzIxLjUsMTkuNzU0NTQwMSAyMS42NzY4NzUyLDE5LjU1MDM5MTYgMjEuOTEwMTI0NCwxOS41MDgwNTU3IEwyMiwxOS41IEwyNywxOS41IFogTTE4LDE5LjUgQzE4LjI3NjE0MjQsMTkuNSAxOC41LDE5LjcyMzg1NzYgMTguNSwyMCBDMTguNSwyMC4yNDU0NTk5IDE4LjMyMzEyNDgsMjAuNDQ5NjA4NCAxOC4wODk4NzU2LDIwLjQ5MTk0NDMgTDE4LDIwLjUgTDEzLDIwLjUgQzEyLjcyMzg1NzYsMjAuNSAxMi41LDIwLjI3NjE0MjQgMTIuNSwyMCBDMTIuNSwxOS43NTQ1NDAxIDEyLjY3Njg3NTIsMTkuNTUwMzkxNiAxMi45MTAxMjQ0LDE5LjUwODA1NTcgTDEzLDE5LjUgTDE4LDE5LjUgWiBNMjAsMTIuNSBDMjAuMjQ1NDU5OSwxMi41IDIwLjQ0OTYwODQsMTIuNjc2ODc1MiAyMC40OTE5NDQzLDEyLjkxMDEyNDQgTDIwLjUsMTMgTDIwLjUsMTggQzIwLjUsMTguMjc2MTQyNCAyMC4yNzYxNDI0LDE4LjUgMjAsMTguNSBDMTkuNzU0NTQwMSwxOC41IDE5LjU1MDM5MTYsMTguMzIzMTI0OCAxOS41MDgwNTU3LDE4LjA4OTg3NTYgTDE5LjUsMTggTDE5LjUsMTMgQzE5LjUsMTIuNzIzODU3NiAxOS43MjM4NTc2LDEyLjUgMjAsMTIuNSBaIiBpZD0i5b2i54q257uT5ZCIIiBmaWxsPSIjMjEyMzI0IiBmaWxsLXJ1bGU9Im5vbnplcm8iPjwvcGF0aD4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+",[H.text]:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNDdweCIgaGVpZ2h0PSI0MHB4IiB2aWV3Qm94PSIwIDAgNDcgNDAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDYwLjEgKDg4MTMzKSAtIGh0dHBzOi8vc2tldGNoLmNvbSAtLT4KICAgIDx0aXRsZT50ZXh0LWN1cnNvcjwvdGl0bGU+CiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KICAgIDxkZWZzPgogICAgICAgIDxwYXRoIGQ9Ik0xNiwyNi41IEMxNS43MjM4NTc2LDI2LjUgMTUuNSwyNi4yNzYxNDI0IDE1LjUsMjYgQzE1LjUsMjUuNzU0NTQwMSAxNS42NzY4NzUyLDI1LjU1MDM5MTYgMTUuOTEwMTI0NCwyNS41MDgwNTU3IEwxNiwyNS41IEwxOS41LDI1LjUgTDE5LjUsMTQuNSBMMTYsMTQuNSBDMTUuNzIzODU3NiwxNC41IDE1LjUsMTQuMjc2MTQyNCAxNS41LDE0IEMxNS41LDEzLjc1NDU0MDEgMTUuNjc2ODc1MiwxMy41NTAzOTE2IDE1LjkxMDEyNDQsMTMuNTA4MDU1NyBMMTYsMTMuNSBMMjQsMTMuNSBDMjQuMjc2MTQyNCwxMy41IDI0LjUsMTMuNzIzODU3NiAyNC41LDE0IEMyNC41LDE0LjI0NTQ1OTkgMjQuMzIzMTI0OCwxNC40NDk2MDg0IDI0LjA4OTg3NTYsMTQuNDkxOTQ0MyBMMjQsMTQuNSBMMjAuNSwxNC41IEwyMC41LDI1LjUgTDI0LDI1LjUgQzI0LjI3NjE0MjQsMjUuNSAyNC41LDI1LjcyMzg1NzYgMjQuNSwyNiBDMjQuNSwyNi4yNDU0NTk5IDI0LjMyMzEyNDgsMjYuNDQ5NjA4NCAyNC4wODk4NzU2LDI2LjQ5MTk0NDMgTDI0LDI2LjUgTDE2LDI2LjUgWiIgaWQ9InBhdGgtMSI+PC9wYXRoPgogICAgICAgIDxmaWx0ZXIgeD0iLTI4NC4wJSIgeT0iLTgxLjUlIiB3aWR0aD0iNjY4LjElIiBoZWlnaHQ9IjI5My45JSIgZmlsdGVyVW5pdHM9Im9iamVjdEJvdW5kaW5nQm94IiBpZD0iZmlsdGVyLTIiPgogICAgICAgICAgICA8ZmVNb3JwaG9sb2d5IHJhZGl1cz0iMSIgb3BlcmF0b3I9ImRpbGF0ZSIgaW49IlNvdXJjZUFscGhhIiByZXN1bHQ9InNoYWRvd1NwcmVhZE91dGVyMSI+PC9mZU1vcnBob2xvZ3k+CiAgICAgICAgICAgIDxmZU9mZnNldCBkeD0iMCIgZHk9IjIiIGluPSJzaGFkb3dTcHJlYWRPdXRlcjEiIHJlc3VsdD0ic2hhZG93T2Zmc2V0T3V0ZXIxIj48L2ZlT2Zmc2V0PgogICAgICAgICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIzIiBpbj0ic2hhZG93T2Zmc2V0T3V0ZXIxIiByZXN1bHQ9InNoYWRvd0JsdXJPdXRlcjEiPjwvZmVHYXVzc2lhbkJsdXI+CiAgICAgICAgICAgIDxmZUNvbXBvc2l0ZSBpbj0ic2hhZG93Qmx1ck91dGVyMSIgaW4yPSJTb3VyY2VBbHBoYSIgb3BlcmF0b3I9Im91dCIgcmVzdWx0PSJzaGFkb3dCbHVyT3V0ZXIxIj48L2ZlQ29tcG9zaXRlPgogICAgICAgICAgICA8ZmVDb2xvck1hdHJpeCB2YWx1ZXM9IjAgMCAwIDAgMCAgIDAgMCAwIDAgMCAgIDAgMCAwIDAgMCAgMCAwIDAgMC4xNiAwIiB0eXBlPSJtYXRyaXgiIGluPSJzaGFkb3dCbHVyT3V0ZXIxIj48L2ZlQ29sb3JNYXRyaXg+CiAgICAgICAgPC9maWx0ZXI+CiAgICA8L2RlZnM+CiAgICA8ZyBpZD0i6aG16Z2iLTQiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSJXaGl0ZWJvYXJkLUd1aWRlbGluZXMiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0zODguMDAwMDAwLCAtNjcyLjAwMDAwMCkiPgogICAgICAgICAgICA8ZyBpZD0idGV4dC1jdXJzb3IiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDM5Mi4wMDAwMDAsIDY3Mi4wMDAwMDApIj4KICAgICAgICAgICAgICAgIDxyZWN0IGlkPSLnn6nlvaLlpIfku70tNDAiIGZpbGw9IiNGRkZGRkYiIG9wYWNpdHk9IjAuMDEiIHg9IjAiIHk9IjAiIHdpZHRoPSI0MCIgaGVpZ2h0PSI0MCIgcng9IjIiPjwvcmVjdD4KICAgICAgICAgICAgICAgIDxnIGlkPSLlvaLnirbnu5PlkIgiIGZpbGwtcnVsZT0ibm9uemVybyI+CiAgICAgICAgICAgICAgICAgICAgPHVzZSBmaWxsPSJibGFjayIgZmlsbC1vcGFjaXR5PSIxIiBmaWx0ZXI9InVybCgjZmlsdGVyLTIpIiB4bGluazpocmVmPSIjcGF0aC0xIj48L3VzZT4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBzdHJva2U9IiNGRkZGRkYiIHN0cm9rZS13aWR0aD0iMSIgZD0iTTE5LDI1IEwxOSwxNSBMMTYsMTUgQzE1LjQ0NzcxNTMsMTUgMTUsMTQuNTUyMjg0NyAxNSwxNCBDMTUsMTMuNTE0NTg5NyAxNS4zNDc5OTkzLDEzLjEwMTkxNSAxNS44NjU0ODc3LDEzLjAxMDA1MjEgTDE2LDEzIEwyNCwxMyBDMjQuNTUyMjg0NywxMyAyNSwxMy40NDc3MTUzIDI1LDE0IEMyNSwxNC40ODU0MTAzIDI0LjY1MjAwMDcsMTQuODk4MDg1IDI0LjEzNDUxMjMsMTQuOTg5OTQ3OSBMMjQsMTUgTDIxLDE1IEwyMSwyNSBMMjQsMjUgQzI0LjU1MjI4NDcsMjUgMjUsMjUuNDQ3NzE1MyAyNSwyNiBDMjUsMjYuNDg1NDEwMyAyNC42NTIwMDA3LDI2Ljg5ODA4NSAyNC4xMzQ1MTIzLDI2Ljk4OTk0NzkgTDI0LDI3IEwxNiwyNyBDMTUuNDQ3NzE1MywyNyAxNSwyNi41NTIyODQ3IDE1LDI2IEMxNSwyNS41MTQ1ODk3IDE1LjM0Nzk5OTMsMjUuMTAxOTE1IDE1Ljg2NTQ4NzcsMjUuMDEwMDUyMSBMMTYsMjUgTDE5LDI1IFoiIGZpbGw9IiMyMTIzMjQiIGZpbGwtcnVsZT0iZXZlbm9kZCI+PC9wYXRoPgogICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICA8L2c+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4="};class Ft extends _e{constructor(e,t,i,s,a,r){super(e),this.cursors=i,this.memberId=s,this.cursorManager=a,this.wrapper=r,this.onCursorChange=(e,t)=>{var i;if("main"===e.type){const t=this.cursorManager.wrapperRect;this.component&&t&&(this.autoHidden(),this.moveCursor(e,t,this.manager.mainView))}else{const t=this.cursorManager.focusView,s=null==(i=null==t?void 0:t.divElement)?void 0:i.getBoundingClientRect(),a=null==t?void 0:t.camera;t&&s&&a&&this.component&&(this.autoHidden(),this.moveCursor(e,s,t))}t&&t===ce.Leave&&this.hide()},this.setMember(),this.createCursor(),t(this.memberId,this.onCursorChange),this.autoHidden()}moveCursor(e,t,i){var s,a;const{x:r,y:n,type:o}=e,h=null==i?void 0:i.screen.convertPointToScreen(r,n);if(h){let e=h.x-2,i=h.y-18;if("app"===o){const s=this.cursorManager.wrapperRect;s&&(e=e+t.x-s.x,i=i+t.y-s.y)}h.x<0||h.x>t.width||h.y<0||h.y>t.height?null==(s=this.component)||s.$set({visible:!1,x:e,y:i}):null==(a=this.component)||a.$set({visible:!0,x:e,y:i})}}get memberApplianceName(){var e,t;return null==(t=null==(e=this.member)?void 0:e.memberState)?void 0:t.currentApplianceName}get memberColor(){var e,t;return`rgb(${null==(t=null==(e=this.member)?void 0:e.memberState)?void 0:t.strokeColor.join(",")})`}get payload(){var e;return null==(e=this.member)?void 0:e.payload}get memberCursorName(){var e,t;return(null==(e=this.payload)?void 0:e.nickName)||(null==(t=this.payload)?void 0:t.cursorName)||this.memberId}get memberTheme(){var e;return(null==(e=this.payload)?void 0:e.theme)?"netless-window-manager-cursor-inner-mellow":"netless-window-manager-cursor-inner"}get memberCursorTextColor(){var e;return(null==(e=this.payload)?void 0:e.cursorTextColor)||"#FFFFFF"}get memberCursorTagBackgroundColor(){var e;return(null==(e=this.payload)?void 0:e.cursorTagBackgroundColor)||this.memberColor}get memberAvatar(){var e;return null==(e=this.payload)?void 0:e.avatar}get memberOpacity(){return this.memberCursorName||this.memberAvatar?1:0}get cursorState(){return w(this.cursors,[this.memberId,Ye.CursorState])}get cursorPosition(){return w(this.cursors,[this.memberId,Ye.Position])}autoHidden(){this.timer&&clearTimeout(this.timer),this.timer=window.setTimeout((()=>{this.hide(),this.store.updateCursorState(this.memberId,ce.Leave)}),1e4)}async createCursor(){this.member&&this.wrapper&&(this.component=new Wt({target:this.wrapper,props:this.initProps()}))}initProps(){return{x:0,y:0,appliance:this.memberApplianceName,avatar:this.memberAvatar,src:this.getIcon(),visible:!1,backgroundColor:this.memberColor,cursorName:this.memberCursorName,theme:this.memberTheme,color:this.memberCursorTextColor,cursorTagBackgroundColor:this.memberCursorTagBackgroundColor,opacity:this.memberOpacity}}getIcon(){if(this.member){return Yt[this.memberApplianceName||H.shape]||Yt[H.shape]}}setMember(){this.member=this.context.findMemberByUid(this.memberId),this.updateComponent()}updateComponent(){var e;null==(e=this.component)||e.$set(N(this.initProps(),["x","y"]))}destroy(){var e;this.component&&this.component.$destroy(),null==(e=this.manager.refresher)||e.remove(this.memberId),this.cursorManager.cursorInstances.delete(this.memberId)}hide(){this.component&&this.component.$set({visible:!1})}}class Ht extends _e{constructor(e){var t;super(e),this.appManager=e,this.cursorInstances=new Map,this.sideEffectManager=new ee,this.getUids=e=>D(f(null==e?void 0:e.map((e=>{var t;return null==(t=e.payload)?void 0:t.uid})))),this.handleRoomMembersChange=u((e=>{const t=this.getUids(this.roomMembers),i=Object.keys(this.cursors);(null==t?void 0:t.length)&&i.map((i=>{if(t.includes(i)&&!this.cursorInstances.has(i)){if(i===this.context.uid)return;const t=new Ft(this.appManager,this.addCursorChangeListener,this.cursors,i,this,e);this.cursorInstances.set(i,t)}}))}),100),this.mouseMoveListener=u((e=>{this.updateCursor(this.getType(e),e.clientX,e.clientY)}),5),this.getPoint=(e,t,i)=>{var s;const a=null==(s=null==e?void 0:e.divElement)?void 0:s.getBoundingClientRect();if(a){return null==e?void 0:e.convertToPointInWorld({x:t-a.x,y:i-a.y})}},this.getType=e=>{var t;const i=e.target,s=this.appManager.focusApp;switch(i.parentElement){case this.mainViewElement:return{type:"main"};case null==(t=null==s?void 0:s.view)?void 0:t.divElement:return{type:"app"};default:return{type:"main"}}},this.mouseLeaveListener=()=>{this.hideCursor(this.context.uid),this.store.updateCursorState(this.context.uid,ce.Leave)},this.addCursorChangeListener=(e,t)=>{var i;null==(i=this.manager.refresher)||i.add(e,(()=>O((()=>{const i=w(this.cursors,[e,Ye.Position]),s=w(this.cursors,[e,Ye.CursorState]);i&&t(i,s)}))))},this.roomMembers=null==(t=this.appManager.room)?void 0:t.state.roomMembers;const i=$t.wrapper;i&&this.setupWrapper(i),Jt.on("onReconnected",(()=>{this.onReconnect()}))}setupWrapper(e){var t;(null==(t=this.manager.refresher)?void 0:t.hasReactor("cursors"))&&this.destroy(),this.sideEffectManager.add((()=>(e.addEventListener("pointerenter",this.mouseMoveListener),e.addEventListener("pointermove",this.mouseMoveListener),e.addEventListener("pointerleave",this.mouseLeaveListener),()=>{e.removeEventListener("pointerenter",this.mouseMoveListener),e.removeEventListener("pointermove",this.mouseMoveListener),e.removeEventListener("pointerleave",this.mouseLeaveListener)}))),this.initCursorAttributes(),this.wrapperRect=e.getBoundingClientRect(),this.startReaction(e)}setMainViewDivElement(e){this.mainViewElement=e}startReaction(e){var t;null==(t=this.manager.refresher)||t.add("cursors",(()=>ke(this.cursors,(()=>{this.handleRoomMembersChange(e)}))))}get cursors(){var e;return null==(e=this.manager.attributes)?void 0:e[Ye.Cursors]}get boxState(){return this.store.getBoxState()}get focusView(){var e;return null==(e=this.appManager.focusApp)?void 0:e.view}updateCursor(e,t,i){if(this.wrapperRect&&this.manager.canOperate){const s="main"===e.type?this.appManager.mainView:this.focusView,a=this.getPoint(s,t,i);a&&(this.setNormalCursorState(),this.store.updateCursor(this.context.uid,c({x:a.x,y:a.y},e)))}}initCursorAttributes(){this.store.updateCursor(this.context.uid,{x:0,y:0,type:"main"}),this.store.updateCursorState(this.context.uid,ce.Leave)}setNormalCursorState(){this.store.getCursorState(this.context.uid)!==ce.Normal&&this.store.updateCursorState(this.context.uid,ce.Normal)}updateContainerRect(){var e,t;this.containerRect=null==(e=$t.container)?void 0:e.getBoundingClientRect(),this.wrapperRect=null==(t=$t.wrapper)?void 0:t.getBoundingClientRect()}setRoomMembers(e){this.roomMembers=e,this.cursorInstances.forEach((e=>{e.setMember()})),$t.wrapper&&this.handleRoomMembersChange($t.wrapper)}deleteCursor(e){this.store.cleanCursor(e);const t=this.cursorInstances.get(e);t&&t.destroy()}hideCursor(e){const t=this.cursorInstances.get(e);t&&t.hide()}cleanMemberAttributes(e){const t=this.getUids(e),i=[];Object.keys(this.cursors).map((e=>{-1===t.findIndex((t=>t===e))&&i.push(e)})),i.forEach((e=>{this.deleteCursor(e)}))}onReconnect(){var e;this.cursorInstances.size&&(this.cursorInstances.forEach((e=>e.destroy())),this.cursorInstances.clear()),this.roomMembers=null==(e=this.appManager.room)?void 0:e.state.roomMembers,$t.wrapper&&this.handleRoomMembersChange($t.wrapper)}destroy(){var e;this.sideEffectManager.flushAll(),this.cursorInstances.size&&(this.cursorInstances.forEach((e=>{e.destroy()})),this.cursorInstances.clear()),null==(e=this.manager.refresher)||e.remove("cursors")}}const Xt={DocsViewer:te.kind,MediaPlayer:ie.kind};const Jt=new l,Kt=new l,_t=new class{constructor(e){this.ctx=e,this.reactors=new Map,this.disposers=new Map,this.onPhaseChanged=e=>{e===X.Connected&&this.phase===X.Reconnecting&&this.onReconnected(),this.phase=e},this.onReconnected=u((()=>{Xe("onReconnected refresh reactors"),this.releaseDisposers(),this.reactors.forEach(((e,t)=>{j(e)&&this.disposers.set(t,e())})),this.ctx.emitter.emit("onReconnected",void 0)}),3e3)}setRoom(e){this.room=e,this.phase=null==e?void 0:e.phase,null==e||e.callbacks.off("onPhaseChanged",this.onPhaseChanged),null==e||e.callbacks.on("onPhaseChanged",this.onPhaseChanged)}setContext(e){this.ctx=e}releaseDisposers(){this.disposers.forEach((e=>{j(e)&&e()})),this.disposers.clear()}add(e,t){j(t)&&(this.reactors.set(e,t),this.disposers.set(e,t()))}remove(e){this.reactors.has(e)&&this.reactors.delete(e);const t=this.disposers.get(e);t&&(j(t)&&t(),this.disposers.delete(e))}hasReactor(e){return this.reactors.has(e)}destroy(){var e;null==(e=this.room)||e.callbacks.off("onPhaseChanged",this.onPhaseChanged),this.releaseDisposers()}}({emitter:Jt}),qt=class extends J{constructor(e){super(e),this.version="0.4.0-canary.12",this.emitter=Kt,this.viewMode=K.Broadcaster,this.isReplay=W(this.displayer),qt.displayer=e.displayer}static async mount(e){const t=e.room;qt.container=e.container;const i=e.containerSizeRatio,s=e.debug,a=e.cursor;if(qt.params=e,this.checkVersion(),Y(t)){if(t.phase!==X.Connected)throw new Error("[WindowManager]: Room only Connected can be mount");t.phase===X.Connected&&t.isWritable&&(t.disableSerialization=!1)}if(qt.isCreated)throw new Error("[WindowManager]: Already created cannot be created again");let r=await this.initManager(t);if(this.debug=Boolean(s),Xe("Already insert room",r),Y(this.displayer)){if(!r)throw new Error("[WindowManager]: init InvisiblePlugin failed")}else await p((async e=>{if(r=await this.initManager(t),!r)throw Xe(`manager is empty. retrying ${e}`),new Error}),{retries:10});i&&(qt.containerSizeRatio=i),await r.ensureAttributes(),r.appManager=new st(r),a&&(r.cursorManager=new Ht(r.appManager)),e.container&&r.bindContainer(e.container),((e,t)=>{if(W(e)){const t=e,i=t.seekToProgressTime;t.seekToProgressTime=async function(e){const s=await i.call(t,e);return"success"===s&&Jt.emit("seek",e),s}}else{if(Object.getOwnPropertyDescriptor(e,"disableCameraTransform"))return;Object.defineProperty(e,"disableCameraTransform",{get:()=>t.mainView.disableCameraTransform,set(e){t.mainView.disableCameraTransform=e}}),Object.defineProperty(e,"canUndoSteps",{get:()=>t.mainView.canUndoSteps}),Object.defineProperty(e,"canRedoSteps",{get:()=>t.mainView.canRedoSteps}),e.moveCamera=e=>t.mainView.moveCamera(e),e.moveCameraToContain=(...e)=>t.moveCameraToContain(...e),e.convertToPointInWorld=(...e)=>t.mainView.convertToPointInWorld(...e),e.setCameraBound=(...e)=>t.mainView.setCameraBound(...e),e.scenePreview=(...e)=>t.mainView.scenePreview(...e),e.fillSceneSnapshot=(...e)=>t.mainView.fillSceneSnapshot(...e),e.generateScreenshot=(...e)=>t.mainView.generateScreenshot(...e),e.setMemberState=(...e)=>t.mainView.setMemberState(...e),e.redo=()=>t.mainView.redo(),e.undo=()=>t.mainView.undo()}})(t,r),Jt.emit("onCreated"),qt.isCreated=!0;try{await Me()}catch(n){console.warn("[WindowManager]: indexedDB open failed"),console.log(n)}return r}static async initManager(e){let t=e.getInvisiblePlugin(qt.kind);if(!t&&Y(e))if(!1===e.isWritable){try{await e.setWritable(!0)}catch(i){throw new Error("[WindowManger]: room must be switched to be writable")}t=await e.createInvisiblePlugin(qt,{}),t.ensureAttributes(),await Ne(500),await e.setWritable(!1)}else t=await e.createInvisiblePlugin(qt,{});return t}static initContainer(e,t,i,s){qt.container||(qt.container=t);const{playground:a,wrapper:r,sizer:n,mainViewElement:o}=(e=>{const t=document.createElement("div");t.className="netless-window-manager-playground";const i=document.createElement("div");i.className="netless-window-manager-sizer";const s=document.createElement("div");s.className="netless-window-manager-wrapper";const a=document.createElement("div");return a.className="netless-window-manager-main-view",t.appendChild(i),i.appendChild(s),s.appendChild(a),e.appendChild(t),$t.wrapper=s,{playground:t,wrapper:s,sizer:i,mainViewElement:a}})(t);if(qt.playground=a,i&&n.classList.add("netless-window-manager-chess-sizer"),s){const e=document.createElement("style");e.textContent=s,a.appendChild(e)}return e.containerResizeObserver=rt.create(a,n,r,Jt),qt.wrapper=r,o}bindContainer(e){var t,i,s,a,r,n,o,h,c,d;if(qt.isCreated&&qt.container)qt.container.firstChild&&e.appendChild(qt.container.firstChild);else if(qt.params){const s=qt.params,a=qt.initContainer(this,e,s.chessboard,s.overwriteStyles),r=(o=this,h=Kt,c=Jt,d={collectorContainer:s.collectorContainer,collectorStyles:s.collectorStyles,prefersColorScheme:s.prefersColorScheme},new nt({safeSetAttributes:e=>o.safeSetAttributes(e),getMainView:()=>o.mainView,updateAppState:(...e)=>{var t;return null==(t=o.appManager)?void 0:t.store.updateAppState(...e)},canOperate:()=>o.canOperate,notifyContainerRectUpdate:e=>{var t;return null==(t=o.appManager)?void 0:t.notifyContainerRectUpdate(e)},cleanFocus:()=>{var e;return null==(e=o.appManager)?void 0:e.store.cleanFocus()},callbacks:h,emitter:c},d));this.boxManager=r,null==(t=this.appManager)||t.setBoxManager(r),this.bindMainView(a,s.disableCameraTransform),qt.wrapper&&(null==(i=this.cursorManager)||i.setupWrapper(qt.wrapper))}null==(s=this.boxManager)||s.updateManagerRect(),null==(a=this.appManager)||a.refresh(),null==(r=this.appManager)||r.resetMaximized(),null==(n=this.appManager)||n.resetMinimized(),qt.container=e}bindCollectorContainer(e){qt.isCreated&&this.boxManager?this.boxManager.setCollectorContainer(e):qt.params&&(qt.params.collectorContainer=e)}static register(e){return xe.register(e)}async addApp(e){var t,i,s,a;if(this.appManager){if(!e.kind||"string"!=typeof e.kind)throw new Ee;const r=await(null==(t=xe.appClasses.get(e.kind))?void 0:t());if(r&&(null==(i=r.config)?void 0:i.singleton)&&this.appManager.appProxies.has(e.kind))throw new fe;const n=this.setupScenePath(e,this.appManager);if(void 0===n)return;(null==(s=null==e?void 0:e.options)?void 0:s.scenePath)&&(e.options.scenePath=(a=e.options.scenePath).endsWith("/")?a.slice(0,-1):a);return await this.appManager.addApp(e,Boolean(n))}throw new je}setupScenePath(e,t){var i,s,a;let r=!1;if(e.options){const{scenePath:n,scenes:o}=e.options;if(n){if(!(e=>e.startsWith("/"))(n))throw new Le;const e=Object.keys(this.apps||{});for(const i of e){const e=t.store.getAppScenePath(i);if(e&&e===n)return void console.warn(`[WindowManager]: ScenePath ${n} Already opened`)}}n&&o&&o.length>0&&(this.isDynamicPPT(o)?(r=!0,this.displayer.entireScenes()[n]||null==(i=this.room)||i.putScenes(n,o)):this.displayer.entireScenes()[n]||null==(s=this.room)||s.putScenes(n,[{name:o[0].name}])),n&&void 0===o&&(null==(a=this.room)||a.putScenes(n,[{}]))}return r}async setMainViewScenePath(e){this.appManager&&await this.appManager.setMainViewScenePath(e)}async setMainViewSceneIndex(e){this.appManager&&await this.appManager.setMainViewSceneIndex(e)}getMainViewScenePath(){var e;return null==(e=this.appManager)?void 0:e.store.getMainViewScenePath()}getMainViewSceneIndex(){var e;return null==(e=this.appManager)?void 0:e.store.getMainViewSceneIndex()}setReadonly(e){var t;this.readonly=e,null==(t=this.boxManager)||t.setReadonly(e)}switchMainViewToWriter(){var e;return null==(e=this.appManager)?void 0:e.mainViewProxy.mainViewClickHandler()}onAppDestroy(e,t){((e,t)=>{Jt.once(e).then(t)})(`destroy-${e}`,t)}setViewMode(e){var t,i,s;this.canOperate&&(e===K.Broadcaster&&(null==(t=this.appManager)||t.mainViewProxy.setCameraAndSize(),null==(i=this.appManager)||i.mainViewProxy.start()),e===K.Freedom&&(null==(s=this.appManager)||s.mainViewProxy.stop()),this.viewMode=e)}get mainView(){if(this.appManager)return this.appManager.mainViewProxy.view;throw new je}get camera(){if(this.appManager)return this.appManager.mainViewProxy.view.camera;throw new je}get cameraState(){if(this.appManager)return this.appManager.mainViewProxy.cameraState;throw new je}get apps(){var e;return null==(e=this.appManager)?void 0:e.store.apps()}get boxState(){var e;if(this.appManager)return null==(e=this.appManager.boxManager)?void 0:e.boxState;throw new je}get darkMode(){var e,t;return Boolean(null==(t=null==(e=this.appManager)?void 0:e.boxManager)?void 0:t.darkMode)}get prefersColorScheme(){var e;if(this.appManager)return null==(e=this.appManager.boxManager)?void 0:e.prefersColorScheme;throw new je}get focused(){return this.attributes.focus}queryAll(){var e;return Array.from((null==(e=this.appManager)?void 0:e.appProxies.values())||[])}queryOne(e){var t;return null==(t=this.appManager)?void 0:t.appProxies.get(e)}async closeApp(e){var t;return null==(t=this.appManager)?void 0:t.closeApp(e)}moveCamera(e){this.mainView.moveCamera(e)}moveCameraToContain(t){var i;this.mainView.moveCameraToContain(t),null==(i=this.appManager)||i.dispatchInternalEvent(e.MoveCameraToContain,t),setTimeout((()=>{var e;null==(e=this.appManager)||e.mainViewProxy.setCameraAndSize()}),1e3)}convertToPointInWorld(e){return this.mainView.convertToPointInWorld(e)}setCameraBound(e){this.mainView.setCameraBound(e)}onDestroy(){this._destroy()}destroy(){this._destroy()}_destroy(){var e,t,i,s;null==(e=this.containerResizeObserver)||e.disconnect(),null==(t=this.appManager)||t.destroy(),null==(i=this.cursorManager)||i.destroy(),qt.container=void 0,qt.wrapper=void 0,qt.isCreated=!1,qt.playground&&(null==(s=qt.playground.parentNode)||s.removeChild(qt.playground)),qt.params=void 0,Xe("Destroyed")}bindMainView(e,t){var i;this.appManager&&(this.appManager.bindMainView(e,Boolean(t)),null==(i=this.cursorManager)||i.setMainViewDivElement(e))}get canOperate(){return!!Y(this.displayer)&&(this.displayer.isWritable&&this.displayer.phase===X.Connected)}get room(){return this.displayer}safeSetAttributes(e){this.canOperate&&this.setAttributes(e)}safeUpdateAttributes(e,t){this.canOperate&&this.updateAttributes(e,t)}setPrefersColorScheme(e){var t,i;null==(i=null==(t=this.appManager)?void 0:t.boxManager)||i.setPrefersColorScheme(e)}isDynamicPPT(e){var t,i;const s=null==(i=null==(t=e[0])?void 0:t.ppt)?void 0:i.src;return null==s?void 0:s.startsWith("pptx://")}static checkVersion(){if(Se(_)<Se("2.16.0"))throw new Te("2.16.0")}async ensureAttributes(){if(T(this.attributes)&&await Ne(50),M(this.attributes)){this.attributes[Ye.Apps]||this.safeSetAttributes({[Ye.Apps]:{}}),this.attributes[Ye.Cursors]||this.safeSetAttributes({[Ye.Cursors]:{}});const e=this.displayer.state.sceneState;this.attributes._mainScenePath||this.safeSetAttributes({_mainScenePath:e.scenePath}),this.attributes._mainSceneIndex||this.safeSetAttributes({_mainSceneIndex:e.index})}}};let $t=qt;$t.kind="WindowManager",$t.debug=!1,$t.containerSizeRatio=9/16,$t.isCreated=!1,$t.debug&&se({verbose:!0}),$t.register({kind:te.kind,src:te}),$t.register({kind:ie.kind,src:ie});export{Xt as BuiltinApps,$t as WindowManager,Kt as callbacks,Jt as emitter,_t as reconnectRefresher};
|
1
|
+
var __defProp = Object.defineProperty;
|
2
|
+
var __defProps = Object.defineProperties;
|
3
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
4
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
6
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
7
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
8
|
+
var __spreadValues = (a, b) => {
|
9
|
+
for (var prop in b || (b = {}))
|
10
|
+
if (__hasOwnProp.call(b, prop))
|
11
|
+
__defNormalProp(a, prop, b[prop]);
|
12
|
+
if (__getOwnPropSymbols)
|
13
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
14
|
+
if (__propIsEnum.call(b, prop))
|
15
|
+
__defNormalProp(a, prop, b[prop]);
|
16
|
+
}
|
17
|
+
return a;
|
18
|
+
};
|
19
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
20
|
+
import Emittery from "emittery";
|
21
|
+
import pRetry from "p-retry";
|
22
|
+
import { ResizeObserver as ResizeObserver$1 } from "@juggle/resize-observer";
|
23
|
+
import { debounce, isObject, has, get, size, mapValues, noop as noop$1, pick, isEqual, isEmpty, isInteger, sortBy, maxBy, omit, compact, uniq, isFunction, isNull } from "lodash";
|
24
|
+
import { TELE_BOX_MANAGER_EVENT, TELE_BOX_STATE, TeleBoxManager, TeleBoxCollector } from "@netless/telebox-insider";
|
25
|
+
import { ScenePathType, UpdateEventKind, listenUpdated, unlistenUpdated, reaction, autorun, toJS, listenDisposed, unlistenDisposed, AnimationMode, isPlayer, isRoom, ApplianceNames, RoomPhase, InvisiblePlugin, ViewMode, WhiteVersion } from "white-web-sdk";
|
26
|
+
import { v4 } from "uuid";
|
27
|
+
import { genUID, SideEffectManager } from "side-effect-manager";
|
28
|
+
import AppDocsViewer from "@netless/app-docs-viewer";
|
29
|
+
import AppMediaPlayer, { setOptions } from "@netless/app-media-player";
|
30
|
+
var Events;
|
31
|
+
(function(Events2) {
|
32
|
+
Events2["AppMove"] = "AppMove";
|
33
|
+
Events2["AppFocus"] = "AppFocus";
|
34
|
+
Events2["AppResize"] = "AppResize";
|
35
|
+
Events2["AppBoxStateChange"] = "AppBoxStateChange";
|
36
|
+
Events2["GetAttributes"] = "GetAttributes";
|
37
|
+
Events2["UpdateWindowManagerWrapper"] = "UpdateWindowManagerWrapper";
|
38
|
+
Events2["InitReplay"] = "InitReplay";
|
39
|
+
Events2["WindowCreated"] = "WindowCreated";
|
40
|
+
Events2["SetMainViewScenePath"] = "SetMainViewScenePath";
|
41
|
+
Events2["SetMainViewSceneIndex"] = "SetMainViewSceneIndex";
|
42
|
+
Events2["SwitchViewsToFreedom"] = "SwitchViewsToFreedom";
|
43
|
+
Events2["MoveCameraToContain"] = "MoveCameraToContain";
|
44
|
+
})(Events || (Events = {}));
|
45
|
+
const MagixEventName = "__WindowManger";
|
46
|
+
var AppAttributes;
|
47
|
+
(function(AppAttributes2) {
|
48
|
+
AppAttributes2["Size"] = "size";
|
49
|
+
AppAttributes2["Position"] = "position";
|
50
|
+
AppAttributes2["SceneIndex"] = "SceneIndex";
|
51
|
+
AppAttributes2["ZIndex"] = "zIndex";
|
52
|
+
})(AppAttributes || (AppAttributes = {}));
|
53
|
+
var AppEvents;
|
54
|
+
(function(AppEvents2) {
|
55
|
+
AppEvents2["setBoxSize"] = "setBoxSize";
|
56
|
+
AppEvents2["setBoxMinSize"] = "setBoxMinSize";
|
57
|
+
AppEvents2["destroy"] = "destroy";
|
58
|
+
})(AppEvents || (AppEvents = {}));
|
59
|
+
var AppStatus;
|
60
|
+
(function(AppStatus2) {
|
61
|
+
AppStatus2["StartCreate"] = "StartCreate";
|
62
|
+
})(AppStatus || (AppStatus = {}));
|
63
|
+
var CursorState;
|
64
|
+
(function(CursorState2) {
|
65
|
+
CursorState2["Leave"] = "leave";
|
66
|
+
CursorState2["Normal"] = "normal";
|
67
|
+
})(CursorState || (CursorState = {}));
|
68
|
+
const REQUIRE_VERSION = "2.16.0";
|
69
|
+
const MIN_WIDTH = 340 / 720;
|
70
|
+
const MIN_HEIGHT = 340 / 720;
|
71
|
+
const DEFAULT_CONTAINER_RATIO = 9 / 16;
|
72
|
+
const DatabaseName = "__WindowManagerAppCache";
|
73
|
+
let db;
|
74
|
+
let store$1;
|
75
|
+
const initDb = async () => {
|
76
|
+
db = await createDb();
|
77
|
+
};
|
78
|
+
const setItem = (key, val) => {
|
79
|
+
if (!db)
|
80
|
+
return;
|
81
|
+
return addRecord(db, { kind: key, sourceCode: val });
|
82
|
+
};
|
83
|
+
const getItem = async (key) => {
|
84
|
+
if (!db)
|
85
|
+
return null;
|
86
|
+
return await query(db, key);
|
87
|
+
};
|
88
|
+
function createDb() {
|
89
|
+
return new Promise((resolve, reject) => {
|
90
|
+
const request = indexedDB.open(DatabaseName, 2);
|
91
|
+
request.onerror = (e) => {
|
92
|
+
reject(e);
|
93
|
+
};
|
94
|
+
request.onupgradeneeded = (event) => {
|
95
|
+
const db2 = event.target.result;
|
96
|
+
if (!db2.objectStoreNames.contains("apps")) {
|
97
|
+
store$1 = db2.createObjectStore("apps", { keyPath: "kind" });
|
98
|
+
store$1.createIndex("kind", "kind", { unique: true });
|
99
|
+
}
|
100
|
+
};
|
101
|
+
request.onsuccess = () => {
|
102
|
+
const db2 = request.result;
|
103
|
+
resolve(db2);
|
104
|
+
};
|
105
|
+
});
|
106
|
+
}
|
107
|
+
function query(db2, val) {
|
108
|
+
return new Promise((resolve, reject) => {
|
109
|
+
const index = db2.transaction(["apps"]).objectStore("apps").index("kind");
|
110
|
+
const request = index.get(val);
|
111
|
+
request.onerror = (e) => reject(e);
|
112
|
+
request.onsuccess = () => {
|
113
|
+
if (request.result) {
|
114
|
+
resolve(request.result);
|
115
|
+
} else {
|
116
|
+
resolve(null);
|
117
|
+
}
|
118
|
+
};
|
119
|
+
});
|
120
|
+
}
|
121
|
+
function addRecord(db2, payload) {
|
122
|
+
return new Promise((resolve, reject) => {
|
123
|
+
const request = db2.transaction(["apps"], "readwrite").objectStore("apps").add(payload);
|
124
|
+
request.onsuccess = () => resolve();
|
125
|
+
request.onerror = () => reject();
|
126
|
+
});
|
127
|
+
}
|
128
|
+
const Prefix = "NetlessApp";
|
129
|
+
const TIMEOUT = 1e4;
|
130
|
+
const getScript = async (url) => {
|
131
|
+
const item = await getItem(url);
|
132
|
+
if (item) {
|
133
|
+
return item.sourceCode;
|
134
|
+
} else {
|
135
|
+
const result = await fetchWithTimeout(url, { timeout: TIMEOUT });
|
136
|
+
const text2 = await result.text();
|
137
|
+
await setItem(url, text2);
|
138
|
+
return text2;
|
139
|
+
}
|
140
|
+
};
|
141
|
+
const executeScript = (text2, appName) => {
|
142
|
+
let result = Function(text2 + `;return ${appName}`)();
|
143
|
+
if (typeof result === "undefined") {
|
144
|
+
result = window[appName];
|
145
|
+
}
|
146
|
+
return result;
|
147
|
+
};
|
148
|
+
const loadApp = async (url, key, name) => {
|
149
|
+
const appName = name || Prefix + key;
|
150
|
+
const text2 = await getScript(url);
|
151
|
+
try {
|
152
|
+
return executeScript(text2, appName);
|
153
|
+
} catch (error) {
|
154
|
+
if (error.message.includes("Can only have one anonymous define call per script file")) {
|
155
|
+
const define = window.define;
|
156
|
+
if (typeof define == "function" && define.amd) {
|
157
|
+
delete define.amd;
|
158
|
+
}
|
159
|
+
return executeScript(text2, appName);
|
160
|
+
}
|
161
|
+
}
|
162
|
+
};
|
163
|
+
async function fetchWithTimeout(resource, options) {
|
164
|
+
const { timeout = 1e4 } = options;
|
165
|
+
const controller = new AbortController();
|
166
|
+
const id = setTimeout(() => controller.abort(), timeout);
|
167
|
+
const response = await fetch(resource, __spreadProps(__spreadValues({}, options), {
|
168
|
+
signal: controller.signal,
|
169
|
+
headers: {
|
170
|
+
"content-type": "text/plain"
|
171
|
+
}
|
172
|
+
}));
|
173
|
+
clearTimeout(id);
|
174
|
+
return response;
|
175
|
+
}
|
176
|
+
class AppRegister {
|
177
|
+
constructor() {
|
178
|
+
this.kindEmitters = new Map();
|
179
|
+
this.registered = new Map();
|
180
|
+
this.appClassesCache = new Map();
|
181
|
+
this.appClasses = new Map();
|
182
|
+
}
|
183
|
+
async register(params) {
|
184
|
+
this.registered.set(params.kind, params);
|
185
|
+
const srcOrAppOrFunction = params.src;
|
186
|
+
let downloadApp;
|
187
|
+
if (typeof srcOrAppOrFunction === "string") {
|
188
|
+
downloadApp = async () => {
|
189
|
+
let appClass = await loadApp(srcOrAppOrFunction, params.kind);
|
190
|
+
if (appClass) {
|
191
|
+
if (appClass.__esModule) {
|
192
|
+
appClass = appClass.default;
|
193
|
+
}
|
194
|
+
return appClass;
|
195
|
+
} else {
|
196
|
+
throw new Error(`[WindowManager]: load remote script failed, ${srcOrAppOrFunction}`);
|
197
|
+
}
|
198
|
+
};
|
199
|
+
} else if (typeof srcOrAppOrFunction === "function") {
|
200
|
+
downloadApp = srcOrAppOrFunction;
|
201
|
+
} else {
|
202
|
+
downloadApp = async () => srcOrAppOrFunction;
|
203
|
+
}
|
204
|
+
this.appClasses.set(params.kind, async () => {
|
205
|
+
let app = this.appClassesCache.get(params.kind);
|
206
|
+
if (!app) {
|
207
|
+
app = downloadApp();
|
208
|
+
this.appClassesCache.set(params.kind, app);
|
209
|
+
}
|
210
|
+
return app;
|
211
|
+
});
|
212
|
+
if (params.addHooks) {
|
213
|
+
const emitter2 = this.createKindEmitter(params.kind);
|
214
|
+
if (emitter2) {
|
215
|
+
params.addHooks(emitter2);
|
216
|
+
}
|
217
|
+
}
|
218
|
+
}
|
219
|
+
async notifyApp(kind, event, payload) {
|
220
|
+
const emitter2 = this.kindEmitters.get(kind);
|
221
|
+
await (emitter2 == null ? void 0 : emitter2.emit(event, payload));
|
222
|
+
}
|
223
|
+
createKindEmitter(kind) {
|
224
|
+
if (!this.kindEmitters.has(kind)) {
|
225
|
+
const emitter2 = new Emittery();
|
226
|
+
this.kindEmitters.set(kind, emitter2);
|
227
|
+
}
|
228
|
+
return this.kindEmitters.get(kind);
|
229
|
+
}
|
230
|
+
}
|
231
|
+
const appRegister = new AppRegister();
|
232
|
+
const genAppId = async (kind) => {
|
233
|
+
var _a, _b;
|
234
|
+
const impl = await ((_a = appRegister.appClasses.get(kind)) == null ? void 0 : _a());
|
235
|
+
if (impl && ((_b = impl.config) == null ? void 0 : _b.singleton)) {
|
236
|
+
return kind;
|
237
|
+
}
|
238
|
+
return `${kind}-${v4().replace("-", "").slice(0, 8)}`;
|
239
|
+
};
|
240
|
+
const setViewFocusScenePath = (view, focusScenePath) => {
|
241
|
+
if (view.focusScenePath !== focusScenePath) {
|
242
|
+
view.focusScenePath = focusScenePath;
|
243
|
+
return view;
|
244
|
+
}
|
245
|
+
};
|
246
|
+
const setScenePath = (room, scenePath) => {
|
247
|
+
if (room && room.isWritable) {
|
248
|
+
if (room.state.sceneState.scenePath !== scenePath) {
|
249
|
+
room.setScenePath(scenePath);
|
250
|
+
}
|
251
|
+
}
|
252
|
+
};
|
253
|
+
const getScenePath = (room, dir, index) => {
|
254
|
+
var _a;
|
255
|
+
if (room && dir) {
|
256
|
+
const scenes = entireScenes(room);
|
257
|
+
const scene = (_a = scenes[dir]) == null ? void 0 : _a[index];
|
258
|
+
if (scene) {
|
259
|
+
return `${dir}/${scene.name}`;
|
260
|
+
}
|
261
|
+
}
|
262
|
+
};
|
263
|
+
const removeScenes = (room, scenePath) => {
|
264
|
+
if (room) {
|
265
|
+
const type = room.scenePathType(scenePath);
|
266
|
+
if (type !== ScenePathType.None) {
|
267
|
+
room.removeScenes(scenePath);
|
268
|
+
}
|
269
|
+
}
|
270
|
+
};
|
271
|
+
const addEmitterOnceListener = (event, listener) => {
|
272
|
+
emitter.once(event).then(listener);
|
273
|
+
};
|
274
|
+
debounce((callbacks2, mode) => {
|
275
|
+
callbacks2.emit("mainViewModeChange", mode);
|
276
|
+
}, 200);
|
277
|
+
const makeValidScenePath = (displayer, scenePath, index = 0) => {
|
278
|
+
const scenes = entireScenes(displayer)[scenePath];
|
279
|
+
if (!scenes)
|
280
|
+
return;
|
281
|
+
const scene = scenes[index];
|
282
|
+
if (!scene)
|
283
|
+
return;
|
284
|
+
const firstSceneName = scene.name;
|
285
|
+
if (scenePath === "/") {
|
286
|
+
return `/${firstSceneName}`;
|
287
|
+
} else {
|
288
|
+
return `${scenePath}/${firstSceneName}`;
|
289
|
+
}
|
290
|
+
};
|
291
|
+
const entireScenes = (displayer) => {
|
292
|
+
return displayer.entireScenes();
|
293
|
+
};
|
294
|
+
const isValidScenePath = (scenePath) => {
|
295
|
+
return scenePath.startsWith("/");
|
296
|
+
};
|
297
|
+
const parseSceneDir = (scenePath) => {
|
298
|
+
const sceneList = scenePath.split("/");
|
299
|
+
sceneList.pop();
|
300
|
+
let sceneDir = sceneList.join("/");
|
301
|
+
if (sceneDir === "") {
|
302
|
+
sceneDir = "/";
|
303
|
+
}
|
304
|
+
return sceneDir;
|
305
|
+
};
|
306
|
+
const ensureValidScenePath = (scenePath) => {
|
307
|
+
if (scenePath.endsWith("/")) {
|
308
|
+
return scenePath.slice(0, -1);
|
309
|
+
} else {
|
310
|
+
return scenePath;
|
311
|
+
}
|
312
|
+
};
|
313
|
+
const getVersionNumber = (version) => {
|
314
|
+
const versionString = version.split(".").map((s) => s.padStart(2, "0")).join("");
|
315
|
+
return parseInt(versionString);
|
316
|
+
};
|
317
|
+
const wait = (time) => new Promise((resolve) => setTimeout(resolve, time));
|
318
|
+
class AppListeners {
|
319
|
+
constructor(manager) {
|
320
|
+
this.manager = manager;
|
321
|
+
this.displayer = this.manager.displayer;
|
322
|
+
this.mainMagixEventListener = (event) => {
|
323
|
+
if (event.authorId !== this.displayer.observerId) {
|
324
|
+
const data = event.payload;
|
325
|
+
switch (data.eventName) {
|
326
|
+
case Events.AppMove: {
|
327
|
+
this.appMoveHandler(data.payload);
|
328
|
+
break;
|
329
|
+
}
|
330
|
+
case Events.AppResize: {
|
331
|
+
this.appResizeHandler(data.payload);
|
332
|
+
break;
|
333
|
+
}
|
334
|
+
case Events.AppBoxStateChange: {
|
335
|
+
this.boxStateChangeHandler(data.payload);
|
336
|
+
break;
|
337
|
+
}
|
338
|
+
case Events.SetMainViewScenePath: {
|
339
|
+
this.setMainViewScenePathHandler(data.payload);
|
340
|
+
break;
|
341
|
+
}
|
342
|
+
case Events.MoveCameraToContain: {
|
343
|
+
this.moveCameraToContainHandler(data.payload);
|
344
|
+
break;
|
345
|
+
}
|
346
|
+
}
|
347
|
+
}
|
348
|
+
};
|
349
|
+
this.appMoveHandler = (payload) => {
|
350
|
+
var _a;
|
351
|
+
(_a = this.boxManager) == null ? void 0 : _a.moveBox(payload);
|
352
|
+
};
|
353
|
+
this.appResizeHandler = (payload) => {
|
354
|
+
var _a, _b;
|
355
|
+
(_a = this.boxManager) == null ? void 0 : _a.resizeBox(Object.assign(payload, { skipUpdate: true }));
|
356
|
+
(_b = this.manager.room) == null ? void 0 : _b.refreshViewSize();
|
357
|
+
};
|
358
|
+
this.boxStateChangeHandler = (state) => {
|
359
|
+
callbacks.emit("boxStateChange", state);
|
360
|
+
};
|
361
|
+
this.setMainViewScenePathHandler = ({ nextScenePath }) => {
|
362
|
+
setViewFocusScenePath(this.manager.mainView, nextScenePath);
|
363
|
+
callbacks.emit("mainViewScenePathChange", nextScenePath);
|
364
|
+
};
|
365
|
+
this.moveCameraToContainHandler = (payload) => {
|
366
|
+
this.manager.mainView.moveCameraToContain(payload);
|
367
|
+
};
|
368
|
+
}
|
369
|
+
get boxManager() {
|
370
|
+
return this.manager.boxManager;
|
371
|
+
}
|
372
|
+
addListeners() {
|
373
|
+
this.displayer.addMagixEventListener(MagixEventName, this.mainMagixEventListener);
|
374
|
+
}
|
375
|
+
removeListeners() {
|
376
|
+
this.displayer.removeMagixEventListener(MagixEventName, this.mainMagixEventListener);
|
377
|
+
}
|
378
|
+
}
|
379
|
+
class AppCreateError extends Error {
|
380
|
+
constructor() {
|
381
|
+
super(...arguments);
|
382
|
+
this.message = "[WindowManager]: app duplicate exists and cannot be created again";
|
383
|
+
}
|
384
|
+
}
|
385
|
+
class AppManagerNotInitError extends Error {
|
386
|
+
constructor() {
|
387
|
+
super(...arguments);
|
388
|
+
this.message = "[WindowManager]: AppManager must be initialized";
|
389
|
+
}
|
390
|
+
}
|
391
|
+
class WhiteWebSDKInvalidError extends Error {
|
392
|
+
constructor(version) {
|
393
|
+
super(`[WindowManager]: white-web-sdk version must large than ${version}`);
|
394
|
+
}
|
395
|
+
}
|
396
|
+
class ParamsInvalidError extends Error {
|
397
|
+
constructor() {
|
398
|
+
super(...arguments);
|
399
|
+
this.message = "[WindowManager]: kind must be a valid string";
|
400
|
+
}
|
401
|
+
}
|
402
|
+
class BoxNotCreatedError extends Error {
|
403
|
+
constructor() {
|
404
|
+
super(...arguments);
|
405
|
+
this.message = "[WindowManager]: box need created";
|
406
|
+
}
|
407
|
+
}
|
408
|
+
class InvalidScenePath extends Error {
|
409
|
+
constructor() {
|
410
|
+
super(...arguments);
|
411
|
+
this.message = `[WindowManager]: ScenePath should start with "/"`;
|
412
|
+
}
|
413
|
+
}
|
414
|
+
class BoxManagerNotFoundError extends Error {
|
415
|
+
constructor() {
|
416
|
+
super(...arguments);
|
417
|
+
this.message = "[WindowManager]: boxManager not found";
|
418
|
+
}
|
419
|
+
}
|
420
|
+
const onObjectByEvent = (event) => {
|
421
|
+
return (object, func) => {
|
422
|
+
if (object === void 0)
|
423
|
+
return;
|
424
|
+
if (listenUpdated) {
|
425
|
+
const listener = (events) => {
|
426
|
+
const kinds = events.map((e) => e.kind);
|
427
|
+
if (kinds.includes(event)) {
|
428
|
+
func();
|
429
|
+
}
|
430
|
+
};
|
431
|
+
listenUpdated(object, listener);
|
432
|
+
func();
|
433
|
+
return () => unlistenUpdated(object, listener);
|
434
|
+
} else {
|
435
|
+
return reaction(() => object, () => {
|
436
|
+
func();
|
437
|
+
}, {
|
438
|
+
fireImmediately: true
|
439
|
+
});
|
440
|
+
}
|
441
|
+
};
|
442
|
+
};
|
443
|
+
const safeListenPropsUpdated = (getProps, callback, onDestroyed) => {
|
444
|
+
let disposeListenUpdated = null;
|
445
|
+
const disposeReaction = reaction(getProps, () => {
|
446
|
+
if (disposeListenUpdated) {
|
447
|
+
disposeListenUpdated();
|
448
|
+
disposeListenUpdated = null;
|
449
|
+
}
|
450
|
+
const props = getProps();
|
451
|
+
if (isObject(props)) {
|
452
|
+
disposeListenUpdated = () => unlistenUpdated(props, callback);
|
453
|
+
listenUpdated(props, callback);
|
454
|
+
} else {
|
455
|
+
onDestroyed == null ? void 0 : onDestroyed(props);
|
456
|
+
}
|
457
|
+
}, { fireImmediately: true });
|
458
|
+
return () => {
|
459
|
+
disposeListenUpdated == null ? void 0 : disposeListenUpdated();
|
460
|
+
disposeReaction();
|
461
|
+
};
|
462
|
+
};
|
463
|
+
const onObjectRemoved = onObjectByEvent(UpdateEventKind.Removed);
|
464
|
+
const onObjectInserted = onObjectByEvent(UpdateEventKind.Inserted);
|
465
|
+
const plainObjectKeys = Object.keys;
|
466
|
+
function isRef(e) {
|
467
|
+
return Boolean(has(e, "__isRef"));
|
468
|
+
}
|
469
|
+
function makeRef(v) {
|
470
|
+
return { k: genUID(), v, __isRef: true };
|
471
|
+
}
|
472
|
+
class StorageEvent {
|
473
|
+
constructor() {
|
474
|
+
this.listeners = new Set();
|
475
|
+
}
|
476
|
+
get length() {
|
477
|
+
return this.listeners.size;
|
478
|
+
}
|
479
|
+
dispatch(message) {
|
480
|
+
this.listeners.forEach((callback) => callback(message));
|
481
|
+
}
|
482
|
+
addListener(listener) {
|
483
|
+
this.listeners.add(listener);
|
484
|
+
}
|
485
|
+
removeListener(listener) {
|
486
|
+
this.listeners.delete(listener);
|
487
|
+
}
|
488
|
+
}
|
489
|
+
const STORAGE_NS = "_WM-STORAGE_";
|
490
|
+
class Storage {
|
491
|
+
constructor(context2, id, defaultState) {
|
492
|
+
this._sideEffect = new SideEffectManager();
|
493
|
+
this._destroyed = false;
|
494
|
+
this._refMap = new WeakMap();
|
495
|
+
this._lastValue = new Map();
|
496
|
+
this.onStateChanged = new StorageEvent();
|
497
|
+
if (defaultState && !isObject(defaultState)) {
|
498
|
+
throw new Error(`Default state for Storage ${id} is not an object.`);
|
499
|
+
}
|
500
|
+
this._context = context2;
|
501
|
+
this.id = id || null;
|
502
|
+
this._state = {};
|
503
|
+
const rawState = this._getRawState(this._state);
|
504
|
+
if (this.id !== null && this._context.getIsWritable()) {
|
505
|
+
if (rawState === this._state || !isObject(rawState)) {
|
506
|
+
if (!get(this._context.getAttributes(), [STORAGE_NS])) {
|
507
|
+
this._context.updateAttributes([STORAGE_NS], {});
|
508
|
+
}
|
509
|
+
this._context.updateAttributes([STORAGE_NS, this.id], this._state);
|
510
|
+
}
|
511
|
+
if (defaultState) {
|
512
|
+
this.setState(defaultState);
|
513
|
+
}
|
514
|
+
}
|
515
|
+
plainObjectKeys(rawState).forEach((key) => {
|
516
|
+
if (this.id === null && key === STORAGE_NS) {
|
517
|
+
return;
|
518
|
+
}
|
519
|
+
try {
|
520
|
+
const rawValue = isObject(rawState[key]) ? JSON.parse(JSON.stringify(rawState[key])) : rawState[key];
|
521
|
+
if (isRef(rawValue)) {
|
522
|
+
this._state[key] = rawValue.v;
|
523
|
+
if (isObject(rawValue.v)) {
|
524
|
+
this._refMap.set(rawValue.v, rawValue);
|
525
|
+
}
|
526
|
+
} else {
|
527
|
+
this._state[key] = rawValue;
|
528
|
+
}
|
529
|
+
} catch (e) {
|
530
|
+
console.error(e);
|
531
|
+
}
|
532
|
+
});
|
533
|
+
this._sideEffect.addDisposer(safeListenPropsUpdated(() => this.id === null ? context2.getAttributes() : get(context2.getAttributes(), [STORAGE_NS, this.id]), this._updateProperties.bind(this), this.destroy.bind(this)));
|
534
|
+
}
|
535
|
+
get state() {
|
536
|
+
if (this._destroyed) {
|
537
|
+
console.warn(`Accessing state on destroyed Storage "${this.id}"`);
|
538
|
+
}
|
539
|
+
return this._state;
|
540
|
+
}
|
541
|
+
addStateChangedListener(handler) {
|
542
|
+
this.onStateChanged.addListener(handler);
|
543
|
+
return () => this.onStateChanged.removeListener(handler);
|
544
|
+
}
|
545
|
+
ensureState(state) {
|
546
|
+
return this.setState(plainObjectKeys(state).reduce((payload, key) => {
|
547
|
+
if (!has(this._state, key)) {
|
548
|
+
payload[key] = state[key];
|
549
|
+
}
|
550
|
+
return payload;
|
551
|
+
}, {}));
|
552
|
+
}
|
553
|
+
setState(state) {
|
554
|
+
if (this._destroyed) {
|
555
|
+
console.error(new Error(`Cannot call setState on destroyed Storage "${this.id}".`));
|
556
|
+
return;
|
557
|
+
}
|
558
|
+
if (!this._context.getIsWritable()) {
|
559
|
+
console.error(new Error(`Cannot setState on Storage "${this.id}" without writable access`), state);
|
560
|
+
return;
|
561
|
+
}
|
562
|
+
const keys = plainObjectKeys(state);
|
563
|
+
if (keys.length > 0) {
|
564
|
+
keys.forEach((key) => {
|
565
|
+
const value = state[key];
|
566
|
+
if (value === this._state[key]) {
|
567
|
+
return;
|
568
|
+
}
|
569
|
+
if (value === void 0) {
|
570
|
+
this._lastValue.set(key, this._state[key]);
|
571
|
+
delete this._state[key];
|
572
|
+
this._setRawState(key, value);
|
573
|
+
} else {
|
574
|
+
this._lastValue.set(key, this._state[key]);
|
575
|
+
this._state[key] = value;
|
576
|
+
let payload = value;
|
577
|
+
if (isObject(value)) {
|
578
|
+
let refValue = this._refMap.get(value);
|
579
|
+
if (!refValue) {
|
580
|
+
refValue = makeRef(value);
|
581
|
+
this._refMap.set(value, refValue);
|
582
|
+
}
|
583
|
+
payload = refValue;
|
584
|
+
}
|
585
|
+
this._setRawState(key, payload);
|
586
|
+
}
|
587
|
+
});
|
588
|
+
}
|
589
|
+
}
|
590
|
+
emptyStorage() {
|
591
|
+
if (size(this._state) <= 0) {
|
592
|
+
return;
|
593
|
+
}
|
594
|
+
if (this._destroyed) {
|
595
|
+
console.error(new Error(`Cannot empty destroyed Storage "${this.id}".`));
|
596
|
+
return;
|
597
|
+
}
|
598
|
+
if (!this._context.getIsWritable()) {
|
599
|
+
console.error(new Error(`Cannot empty Storage "${this.id}" without writable access.`));
|
600
|
+
return;
|
601
|
+
}
|
602
|
+
this.setState(mapValues(this._state, noop$1));
|
603
|
+
}
|
604
|
+
deleteStorage() {
|
605
|
+
if (this.id === null) {
|
606
|
+
throw new Error(`Cannot delete main Storage`);
|
607
|
+
}
|
608
|
+
if (!this._context.getIsWritable()) {
|
609
|
+
console.error(new Error(`Cannot delete Storage "${this.id}" without writable access.`));
|
610
|
+
return;
|
611
|
+
}
|
612
|
+
this.destroy();
|
613
|
+
this._context.updateAttributes([STORAGE_NS, this.id], void 0);
|
614
|
+
}
|
615
|
+
get destroyed() {
|
616
|
+
return this._destroyed;
|
617
|
+
}
|
618
|
+
destroy() {
|
619
|
+
this._destroyed = true;
|
620
|
+
this._sideEffect.flushAll();
|
621
|
+
}
|
622
|
+
_getRawState(defaultValue) {
|
623
|
+
if (this.id === null) {
|
624
|
+
return get(this._context.getAttributes(), [], defaultValue);
|
625
|
+
} else {
|
626
|
+
return get(this._context.getAttributes(), [STORAGE_NS, this.id], defaultValue);
|
627
|
+
}
|
628
|
+
}
|
629
|
+
_setRawState(key, value) {
|
630
|
+
if (this.id === null) {
|
631
|
+
if (key === STORAGE_NS) {
|
632
|
+
throw new Error(`Cannot set attribute internal filed "${STORAGE_NS}"`);
|
633
|
+
}
|
634
|
+
return this._context.updateAttributes([key], value);
|
635
|
+
} else {
|
636
|
+
return this._context.updateAttributes([STORAGE_NS, this.id, key], value);
|
637
|
+
}
|
638
|
+
}
|
639
|
+
_updateProperties(actions) {
|
640
|
+
var _a;
|
641
|
+
if (this._destroyed) {
|
642
|
+
console.error(new Error(`Cannot call _updateProperties on destroyed Storage "${this.id}".`));
|
643
|
+
return;
|
644
|
+
}
|
645
|
+
if (actions.length > 0) {
|
646
|
+
const diffs = {};
|
647
|
+
for (let i = 0; i < actions.length; i++) {
|
648
|
+
try {
|
649
|
+
const action = actions[i];
|
650
|
+
const key = action.key;
|
651
|
+
if (this.id === null && key === STORAGE_NS) {
|
652
|
+
continue;
|
653
|
+
}
|
654
|
+
const value = isObject(action.value) ? JSON.parse(JSON.stringify(action.value)) : action.value;
|
655
|
+
let oldValue;
|
656
|
+
if (this._lastValue.has(key)) {
|
657
|
+
oldValue = this._lastValue.get(key);
|
658
|
+
this._lastValue.delete(key);
|
659
|
+
}
|
660
|
+
switch (action.kind) {
|
661
|
+
case 2: {
|
662
|
+
if (has(this._state, key)) {
|
663
|
+
oldValue = this._state[key];
|
664
|
+
delete this._state[key];
|
665
|
+
}
|
666
|
+
diffs[key] = { oldValue };
|
667
|
+
break;
|
668
|
+
}
|
669
|
+
default: {
|
670
|
+
let newValue = value;
|
671
|
+
if (isRef(value)) {
|
672
|
+
const { k, v } = value;
|
673
|
+
const curValue = this._state[key];
|
674
|
+
if (isObject(curValue) && ((_a = this._refMap.get(curValue)) == null ? void 0 : _a.k) === k) {
|
675
|
+
newValue = curValue;
|
676
|
+
} else {
|
677
|
+
newValue = v;
|
678
|
+
if (isObject(v)) {
|
679
|
+
this._refMap.set(v, value);
|
680
|
+
}
|
681
|
+
}
|
682
|
+
}
|
683
|
+
if (newValue !== this._state[key]) {
|
684
|
+
oldValue = this._state[key];
|
685
|
+
this._state[key] = newValue;
|
686
|
+
}
|
687
|
+
diffs[key] = { newValue, oldValue };
|
688
|
+
break;
|
689
|
+
}
|
690
|
+
}
|
691
|
+
} catch (e) {
|
692
|
+
console.error(e);
|
693
|
+
}
|
694
|
+
}
|
695
|
+
this.onStateChanged.dispatch(diffs);
|
696
|
+
}
|
697
|
+
}
|
698
|
+
}
|
699
|
+
class AppContext {
|
700
|
+
constructor(manager, boxManager, appId, appProxy, appOptions) {
|
701
|
+
this.manager = manager;
|
702
|
+
this.boxManager = boxManager;
|
703
|
+
this.appId = appId;
|
704
|
+
this.appProxy = appProxy;
|
705
|
+
this.appOptions = appOptions;
|
706
|
+
this.mobxUtils = {
|
707
|
+
autorun,
|
708
|
+
reaction,
|
709
|
+
toJS
|
710
|
+
};
|
711
|
+
this.objectUtils = {
|
712
|
+
listenUpdated,
|
713
|
+
unlistenUpdated,
|
714
|
+
listenDisposed,
|
715
|
+
unlistenDisposed
|
716
|
+
};
|
717
|
+
this.store = this.manager.store;
|
718
|
+
this.isReplay = this.manager.isReplay;
|
719
|
+
this.getDisplayer = () => {
|
720
|
+
return this.manager.displayer;
|
721
|
+
};
|
722
|
+
this.getAttributes = () => {
|
723
|
+
return this.appProxy.attributes;
|
724
|
+
};
|
725
|
+
this.getScenes = () => {
|
726
|
+
const appAttr = this.store.getAppAttributes(this.appId);
|
727
|
+
if (appAttr == null ? void 0 : appAttr.isDynamicPPT) {
|
728
|
+
return this.appProxy.scenes;
|
729
|
+
} else {
|
730
|
+
return appAttr == null ? void 0 : appAttr.options["scenes"];
|
731
|
+
}
|
732
|
+
};
|
733
|
+
this.getView = () => {
|
734
|
+
return this.appProxy.view;
|
735
|
+
};
|
736
|
+
this.getInitScenePath = () => {
|
737
|
+
return this.manager.getAppInitPath(this.appId);
|
738
|
+
};
|
739
|
+
this.getIsWritable = () => {
|
740
|
+
return this.manager.canOperate;
|
741
|
+
};
|
742
|
+
this.getBox = () => {
|
743
|
+
const box = this.boxManager.getBox(this.appId);
|
744
|
+
if (box) {
|
745
|
+
return box;
|
746
|
+
} else {
|
747
|
+
throw new BoxNotCreatedError();
|
748
|
+
}
|
749
|
+
};
|
750
|
+
this.getRoom = () => {
|
751
|
+
return this.manager.room;
|
752
|
+
};
|
753
|
+
this.setAttributes = (attributes) => {
|
754
|
+
this.manager.safeSetAttributes({ [this.appId]: attributes });
|
755
|
+
};
|
756
|
+
this.updateAttributes = (keys, value) => {
|
757
|
+
if (this.manager.attributes[this.appId]) {
|
758
|
+
this.manager.safeUpdateAttributes([this.appId, ...keys], value);
|
759
|
+
}
|
760
|
+
};
|
761
|
+
this.setScenePath = async (scenePath) => {
|
762
|
+
var _a;
|
763
|
+
if (!this.appProxy.box)
|
764
|
+
return;
|
765
|
+
this.appProxy.setFullPath(scenePath);
|
766
|
+
(_a = this.getRoom()) == null ? void 0 : _a.setScenePath(scenePath);
|
767
|
+
};
|
768
|
+
this.mountView = (dom) => {
|
769
|
+
const view = this.getView();
|
770
|
+
if (view) {
|
771
|
+
view.divElement = dom;
|
772
|
+
setTimeout(() => {
|
773
|
+
var _a;
|
774
|
+
(_a = this.getRoom()) == null ? void 0 : _a.refreshViewSize();
|
775
|
+
}, 1e3);
|
776
|
+
}
|
777
|
+
};
|
778
|
+
this.getAppOptions = () => {
|
779
|
+
return typeof this.appOptions === "function" ? this.appOptions() : this.appOptions;
|
780
|
+
};
|
781
|
+
this.createStorage = (storeId, defaultState) => {
|
782
|
+
const storage = new Storage(this, storeId, defaultState);
|
783
|
+
this.emitter.on("destroy", () => {
|
784
|
+
storage.destroy();
|
785
|
+
});
|
786
|
+
return storage;
|
787
|
+
};
|
788
|
+
this.dispatchMagixEvent = this.manager.displayer.dispatchMagixEvent.bind(this.manager.displayer);
|
789
|
+
this.addMagixEventListener = (event, handler, options) => {
|
790
|
+
this.manager.displayer.addMagixEventListener(event, handler, options);
|
791
|
+
return () => this.manager.displayer.removeMagixEventListener(event, handler);
|
792
|
+
};
|
793
|
+
this.removeMagixEventListener = this.manager.displayer.removeMagixEventListener.bind(this.manager.displayer);
|
794
|
+
this.emitter = appProxy.appEmitter;
|
795
|
+
this.isAddApp = appProxy.isAddApp;
|
796
|
+
}
|
797
|
+
get storage() {
|
798
|
+
if (!this._storage) {
|
799
|
+
this._storage = new Storage(this);
|
800
|
+
}
|
801
|
+
return this._storage;
|
802
|
+
}
|
803
|
+
}
|
804
|
+
var Fields;
|
805
|
+
(function(Fields2) {
|
806
|
+
Fields2["Apps"] = "apps";
|
807
|
+
Fields2["Focus"] = "focus";
|
808
|
+
Fields2["State"] = "state";
|
809
|
+
Fields2["BoxState"] = "boxState";
|
810
|
+
Fields2["MainViewCamera"] = "mainViewCamera";
|
811
|
+
Fields2["MainViewSize"] = "mainViewSize";
|
812
|
+
Fields2["Broadcaster"] = "broadcaster";
|
813
|
+
Fields2["Cursors"] = "cursors";
|
814
|
+
Fields2["Position"] = "position";
|
815
|
+
Fields2["CursorState"] = "cursorState";
|
816
|
+
Fields2["FullPath"] = "fullPath";
|
817
|
+
})(Fields || (Fields = {}));
|
818
|
+
class AttributesDelegate {
|
819
|
+
constructor(context2) {
|
820
|
+
this.context = context2;
|
821
|
+
}
|
822
|
+
setContext(context2) {
|
823
|
+
this.context = context2;
|
824
|
+
}
|
825
|
+
get attributes() {
|
826
|
+
return this.context.getAttributes();
|
827
|
+
}
|
828
|
+
apps() {
|
829
|
+
return get(this.attributes, [Fields.Apps]);
|
830
|
+
}
|
831
|
+
get focus() {
|
832
|
+
return get(this.attributes, [Fields.Focus]);
|
833
|
+
}
|
834
|
+
getAppAttributes(id) {
|
835
|
+
return get(this.apps(), [id]);
|
836
|
+
}
|
837
|
+
getAppState(id) {
|
838
|
+
return get(this.apps(), [id, Fields.State]);
|
839
|
+
}
|
840
|
+
getMaximized() {
|
841
|
+
return get(this.attributes, ["maximized"]);
|
842
|
+
}
|
843
|
+
getMinimized() {
|
844
|
+
return get(this.attributes, ["minimized"]);
|
845
|
+
}
|
846
|
+
setupAppAttributes(params, id, isDynamicPPT) {
|
847
|
+
const attributes = this.attributes;
|
848
|
+
if (!attributes.apps) {
|
849
|
+
this.context.safeSetAttributes({ apps: {} });
|
850
|
+
}
|
851
|
+
const attrNames = ["scenePath", "title"];
|
852
|
+
if (!isDynamicPPT) {
|
853
|
+
attrNames.push("scenes");
|
854
|
+
}
|
855
|
+
const options = pick(params.options, attrNames);
|
856
|
+
const attrs = { kind: params.kind, options, isDynamicPPT };
|
857
|
+
if (typeof params.src === "string") {
|
858
|
+
attrs.src = params.src;
|
859
|
+
}
|
860
|
+
attrs.createdAt = Date.now();
|
861
|
+
this.context.safeUpdateAttributes([Fields.Apps, id], attrs);
|
862
|
+
this.context.safeUpdateAttributes([Fields.Apps, id, Fields.State], {
|
863
|
+
[AppAttributes.Size]: {},
|
864
|
+
[AppAttributes.Position]: {},
|
865
|
+
[AppAttributes.SceneIndex]: 0
|
866
|
+
});
|
867
|
+
}
|
868
|
+
updateAppState(appId, stateName, state) {
|
869
|
+
if (get(this.attributes, [Fields.Apps, appId, Fields.State])) {
|
870
|
+
this.context.safeUpdateAttributes([Fields.Apps, appId, Fields.State, stateName], state);
|
871
|
+
}
|
872
|
+
}
|
873
|
+
cleanAppAttributes(id) {
|
874
|
+
this.context.safeUpdateAttributes([Fields.Apps, id], void 0);
|
875
|
+
this.context.safeSetAttributes({ [id]: void 0 });
|
876
|
+
const focus = this.attributes[Fields.Focus];
|
877
|
+
if (focus === id) {
|
878
|
+
this.cleanFocus();
|
879
|
+
}
|
880
|
+
}
|
881
|
+
cleanFocus() {
|
882
|
+
this.context.safeSetAttributes({ [Fields.Focus]: void 0 });
|
883
|
+
}
|
884
|
+
getAppSceneIndex(id) {
|
885
|
+
var _a;
|
886
|
+
return (_a = this.getAppState(id)) == null ? void 0 : _a[AppAttributes.SceneIndex];
|
887
|
+
}
|
888
|
+
getAppScenePath(id) {
|
889
|
+
var _a, _b;
|
890
|
+
return (_b = (_a = this.getAppAttributes(id)) == null ? void 0 : _a.options) == null ? void 0 : _b.scenePath;
|
891
|
+
}
|
892
|
+
getMainViewScenePath() {
|
893
|
+
return this.attributes["_mainScenePath"];
|
894
|
+
}
|
895
|
+
getMainViewSceneIndex() {
|
896
|
+
return this.attributes["_mainSceneIndex"];
|
897
|
+
}
|
898
|
+
getBoxState() {
|
899
|
+
return this.attributes[Fields.BoxState];
|
900
|
+
}
|
901
|
+
setMainViewScenePath(scenePath) {
|
902
|
+
this.context.safeSetAttributes({ _mainScenePath: scenePath });
|
903
|
+
}
|
904
|
+
setMainViewSceneIndex(index) {
|
905
|
+
this.context.safeSetAttributes({ _mainSceneIndex: index });
|
906
|
+
}
|
907
|
+
getMainViewCamera() {
|
908
|
+
return get(this.attributes, [Fields.MainViewCamera]);
|
909
|
+
}
|
910
|
+
getMainViewSize() {
|
911
|
+
return get(this.attributes, [Fields.MainViewSize]);
|
912
|
+
}
|
913
|
+
setMainViewCamera(camera) {
|
914
|
+
this.context.safeSetAttributes({ [Fields.MainViewCamera]: __spreadValues({}, camera) });
|
915
|
+
}
|
916
|
+
setMainViewSize(size2) {
|
917
|
+
this.context.safeSetAttributes({ [Fields.MainViewSize]: __spreadValues({}, size2) });
|
918
|
+
}
|
919
|
+
setAppFocus(appId, focus) {
|
920
|
+
if (focus) {
|
921
|
+
this.context.safeSetAttributes({ [Fields.Focus]: appId });
|
922
|
+
} else {
|
923
|
+
this.context.safeSetAttributes({ [Fields.Focus]: void 0 });
|
924
|
+
}
|
925
|
+
}
|
926
|
+
updateCursor(uid, position) {
|
927
|
+
if (!get(this.attributes, [Fields.Cursors])) {
|
928
|
+
this.context.safeUpdateAttributes([Fields.Cursors], {});
|
929
|
+
}
|
930
|
+
if (!get(this.attributes, [Fields.Cursors, uid])) {
|
931
|
+
this.context.safeUpdateAttributes([Fields.Cursors, uid], {});
|
932
|
+
}
|
933
|
+
this.context.safeUpdateAttributes([Fields.Cursors, uid, Fields.Position], position);
|
934
|
+
}
|
935
|
+
updateCursorState(uid, cursorState) {
|
936
|
+
if (!get(this.attributes, [Fields.Cursors, uid])) {
|
937
|
+
this.context.safeUpdateAttributes([Fields.Cursors, uid], {});
|
938
|
+
}
|
939
|
+
this.context.safeUpdateAttributes([Fields.Cursors, uid, Fields.CursorState], cursorState);
|
940
|
+
}
|
941
|
+
getCursorState(uid) {
|
942
|
+
return get(this.attributes, [Fields.Cursors, uid, Fields.CursorState]);
|
943
|
+
}
|
944
|
+
cleanCursor(uid) {
|
945
|
+
this.context.safeUpdateAttributes([Fields.Cursors, uid], void 0);
|
946
|
+
}
|
947
|
+
setMainViewFocusPath(mainView) {
|
948
|
+
const scenePath = this.getMainViewScenePath();
|
949
|
+
if (scenePath) {
|
950
|
+
setViewFocusScenePath(mainView, scenePath);
|
951
|
+
}
|
952
|
+
}
|
953
|
+
}
|
954
|
+
const store = new AttributesDelegate({
|
955
|
+
getAttributes: () => {
|
956
|
+
throw new Error("getAttributes not implemented");
|
957
|
+
},
|
958
|
+
safeSetAttributes: () => {
|
959
|
+
throw new Error("safeSetAttributes not implemented");
|
960
|
+
},
|
961
|
+
safeUpdateAttributes: () => {
|
962
|
+
throw new Error("safeUpdateAttributes not implemented");
|
963
|
+
}
|
964
|
+
});
|
965
|
+
const log = (...args) => {
|
966
|
+
if (WindowManager.debug) {
|
967
|
+
console.log(`[WindowManager]:`, ...args);
|
968
|
+
}
|
969
|
+
};
|
970
|
+
class Context {
|
971
|
+
constructor(manager) {
|
972
|
+
this.manager = manager;
|
973
|
+
this.findMember = (memberId) => {
|
974
|
+
var _a;
|
975
|
+
const roomMembers = (_a = this.manager.room) == null ? void 0 : _a.state.roomMembers;
|
976
|
+
return roomMembers == null ? void 0 : roomMembers.find((member) => member.memberId === memberId);
|
977
|
+
};
|
978
|
+
this.findMemberByUid = (uid) => {
|
979
|
+
var _a;
|
980
|
+
const roomMembers = (_a = this.manager.room) == null ? void 0 : _a.state.roomMembers;
|
981
|
+
return roomMembers == null ? void 0 : roomMembers.find((member) => {
|
982
|
+
var _a2;
|
983
|
+
return ((_a2 = member.payload) == null ? void 0 : _a2.uid) === uid;
|
984
|
+
});
|
985
|
+
};
|
986
|
+
this.observerId = manager.displayer.observerId;
|
987
|
+
emitter.on("observerIdChange", (id) => {
|
988
|
+
this.observerId = id;
|
989
|
+
});
|
990
|
+
}
|
991
|
+
get uid() {
|
992
|
+
var _a;
|
993
|
+
return ((_a = this.manager.room) == null ? void 0 : _a.uid) || "";
|
994
|
+
}
|
995
|
+
updateManagerRect() {
|
996
|
+
var _a;
|
997
|
+
(_a = this.manager.boxManager) == null ? void 0 : _a.updateManagerRect();
|
998
|
+
}
|
999
|
+
blurFocusBox() {
|
1000
|
+
var _a;
|
1001
|
+
(_a = this.manager.boxManager) == null ? void 0 : _a.blurAllBox();
|
1002
|
+
}
|
1003
|
+
}
|
1004
|
+
let context;
|
1005
|
+
const createContext = (manager) => {
|
1006
|
+
if (!context) {
|
1007
|
+
context = new Context(manager);
|
1008
|
+
}
|
1009
|
+
return context;
|
1010
|
+
};
|
1011
|
+
class Base {
|
1012
|
+
constructor(manager) {
|
1013
|
+
this.manager = manager;
|
1014
|
+
this.store = store;
|
1015
|
+
this.context = createContext(this.manager);
|
1016
|
+
}
|
1017
|
+
}
|
1018
|
+
class AppProxy extends Base {
|
1019
|
+
constructor(params, manager, appId, isAddApp) {
|
1020
|
+
super(manager);
|
1021
|
+
var _a;
|
1022
|
+
this.params = params;
|
1023
|
+
this.boxManager = this.manager.boxManager;
|
1024
|
+
this.appProxies = this.manager.appProxies;
|
1025
|
+
this.viewManager = this.manager.viewManager;
|
1026
|
+
this.status = "normal";
|
1027
|
+
this.getAppInitState = (id) => {
|
1028
|
+
var _a2, _b;
|
1029
|
+
const attrs = this.store.getAppState(id);
|
1030
|
+
if (!attrs)
|
1031
|
+
return;
|
1032
|
+
const position = attrs == null ? void 0 : attrs[AppAttributes.Position];
|
1033
|
+
const focus = this.store.focus;
|
1034
|
+
const size2 = attrs == null ? void 0 : attrs[AppAttributes.Size];
|
1035
|
+
const sceneIndex = attrs == null ? void 0 : attrs[AppAttributes.SceneIndex];
|
1036
|
+
const maximized = (_a2 = this.attributes) == null ? void 0 : _a2["maximized"];
|
1037
|
+
const minimized = (_b = this.attributes) == null ? void 0 : _b["minimized"];
|
1038
|
+
const zIndex = attrs == null ? void 0 : attrs.zIndex;
|
1039
|
+
let payload = { maximized, minimized, zIndex };
|
1040
|
+
if (position) {
|
1041
|
+
payload = __spreadProps(__spreadValues({}, payload), { id, x: position.x, y: position.y });
|
1042
|
+
}
|
1043
|
+
if (focus === id) {
|
1044
|
+
payload = __spreadProps(__spreadValues({}, payload), { focus: true });
|
1045
|
+
}
|
1046
|
+
if (size2) {
|
1047
|
+
payload = __spreadProps(__spreadValues({}, payload), { width: size2.width, height: size2.height });
|
1048
|
+
}
|
1049
|
+
if (sceneIndex) {
|
1050
|
+
payload = __spreadProps(__spreadValues({}, payload), { sceneIndex });
|
1051
|
+
}
|
1052
|
+
return payload;
|
1053
|
+
};
|
1054
|
+
this.appAttributesUpdateListener = (appId2) => {
|
1055
|
+
var _a2, _b, _c;
|
1056
|
+
(_a2 = this.manager.refresher) == null ? void 0 : _a2.add(appId2, () => {
|
1057
|
+
return autorun(() => {
|
1058
|
+
const attrs = this.manager.attributes[appId2];
|
1059
|
+
if (attrs) {
|
1060
|
+
this.appEmitter.emit("attributesUpdate", attrs);
|
1061
|
+
}
|
1062
|
+
});
|
1063
|
+
});
|
1064
|
+
(_b = this.manager.refresher) == null ? void 0 : _b.add(this.stateKey, () => {
|
1065
|
+
return autorun(() => {
|
1066
|
+
var _a3, _b2, _c2;
|
1067
|
+
const appState = (_a3 = this.appAttributes) == null ? void 0 : _a3.state;
|
1068
|
+
if ((appState == null ? void 0 : appState.zIndex) > 0 && appState.zIndex !== ((_b2 = this.box) == null ? void 0 : _b2.zIndex)) {
|
1069
|
+
(_c2 = this.boxManager) == null ? void 0 : _c2.setZIndex(appId2, appState.zIndex);
|
1070
|
+
}
|
1071
|
+
});
|
1072
|
+
});
|
1073
|
+
(_c = this.manager.refresher) == null ? void 0 : _c.add(`${appId2}-fullPath`, () => {
|
1074
|
+
return autorun(() => {
|
1075
|
+
var _a3;
|
1076
|
+
const fullPath = (_a3 = this.appAttributes) == null ? void 0 : _a3.fullPath;
|
1077
|
+
this.setFocusScenePathHandler(fullPath);
|
1078
|
+
});
|
1079
|
+
});
|
1080
|
+
};
|
1081
|
+
this.setFocusScenePathHandler = debounce((fullPath) => {
|
1082
|
+
var _a2;
|
1083
|
+
if (this.view && fullPath && fullPath !== ((_a2 = this.view) == null ? void 0 : _a2.focusScenePath)) {
|
1084
|
+
setViewFocusScenePath(this.view, fullPath);
|
1085
|
+
}
|
1086
|
+
}, 50);
|
1087
|
+
this.kind = params.kind;
|
1088
|
+
this.id = appId;
|
1089
|
+
this.stateKey = `${this.id}_state`;
|
1090
|
+
this.appProxies.set(this.id, this);
|
1091
|
+
this.appEmitter = new Emittery();
|
1092
|
+
this.appListener = this.makeAppEventListener(this.id);
|
1093
|
+
this.isAddApp = isAddApp;
|
1094
|
+
this.initScenes();
|
1095
|
+
if ((_a = this.params.options) == null ? void 0 : _a.scenePath) {
|
1096
|
+
this.createView();
|
1097
|
+
}
|
1098
|
+
}
|
1099
|
+
initScenes() {
|
1100
|
+
var _a;
|
1101
|
+
const options = this.params.options;
|
1102
|
+
if (options) {
|
1103
|
+
this.scenePath = options.scenePath;
|
1104
|
+
if (((_a = this.appAttributes) == null ? void 0 : _a.isDynamicPPT) && this.scenePath) {
|
1105
|
+
this.scenes = this.manager.displayer.entireScenes()[this.scenePath];
|
1106
|
+
} else {
|
1107
|
+
this.scenes = options.scenes;
|
1108
|
+
}
|
1109
|
+
}
|
1110
|
+
}
|
1111
|
+
get view() {
|
1112
|
+
return this.manager.viewManager.getView(this.id);
|
1113
|
+
}
|
1114
|
+
get isWritable() {
|
1115
|
+
var _a;
|
1116
|
+
return this.manager.canOperate && !((_a = this.box) == null ? void 0 : _a.readonly);
|
1117
|
+
}
|
1118
|
+
get attributes() {
|
1119
|
+
return this.manager.attributes[this.id];
|
1120
|
+
}
|
1121
|
+
get appAttributes() {
|
1122
|
+
return this.store.getAppAttributes(this.id);
|
1123
|
+
}
|
1124
|
+
getFullScenePath() {
|
1125
|
+
if (this.scenePath) {
|
1126
|
+
return get(this.appAttributes, [Fields.FullPath], this.getFullScenePathFromScenes());
|
1127
|
+
}
|
1128
|
+
}
|
1129
|
+
getFullScenePathFromScenes() {
|
1130
|
+
const sceneIndex = get(this.appAttributes, ["state", "SceneIndex"], 0);
|
1131
|
+
const fullPath = getScenePath(this.manager.room, this.scenePath, sceneIndex);
|
1132
|
+
if (fullPath) {
|
1133
|
+
this.setFullPath(fullPath);
|
1134
|
+
}
|
1135
|
+
return fullPath;
|
1136
|
+
}
|
1137
|
+
setFullPath(path) {
|
1138
|
+
this.manager.safeUpdateAttributes(["apps", this.id, Fields.FullPath], path);
|
1139
|
+
}
|
1140
|
+
async baseInsertApp(skipUpdate = false) {
|
1141
|
+
var _a;
|
1142
|
+
const params = this.params;
|
1143
|
+
if (!params.kind) {
|
1144
|
+
throw new Error("[WindowManager]: kind require");
|
1145
|
+
}
|
1146
|
+
const appImpl = await ((_a = appRegister.appClasses.get(params.kind)) == null ? void 0 : _a());
|
1147
|
+
const appParams = appRegister.registered.get(params.kind);
|
1148
|
+
if (appImpl) {
|
1149
|
+
await this.setupApp(this.id, skipUpdate, appImpl, params.options, appParams == null ? void 0 : appParams.appOptions);
|
1150
|
+
} else {
|
1151
|
+
throw new Error(`[WindowManager]: app load failed ${params.kind} ${params.src}`);
|
1152
|
+
}
|
1153
|
+
this.context.updateManagerRect();
|
1154
|
+
return {
|
1155
|
+
appId: this.id,
|
1156
|
+
app: appImpl
|
1157
|
+
};
|
1158
|
+
}
|
1159
|
+
focusApp() {
|
1160
|
+
this.focusBox();
|
1161
|
+
this.store.setMainViewFocusPath(this.manager.mainView);
|
1162
|
+
}
|
1163
|
+
get box() {
|
1164
|
+
var _a;
|
1165
|
+
return (_a = this.boxManager) == null ? void 0 : _a.getBox(this.id);
|
1166
|
+
}
|
1167
|
+
focusBox() {
|
1168
|
+
var _a;
|
1169
|
+
(_a = this.boxManager) == null ? void 0 : _a.focusBox({ appId: this.id });
|
1170
|
+
}
|
1171
|
+
async setupApp(appId, skipUpdate, app, options, appOptions) {
|
1172
|
+
var _a;
|
1173
|
+
log("setupApp", appId, app, options);
|
1174
|
+
if (!this.boxManager) {
|
1175
|
+
throw new BoxManagerNotFoundError();
|
1176
|
+
}
|
1177
|
+
const context2 = new AppContext(this.manager, this.boxManager, appId, this, appOptions);
|
1178
|
+
this.appContext = context2;
|
1179
|
+
try {
|
1180
|
+
emitter.once(`${appId}${Events.WindowCreated}`).then(async () => {
|
1181
|
+
var _a2;
|
1182
|
+
let boxInitState;
|
1183
|
+
if (!skipUpdate) {
|
1184
|
+
boxInitState = this.getAppInitState(appId);
|
1185
|
+
(_a2 = this.boxManager) == null ? void 0 : _a2.updateBoxState(boxInitState);
|
1186
|
+
}
|
1187
|
+
this.appEmitter.onAny(this.appListener);
|
1188
|
+
this.appAttributesUpdateListener(appId);
|
1189
|
+
this.setViewFocusScenePath();
|
1190
|
+
setTimeout(async () => {
|
1191
|
+
const result = await app.setup(context2);
|
1192
|
+
this.appResult = result;
|
1193
|
+
appRegister.notifyApp(app.kind, "created", { appId, result });
|
1194
|
+
this.afterSetupApp(boxInitState);
|
1195
|
+
this.fixMobileSize();
|
1196
|
+
}, 50);
|
1197
|
+
});
|
1198
|
+
(_a = this.boxManager) == null ? void 0 : _a.createBox({
|
1199
|
+
appId,
|
1200
|
+
app,
|
1201
|
+
options,
|
1202
|
+
canOperate: this.manager.canOperate,
|
1203
|
+
smartPosition: this.isAddApp
|
1204
|
+
});
|
1205
|
+
} catch (error) {
|
1206
|
+
console.error(error);
|
1207
|
+
throw new Error(`[WindowManager]: app setup error: ${error.message}`);
|
1208
|
+
}
|
1209
|
+
}
|
1210
|
+
fixMobileSize() {
|
1211
|
+
var _a, _b;
|
1212
|
+
const box = (_a = this.boxManager) == null ? void 0 : _a.getBox(this.id);
|
1213
|
+
if (box) {
|
1214
|
+
(_b = this.boxManager) == null ? void 0 : _b.resizeBox({
|
1215
|
+
appId: this.id,
|
1216
|
+
width: box.intrinsicWidth + 1e-3,
|
1217
|
+
height: box.intrinsicHeight + 1e-3,
|
1218
|
+
skipUpdate: true
|
1219
|
+
});
|
1220
|
+
}
|
1221
|
+
}
|
1222
|
+
afterSetupApp(boxInitState) {
|
1223
|
+
var _a;
|
1224
|
+
if (boxInitState) {
|
1225
|
+
if (!(boxInitState == null ? void 0 : boxInitState.x) || !boxInitState.y) {
|
1226
|
+
(_a = this.boxManager) == null ? void 0 : _a.setBoxInitState(this.id);
|
1227
|
+
}
|
1228
|
+
}
|
1229
|
+
}
|
1230
|
+
onSeek(time) {
|
1231
|
+
var _a;
|
1232
|
+
this.appEmitter.emit("seek", time);
|
1233
|
+
const boxInitState = this.getAppInitState(this.id);
|
1234
|
+
(_a = this.boxManager) == null ? void 0 : _a.updateBoxState(boxInitState);
|
1235
|
+
}
|
1236
|
+
async onReconnected() {
|
1237
|
+
var _a;
|
1238
|
+
this.appEmitter.emit("reconnected", void 0);
|
1239
|
+
const currentAppState = this.getAppInitState(this.id);
|
1240
|
+
await this.destroy(true, false, true);
|
1241
|
+
const params = this.params;
|
1242
|
+
const appProxy = new AppProxy(params, this.manager, this.id, this.isAddApp);
|
1243
|
+
await appProxy.baseInsertApp(true);
|
1244
|
+
(_a = this.boxManager) == null ? void 0 : _a.updateBoxState(currentAppState);
|
1245
|
+
}
|
1246
|
+
emitAppSceneStateChange(sceneState) {
|
1247
|
+
this.appEmitter.emit("sceneStateChange", sceneState);
|
1248
|
+
}
|
1249
|
+
emitAppIsWritableChange() {
|
1250
|
+
this.appEmitter.emit("writableChange", this.isWritable);
|
1251
|
+
}
|
1252
|
+
makeAppEventListener(appId) {
|
1253
|
+
return (eventName, data) => {
|
1254
|
+
var _a, _b, _c, _d;
|
1255
|
+
if (!this.manager.canOperate)
|
1256
|
+
return;
|
1257
|
+
switch (eventName) {
|
1258
|
+
case "setBoxSize": {
|
1259
|
+
(_a = this.boxManager) == null ? void 0 : _a.resizeBox({
|
1260
|
+
appId,
|
1261
|
+
width: data.width,
|
1262
|
+
height: data.height,
|
1263
|
+
skipUpdate: false
|
1264
|
+
});
|
1265
|
+
break;
|
1266
|
+
}
|
1267
|
+
case "setBoxMinSize": {
|
1268
|
+
(_b = this.boxManager) == null ? void 0 : _b.setBoxMinSize({
|
1269
|
+
appId,
|
1270
|
+
minWidth: data.minwidth,
|
1271
|
+
minHeight: data.minheight
|
1272
|
+
});
|
1273
|
+
break;
|
1274
|
+
}
|
1275
|
+
case "setBoxTitle": {
|
1276
|
+
(_c = this.boxManager) == null ? void 0 : _c.setBoxTitle({ appId, title: data.title });
|
1277
|
+
break;
|
1278
|
+
}
|
1279
|
+
case AppEvents.destroy: {
|
1280
|
+
if (this.status === "destroyed")
|
1281
|
+
return;
|
1282
|
+
this.destroy(true, false, true, data == null ? void 0 : data.error);
|
1283
|
+
if (data == null ? void 0 : data.error) {
|
1284
|
+
console.error(data == null ? void 0 : data.error);
|
1285
|
+
}
|
1286
|
+
break;
|
1287
|
+
}
|
1288
|
+
case "focus": {
|
1289
|
+
(_d = this.boxManager) == null ? void 0 : _d.focusBox({ appId: this.id });
|
1290
|
+
emitter.emit("focus", { appId: this.id });
|
1291
|
+
break;
|
1292
|
+
}
|
1293
|
+
}
|
1294
|
+
};
|
1295
|
+
}
|
1296
|
+
setScenePath() {
|
1297
|
+
if (!this.manager.canOperate)
|
1298
|
+
return;
|
1299
|
+
const fullScenePath = this.getFullScenePath();
|
1300
|
+
if (this.manager.room && fullScenePath && this.view) {
|
1301
|
+
setScenePath(this.manager.room, fullScenePath);
|
1302
|
+
}
|
1303
|
+
}
|
1304
|
+
setViewFocusScenePath() {
|
1305
|
+
const fullPath = this.getFullScenePath();
|
1306
|
+
if (fullPath && this.view) {
|
1307
|
+
setViewFocusScenePath(this.view, fullPath);
|
1308
|
+
}
|
1309
|
+
}
|
1310
|
+
async createView() {
|
1311
|
+
const view = await this.viewManager.createView(this.id);
|
1312
|
+
this.setViewFocusScenePath();
|
1313
|
+
return view;
|
1314
|
+
}
|
1315
|
+
async destroy(needCloseBox, cleanAttrs, skipUpdate, error) {
|
1316
|
+
var _a, _b, _c, _d;
|
1317
|
+
if (this.status === "destroyed")
|
1318
|
+
return;
|
1319
|
+
this.status = "destroyed";
|
1320
|
+
await appRegister.notifyApp(this.kind, "destroy", { appId: this.id });
|
1321
|
+
await this.appEmitter.emit("destroy", { error });
|
1322
|
+
this.appEmitter.clearListeners();
|
1323
|
+
emitter.emit(`destroy-${this.id}`, { error });
|
1324
|
+
if (needCloseBox) {
|
1325
|
+
(_a = this.boxManager) == null ? void 0 : _a.closeBox(this.id, skipUpdate);
|
1326
|
+
}
|
1327
|
+
if (cleanAttrs) {
|
1328
|
+
this.store.cleanAppAttributes(this.id);
|
1329
|
+
if (this.scenePath) {
|
1330
|
+
removeScenes(this.manager.room, this.scenePath);
|
1331
|
+
}
|
1332
|
+
}
|
1333
|
+
this.appProxies.delete(this.id);
|
1334
|
+
this.viewManager.destroyView(this.id);
|
1335
|
+
this.manager.appStatus.delete(this.id);
|
1336
|
+
(_b = this.manager.refresher) == null ? void 0 : _b.remove(this.id);
|
1337
|
+
(_c = this.manager.refresher) == null ? void 0 : _c.remove(this.stateKey);
|
1338
|
+
(_d = this.manager.refresher) == null ? void 0 : _d.remove(`${this.id}-fullPath`);
|
1339
|
+
}
|
1340
|
+
close() {
|
1341
|
+
return this.destroy(true, true, false);
|
1342
|
+
}
|
1343
|
+
}
|
1344
|
+
class ViewManager {
|
1345
|
+
constructor(displayer) {
|
1346
|
+
this.displayer = displayer;
|
1347
|
+
this.views = new Map();
|
1348
|
+
}
|
1349
|
+
createView(id) {
|
1350
|
+
const view = createView(this.displayer);
|
1351
|
+
this.views.set(id, view);
|
1352
|
+
return view;
|
1353
|
+
}
|
1354
|
+
getView(id) {
|
1355
|
+
return this.views.get(id);
|
1356
|
+
}
|
1357
|
+
destroyView(id) {
|
1358
|
+
const view = this.views.get(id);
|
1359
|
+
if (view) {
|
1360
|
+
view.release();
|
1361
|
+
this.views.delete(id);
|
1362
|
+
}
|
1363
|
+
}
|
1364
|
+
setViewScenePath(id, scenePath) {
|
1365
|
+
const view = this.views.get(id);
|
1366
|
+
if (view) {
|
1367
|
+
view.focusScenePath = scenePath;
|
1368
|
+
}
|
1369
|
+
}
|
1370
|
+
destroy() {
|
1371
|
+
this.views.forEach((view) => {
|
1372
|
+
view.release();
|
1373
|
+
});
|
1374
|
+
this.views.clear();
|
1375
|
+
}
|
1376
|
+
}
|
1377
|
+
const createView = (displayer) => {
|
1378
|
+
const view = displayer.views.createView();
|
1379
|
+
setDefaultCameraBound(view);
|
1380
|
+
return view;
|
1381
|
+
};
|
1382
|
+
const setDefaultCameraBound = (view) => {
|
1383
|
+
view.setCameraBound({
|
1384
|
+
maxContentMode: () => 10,
|
1385
|
+
minContentMode: () => 0.1
|
1386
|
+
});
|
1387
|
+
};
|
1388
|
+
class MainViewProxy extends Base {
|
1389
|
+
constructor(manager) {
|
1390
|
+
super(manager);
|
1391
|
+
this.started = false;
|
1392
|
+
this.mainViewIsAddListener = false;
|
1393
|
+
this.viewId = "mainView";
|
1394
|
+
this.sideEffectManager = new SideEffectManager();
|
1395
|
+
this.cameraReaction = () => {
|
1396
|
+
return reaction(() => this.mainViewCamera, (camera) => {
|
1397
|
+
if (camera && camera.id !== this.context.uid) {
|
1398
|
+
this.moveCameraToContian(this.mainViewSize);
|
1399
|
+
this.moveCamera(camera);
|
1400
|
+
}
|
1401
|
+
}, {
|
1402
|
+
fireImmediately: true
|
1403
|
+
});
|
1404
|
+
};
|
1405
|
+
this.sizeChangeHandler = debounce((size2) => {
|
1406
|
+
if (size2) {
|
1407
|
+
this.moveCameraToContian(size2);
|
1408
|
+
this.moveCamera(this.mainViewCamera);
|
1409
|
+
}
|
1410
|
+
}, 30);
|
1411
|
+
this.onCameraUpdatedByDevice = (camera) => {
|
1412
|
+
this.store.setMainViewCamera(__spreadProps(__spreadValues({}, camera), { id: this.context.uid }));
|
1413
|
+
if (!isEqual(this.mainViewSize, __spreadProps(__spreadValues({}, this.mainView.size), { id: this.context.uid }))) {
|
1414
|
+
this.setMainViewSize(this.view.size);
|
1415
|
+
}
|
1416
|
+
};
|
1417
|
+
this.mainViewClickListener = () => {
|
1418
|
+
this.mainViewClickHandler();
|
1419
|
+
};
|
1420
|
+
this.setMainViewSize = debounce((size2) => {
|
1421
|
+
this.store.setMainViewSize(__spreadProps(__spreadValues({}, size2), { id: this.context.uid }));
|
1422
|
+
}, 50);
|
1423
|
+
this.onCameraOrSizeUpdated = () => {
|
1424
|
+
callbacks.emit("cameraStateChange", this.cameraState);
|
1425
|
+
};
|
1426
|
+
this.mainView = this.createMainView();
|
1427
|
+
this.moveCameraSizeByAttributes();
|
1428
|
+
emitter.once("mainViewMounted").then(() => {
|
1429
|
+
this.addMainViewListener();
|
1430
|
+
setTimeout(() => {
|
1431
|
+
this.start();
|
1432
|
+
if (!this.mainViewCamera || !this.mainViewSize) {
|
1433
|
+
this.setCameraAndSize();
|
1434
|
+
}
|
1435
|
+
}, 200);
|
1436
|
+
});
|
1437
|
+
const playgroundSizeChangeListener = () => {
|
1438
|
+
this.sizeChangeHandler(this.mainViewSize);
|
1439
|
+
};
|
1440
|
+
this.sideEffectManager.add(() => {
|
1441
|
+
emitter.on("playgroundSizeChange", playgroundSizeChangeListener);
|
1442
|
+
return () => emitter.off("playgroundSizeChange", playgroundSizeChangeListener);
|
1443
|
+
});
|
1444
|
+
}
|
1445
|
+
get mainViewCamera() {
|
1446
|
+
return this.store.getMainViewCamera();
|
1447
|
+
}
|
1448
|
+
get mainViewSize() {
|
1449
|
+
return this.store.getMainViewSize();
|
1450
|
+
}
|
1451
|
+
moveCameraSizeByAttributes() {
|
1452
|
+
this.moveCameraToContian(this.mainViewSize);
|
1453
|
+
this.moveCamera(this.mainViewCamera);
|
1454
|
+
}
|
1455
|
+
start() {
|
1456
|
+
var _a;
|
1457
|
+
if (this.started)
|
1458
|
+
return;
|
1459
|
+
this.sizeChangeHandler(this.mainViewSize);
|
1460
|
+
this.addCameraListener();
|
1461
|
+
(_a = this.manager.refresher) == null ? void 0 : _a.add(Fields.MainViewCamera, this.cameraReaction);
|
1462
|
+
this.started = true;
|
1463
|
+
}
|
1464
|
+
setCameraAndSize() {
|
1465
|
+
this.store.setMainViewCamera(__spreadProps(__spreadValues({}, this.mainView.camera), { id: this.context.uid }));
|
1466
|
+
this.store.setMainViewSize(__spreadProps(__spreadValues({}, this.mainView.size), { id: this.context.uid }));
|
1467
|
+
}
|
1468
|
+
get view() {
|
1469
|
+
return this.mainView;
|
1470
|
+
}
|
1471
|
+
get cameraState() {
|
1472
|
+
return __spreadValues(__spreadValues({}, this.view.camera), this.view.size);
|
1473
|
+
}
|
1474
|
+
createMainView() {
|
1475
|
+
const mainView = createView(this.manager.displayer);
|
1476
|
+
const mainViewScenePath = this.store.getMainViewScenePath();
|
1477
|
+
if (mainViewScenePath) {
|
1478
|
+
setViewFocusScenePath(mainView, mainViewScenePath);
|
1479
|
+
}
|
1480
|
+
return mainView;
|
1481
|
+
}
|
1482
|
+
addMainViewListener() {
|
1483
|
+
if (this.mainViewIsAddListener)
|
1484
|
+
return;
|
1485
|
+
if (this.view.divElement) {
|
1486
|
+
this.view.divElement.addEventListener("click", this.mainViewClickListener);
|
1487
|
+
this.view.divElement.addEventListener("touchend", this.mainViewClickListener);
|
1488
|
+
this.mainViewIsAddListener = true;
|
1489
|
+
}
|
1490
|
+
}
|
1491
|
+
removeMainViewListener() {
|
1492
|
+
if (this.view.divElement) {
|
1493
|
+
this.view.divElement.removeEventListener("click", this.mainViewClickListener);
|
1494
|
+
this.view.divElement.removeEventListener("touchend", this.mainViewClickListener);
|
1495
|
+
}
|
1496
|
+
}
|
1497
|
+
async mainViewClickHandler() {
|
1498
|
+
if (!this.manager.canOperate)
|
1499
|
+
return;
|
1500
|
+
this.store.cleanFocus();
|
1501
|
+
this.context.blurFocusBox();
|
1502
|
+
}
|
1503
|
+
addCameraListener() {
|
1504
|
+
this.view.callbacks.on("onCameraUpdatedByDevice", this.onCameraUpdatedByDevice);
|
1505
|
+
this.view.callbacks.on("onCameraUpdated", this.onCameraOrSizeUpdated);
|
1506
|
+
this.view.callbacks.on("onSizeUpdated", this.onCameraOrSizeUpdated);
|
1507
|
+
}
|
1508
|
+
removeCameraListener() {
|
1509
|
+
this.view.callbacks.off("onCameraUpdatedByDevice", this.onCameraUpdatedByDevice);
|
1510
|
+
this.view.callbacks.off("onCameraUpdated", this.onCameraOrSizeUpdated);
|
1511
|
+
this.view.callbacks.off("onSizeUpdated", this.onCameraOrSizeUpdated);
|
1512
|
+
}
|
1513
|
+
moveCameraToContian(size2) {
|
1514
|
+
if (!isEmpty(size2)) {
|
1515
|
+
this.view.moveCameraToContain({
|
1516
|
+
width: size2.width,
|
1517
|
+
height: size2.height,
|
1518
|
+
originX: -size2.width / 2,
|
1519
|
+
originY: -size2.height / 2,
|
1520
|
+
animationMode: AnimationMode.Immediately
|
1521
|
+
});
|
1522
|
+
this.scale = this.view.camera.scale;
|
1523
|
+
}
|
1524
|
+
}
|
1525
|
+
moveCamera(camera) {
|
1526
|
+
if (!isEmpty(camera)) {
|
1527
|
+
if (isEqual(camera, this.view.camera))
|
1528
|
+
return;
|
1529
|
+
const { centerX, centerY, scale } = camera;
|
1530
|
+
const needScale = scale * (this.scale || 1);
|
1531
|
+
this.view.moveCamera({
|
1532
|
+
centerX,
|
1533
|
+
centerY,
|
1534
|
+
scale: needScale,
|
1535
|
+
animationMode: AnimationMode.Immediately
|
1536
|
+
});
|
1537
|
+
}
|
1538
|
+
}
|
1539
|
+
stop() {
|
1540
|
+
var _a, _b;
|
1541
|
+
this.removeMainViewListener();
|
1542
|
+
this.removeCameraListener();
|
1543
|
+
(_a = this.manager.refresher) == null ? void 0 : _a.remove(Fields.MainViewCamera);
|
1544
|
+
(_b = this.manager.refresher) == null ? void 0 : _b.remove(Fields.MainViewSize);
|
1545
|
+
this.started = false;
|
1546
|
+
}
|
1547
|
+
destroy() {
|
1548
|
+
this.stop();
|
1549
|
+
this.sideEffectManager.flushAll();
|
1550
|
+
}
|
1551
|
+
}
|
1552
|
+
class AppManager {
|
1553
|
+
constructor(windowManger) {
|
1554
|
+
this.windowManger = windowManger;
|
1555
|
+
this.appProxies = new Map();
|
1556
|
+
this.appStatus = new Map();
|
1557
|
+
this.store = store;
|
1558
|
+
this.isReplay = this.windowManger.isReplay;
|
1559
|
+
this.onAppDelete = (apps) => {
|
1560
|
+
const ids = Object.keys(apps);
|
1561
|
+
this.appProxies.forEach((appProxy, id) => {
|
1562
|
+
if (!ids.includes(id)) {
|
1563
|
+
appProxy.destroy(true, false, true);
|
1564
|
+
}
|
1565
|
+
});
|
1566
|
+
};
|
1567
|
+
this.displayerStateListener = (state) => {
|
1568
|
+
var _a, _b;
|
1569
|
+
const sceneState = state.sceneState;
|
1570
|
+
if (sceneState) {
|
1571
|
+
const scenePath = sceneState.scenePath;
|
1572
|
+
this.appProxies.forEach((appProxy) => {
|
1573
|
+
if (appProxy.scenePath && scenePath.startsWith(appProxy.scenePath)) {
|
1574
|
+
appProxy.emitAppSceneStateChange(sceneState);
|
1575
|
+
appProxy.setFullPath(scenePath);
|
1576
|
+
}
|
1577
|
+
});
|
1578
|
+
}
|
1579
|
+
if (state.roomMembers) {
|
1580
|
+
(_a = this.windowManger.cursorManager) == null ? void 0 : _a.setRoomMembers(state.roomMembers);
|
1581
|
+
(_b = this.windowManger.cursorManager) == null ? void 0 : _b.cleanMemberAttributes(state.roomMembers);
|
1582
|
+
}
|
1583
|
+
this.appProxies.forEach((appProxy) => {
|
1584
|
+
appProxy.appEmitter.emit("roomStateChange", state);
|
1585
|
+
});
|
1586
|
+
emitter.emit("observerIdChange", this.displayer.observerId);
|
1587
|
+
};
|
1588
|
+
this.displayerWritableListener = (isReadonly) => {
|
1589
|
+
var _a, _b;
|
1590
|
+
const isWritable = !isReadonly;
|
1591
|
+
const isManualWritable = this.windowManger.readonly === void 0 || this.windowManger.readonly === false;
|
1592
|
+
if (this.windowManger.readonly === void 0) {
|
1593
|
+
(_a = this.boxManager) == null ? void 0 : _a.setReadonly(isReadonly);
|
1594
|
+
} else {
|
1595
|
+
(_b = this.boxManager) == null ? void 0 : _b.setReadonly(!(isWritable && isManualWritable));
|
1596
|
+
}
|
1597
|
+
this.appProxies.forEach((appProxy) => {
|
1598
|
+
appProxy.emitAppIsWritableChange();
|
1599
|
+
});
|
1600
|
+
if (isWritable === true) {
|
1601
|
+
this.mainView.disableCameraTransform = false;
|
1602
|
+
if (this.room && this.room.disableSerialization === true) {
|
1603
|
+
this.room.disableSerialization = false;
|
1604
|
+
}
|
1605
|
+
} else {
|
1606
|
+
this.mainView.disableCameraTransform = true;
|
1607
|
+
}
|
1608
|
+
};
|
1609
|
+
this.updateSceneIndex = () => {
|
1610
|
+
const scenePath = this.store.getMainViewScenePath();
|
1611
|
+
const sceneDir = parseSceneDir(scenePath);
|
1612
|
+
const scenes = entireScenes(this.displayer)[sceneDir];
|
1613
|
+
if (scenes.length) {
|
1614
|
+
const pageName = scenePath.replace(sceneDir, "").replace("/", "");
|
1615
|
+
const index = scenes.findIndex((scene) => scene.name === pageName);
|
1616
|
+
if (isInteger(index) && index >= 0) {
|
1617
|
+
this.safeSetAttributes({ _mainSceneIndex: index });
|
1618
|
+
}
|
1619
|
+
}
|
1620
|
+
};
|
1621
|
+
this.boxEventListener = (eventName, payload) => {
|
1622
|
+
switch (eventName) {
|
1623
|
+
case "move": {
|
1624
|
+
this.dispatchInternalEvent(Events.AppMove, payload);
|
1625
|
+
this.store.updateAppState(payload.appId, AppAttributes.Position, {
|
1626
|
+
x: payload.x,
|
1627
|
+
y: payload.y
|
1628
|
+
});
|
1629
|
+
break;
|
1630
|
+
}
|
1631
|
+
case "focus": {
|
1632
|
+
this.windowManger.safeSetAttributes({ focus: payload.appId });
|
1633
|
+
break;
|
1634
|
+
}
|
1635
|
+
case "resize": {
|
1636
|
+
if (payload.width && payload.height) {
|
1637
|
+
this.dispatchInternalEvent(Events.AppResize, payload);
|
1638
|
+
this.store.updateAppState(payload.appId, AppAttributes.Size, {
|
1639
|
+
width: payload.width,
|
1640
|
+
height: payload.height
|
1641
|
+
});
|
1642
|
+
}
|
1643
|
+
break;
|
1644
|
+
}
|
1645
|
+
case "close": {
|
1646
|
+
const appProxy = this.appProxies.get(payload.appId);
|
1647
|
+
if (appProxy) {
|
1648
|
+
appProxy.destroy(false, true, payload.error);
|
1649
|
+
}
|
1650
|
+
break;
|
1651
|
+
}
|
1652
|
+
case "boxStateChange": {
|
1653
|
+
this.dispatchInternalEvent(Events.AppBoxStateChange, payload);
|
1654
|
+
break;
|
1655
|
+
}
|
1656
|
+
}
|
1657
|
+
};
|
1658
|
+
this.displayer = windowManger.displayer;
|
1659
|
+
this.store.setContext({
|
1660
|
+
getAttributes: () => this.attributes,
|
1661
|
+
safeSetAttributes: (attributes) => this.safeSetAttributes(attributes),
|
1662
|
+
safeUpdateAttributes: (keys, val) => this.safeUpdateAttributes(keys, val)
|
1663
|
+
});
|
1664
|
+
this.mainViewProxy = new MainViewProxy(this);
|
1665
|
+
this.viewManager = new ViewManager(this.displayer);
|
1666
|
+
this.appListeners = new AppListeners(this);
|
1667
|
+
this.displayer.callbacks.on(this.eventName, this.displayerStateListener);
|
1668
|
+
this.appListeners.addListeners();
|
1669
|
+
this.refresher = reconnectRefresher;
|
1670
|
+
this.refresher.setRoom(this.room);
|
1671
|
+
this.refresher.setContext({ emitter });
|
1672
|
+
emitter.once("onCreated").then(() => this.onCreated());
|
1673
|
+
emitter.on("onReconnected", () => this.onReconnected());
|
1674
|
+
if (isPlayer(this.displayer)) {
|
1675
|
+
emitter.on("seek", (time) => {
|
1676
|
+
this.appProxies.forEach((appProxy) => {
|
1677
|
+
appProxy.onSeek(time);
|
1678
|
+
});
|
1679
|
+
this.attributesUpdateCallback(this.attributes.apps);
|
1680
|
+
this.onAppDelete(this.attributes.apps);
|
1681
|
+
});
|
1682
|
+
}
|
1683
|
+
}
|
1684
|
+
async onCreated() {
|
1685
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
1686
|
+
await this.attributesUpdateCallback(this.attributes.apps);
|
1687
|
+
(_a = this.boxManager) == null ? void 0 : _a.updateManagerRect();
|
1688
|
+
emitter.onAny(this.boxEventListener);
|
1689
|
+
(_b = this.refresher) == null ? void 0 : _b.add("apps", () => {
|
1690
|
+
return safeListenPropsUpdated(() => this.attributes.apps, () => {
|
1691
|
+
this.attributesUpdateCallback(this.attributes.apps);
|
1692
|
+
});
|
1693
|
+
});
|
1694
|
+
(_c = this.refresher) == null ? void 0 : _c.add("appsClose", () => {
|
1695
|
+
return onObjectRemoved(this.attributes.apps, () => {
|
1696
|
+
this.onAppDelete(this.attributes.apps);
|
1697
|
+
});
|
1698
|
+
});
|
1699
|
+
(_d = this.refresher) == null ? void 0 : _d.add("maximized", () => {
|
1700
|
+
return autorun(() => {
|
1701
|
+
var _a2;
|
1702
|
+
const maximized = this.attributes.maximized;
|
1703
|
+
(_a2 = this.boxManager) == null ? void 0 : _a2.setMaximized(Boolean(maximized));
|
1704
|
+
});
|
1705
|
+
});
|
1706
|
+
(_e = this.refresher) == null ? void 0 : _e.add("minimized", () => {
|
1707
|
+
return autorun(() => {
|
1708
|
+
var _a2, _b2;
|
1709
|
+
const minimized = this.attributes.minimized;
|
1710
|
+
if (((_a2 = this.boxManager) == null ? void 0 : _a2.minimized) !== minimized) {
|
1711
|
+
if (minimized === true) {
|
1712
|
+
(_b2 = this.boxManager) == null ? void 0 : _b2.blurAllBox();
|
1713
|
+
}
|
1714
|
+
setTimeout(() => {
|
1715
|
+
var _a3;
|
1716
|
+
(_a3 = this.boxManager) == null ? void 0 : _a3.setMinimized(Boolean(minimized));
|
1717
|
+
}, 0);
|
1718
|
+
}
|
1719
|
+
});
|
1720
|
+
});
|
1721
|
+
(_f = this.refresher) == null ? void 0 : _f.add("mainViewIndex", () => {
|
1722
|
+
return autorun(() => {
|
1723
|
+
const mainSceneIndex = get(this.attributes, "_mainSceneIndex");
|
1724
|
+
if (mainSceneIndex !== void 0 && this._prevSceneIndex !== mainSceneIndex) {
|
1725
|
+
callbacks.emit("mainViewSceneIndexChange", mainSceneIndex);
|
1726
|
+
this._prevSceneIndex = mainSceneIndex;
|
1727
|
+
}
|
1728
|
+
});
|
1729
|
+
});
|
1730
|
+
(_g = this.refresher) == null ? void 0 : _g.add("focusedChange", () => {
|
1731
|
+
return autorun(() => {
|
1732
|
+
const focused = get(this.attributes, "focus");
|
1733
|
+
if (this._prevFocused !== focused) {
|
1734
|
+
callbacks.emit("focusedChange", focused);
|
1735
|
+
this._prevFocused = focused;
|
1736
|
+
}
|
1737
|
+
});
|
1738
|
+
});
|
1739
|
+
if (!this.attributes.apps || Object.keys(this.attributes.apps).length === 0) {
|
1740
|
+
const mainScenePath = this.store.getMainViewScenePath();
|
1741
|
+
if (!mainScenePath)
|
1742
|
+
return;
|
1743
|
+
const sceneState = this.displayer.state.sceneState;
|
1744
|
+
if (sceneState.scenePath !== mainScenePath) {
|
1745
|
+
setScenePath(this.room, mainScenePath);
|
1746
|
+
}
|
1747
|
+
}
|
1748
|
+
this.displayerWritableListener(!((_h = this.room) == null ? void 0 : _h.isWritable));
|
1749
|
+
this.displayer.callbacks.on("onEnableWriteNowChanged", this.displayerWritableListener);
|
1750
|
+
this._prevFocused = this.attributes.focus;
|
1751
|
+
}
|
1752
|
+
async attributesUpdateCallback(apps) {
|
1753
|
+
if (apps && WindowManager.container) {
|
1754
|
+
const appIds = Object.keys(apps);
|
1755
|
+
const appsWithCreatedAt = appIds.map((appId) => {
|
1756
|
+
return {
|
1757
|
+
id: appId,
|
1758
|
+
createdAt: apps[appId].createdAt
|
1759
|
+
};
|
1760
|
+
});
|
1761
|
+
for (const { id } of sortBy(appsWithCreatedAt, "createdAt")) {
|
1762
|
+
if (!this.appProxies.has(id) && !this.appStatus.has(id)) {
|
1763
|
+
const app = apps[id];
|
1764
|
+
pRetry(async () => {
|
1765
|
+
this.appStatus.set(id, AppStatus.StartCreate);
|
1766
|
+
const appAttributes = this.attributes[id];
|
1767
|
+
if (!appAttributes) {
|
1768
|
+
throw new Error("appAttributes is undefined");
|
1769
|
+
}
|
1770
|
+
await this.baseInsertApp({
|
1771
|
+
kind: app.kind,
|
1772
|
+
options: app.options,
|
1773
|
+
isDynamicPPT: app.isDynamicPPT
|
1774
|
+
}, id, false);
|
1775
|
+
this.focusByAttributes(apps);
|
1776
|
+
}, { retries: 3 }).catch((err) => {
|
1777
|
+
console.warn(`[WindowManager]: Insert App Error`, err);
|
1778
|
+
this.appStatus.delete(id);
|
1779
|
+
});
|
1780
|
+
}
|
1781
|
+
}
|
1782
|
+
}
|
1783
|
+
}
|
1784
|
+
refresh() {
|
1785
|
+
this.attributesUpdateCallback(this.attributes.apps);
|
1786
|
+
}
|
1787
|
+
setBoxManager(boxManager) {
|
1788
|
+
this.boxManager = boxManager;
|
1789
|
+
}
|
1790
|
+
resetMaximized() {
|
1791
|
+
var _a;
|
1792
|
+
(_a = this.boxManager) == null ? void 0 : _a.setMaximized(Boolean(this.store.getMaximized()));
|
1793
|
+
}
|
1794
|
+
resetMinimized() {
|
1795
|
+
var _a;
|
1796
|
+
(_a = this.boxManager) == null ? void 0 : _a.setMinimized(Boolean(this.store.getMinimized()));
|
1797
|
+
}
|
1798
|
+
bindMainView(divElement, disableCameraTransform) {
|
1799
|
+
const mainView = this.mainViewProxy.view;
|
1800
|
+
mainView.disableCameraTransform = disableCameraTransform;
|
1801
|
+
mainView.divElement = divElement;
|
1802
|
+
if (!mainView.focusScenePath) {
|
1803
|
+
this.setMainViewFocusPath();
|
1804
|
+
}
|
1805
|
+
emitter.emit("mainViewMounted");
|
1806
|
+
}
|
1807
|
+
setMainViewFocusPath(scenePath) {
|
1808
|
+
const focusScenePath = scenePath || this.store.getMainViewScenePath();
|
1809
|
+
if (focusScenePath) {
|
1810
|
+
const view = setViewFocusScenePath(this.mainView, focusScenePath);
|
1811
|
+
return (view == null ? void 0 : view.focusScenePath) === focusScenePath;
|
1812
|
+
}
|
1813
|
+
}
|
1814
|
+
async addApp(params, isDynamicPPT) {
|
1815
|
+
log("addApp", params);
|
1816
|
+
const { appId, needFocus } = await this.beforeAddApp(params, isDynamicPPT);
|
1817
|
+
const appProxy = await this.baseInsertApp(params, appId, true, needFocus);
|
1818
|
+
this.afterAddApp(appProxy);
|
1819
|
+
return appProxy == null ? void 0 : appProxy.id;
|
1820
|
+
}
|
1821
|
+
async beforeAddApp(params, isDynamicPPT) {
|
1822
|
+
var _a, _b;
|
1823
|
+
const appId = await genAppId(params.kind);
|
1824
|
+
this.appStatus.set(appId, AppStatus.StartCreate);
|
1825
|
+
const attrs = (_a = params.attributes) != null ? _a : {};
|
1826
|
+
this.safeUpdateAttributes([appId], attrs);
|
1827
|
+
this.store.setupAppAttributes(params, appId, isDynamicPPT);
|
1828
|
+
const needFocus = !((_b = this.boxManager) == null ? void 0 : _b.minimized);
|
1829
|
+
if (needFocus) {
|
1830
|
+
this.store.setAppFocus(appId, true);
|
1831
|
+
}
|
1832
|
+
return { appId, needFocus };
|
1833
|
+
}
|
1834
|
+
afterAddApp(appProxy) {
|
1835
|
+
var _a, _b;
|
1836
|
+
if (appProxy && appProxy.box) {
|
1837
|
+
const box = appProxy.box;
|
1838
|
+
emitter.emit("move", {
|
1839
|
+
appId: appProxy.id,
|
1840
|
+
x: box == null ? void 0 : box.intrinsicX,
|
1841
|
+
y: box == null ? void 0 : box.intrinsicY
|
1842
|
+
});
|
1843
|
+
this.store.updateAppState(appProxy.id, AppAttributes.ZIndex, box.zIndex);
|
1844
|
+
}
|
1845
|
+
if ((_a = this.boxManager) == null ? void 0 : _a.minimized) {
|
1846
|
+
(_b = this.boxManager) == null ? void 0 : _b.setMinimized(false, false);
|
1847
|
+
}
|
1848
|
+
}
|
1849
|
+
async closeApp(appId) {
|
1850
|
+
const appProxy = this.appProxies.get(appId);
|
1851
|
+
if (appProxy) {
|
1852
|
+
appProxy.destroy(true, true, false);
|
1853
|
+
}
|
1854
|
+
}
|
1855
|
+
async baseInsertApp(params, appId, isAddApp, focus) {
|
1856
|
+
if (this.appProxies.has(appId)) {
|
1857
|
+
console.warn("[WindowManager]: app duplicate exists and cannot be created again");
|
1858
|
+
return;
|
1859
|
+
}
|
1860
|
+
const appProxy = new AppProxy(params, this, appId, isAddApp);
|
1861
|
+
if (appProxy) {
|
1862
|
+
await appProxy.baseInsertApp(focus);
|
1863
|
+
this.appStatus.delete(appId);
|
1864
|
+
return appProxy;
|
1865
|
+
} else {
|
1866
|
+
this.appStatus.delete(appId);
|
1867
|
+
throw new Error("[WindowManger]: initialize AppProxy failed");
|
1868
|
+
}
|
1869
|
+
}
|
1870
|
+
get eventName() {
|
1871
|
+
return isRoom(this.displayer) ? "onRoomStateChanged" : "onPlayerStateChanged";
|
1872
|
+
}
|
1873
|
+
get attributes() {
|
1874
|
+
return this.windowManger.attributes;
|
1875
|
+
}
|
1876
|
+
get canOperate() {
|
1877
|
+
return this.windowManger.canOperate;
|
1878
|
+
}
|
1879
|
+
get room() {
|
1880
|
+
return isRoom(this.displayer) ? this.displayer : void 0;
|
1881
|
+
}
|
1882
|
+
get mainView() {
|
1883
|
+
return this.mainViewProxy.view;
|
1884
|
+
}
|
1885
|
+
get focusApp() {
|
1886
|
+
if (this.store.focus) {
|
1887
|
+
return this.appProxies.get(this.store.focus);
|
1888
|
+
}
|
1889
|
+
}
|
1890
|
+
safeSetAttributes(attributes) {
|
1891
|
+
this.windowManger.safeSetAttributes(attributes);
|
1892
|
+
}
|
1893
|
+
safeUpdateAttributes(keys, value) {
|
1894
|
+
this.windowManger.safeUpdateAttributes(keys, value);
|
1895
|
+
}
|
1896
|
+
async setMainViewScenePath(scenePath) {
|
1897
|
+
if (this.room) {
|
1898
|
+
const scenePathType = this.displayer.scenePathType(scenePath);
|
1899
|
+
if (scenePathType === ScenePathType.None) {
|
1900
|
+
throw new Error(`[WindowManager]: ${scenePath} not valid scene`);
|
1901
|
+
} else if (scenePathType === ScenePathType.Page) {
|
1902
|
+
await this._setMainViewScenePath(scenePath);
|
1903
|
+
} else if (scenePathType === ScenePathType.Dir) {
|
1904
|
+
const validScenePath = makeValidScenePath(this.displayer, scenePath);
|
1905
|
+
if (validScenePath) {
|
1906
|
+
await this._setMainViewScenePath(validScenePath);
|
1907
|
+
}
|
1908
|
+
}
|
1909
|
+
}
|
1910
|
+
}
|
1911
|
+
async _setMainViewScenePath(scenePath) {
|
1912
|
+
const success = this.setMainViewFocusPath(scenePath);
|
1913
|
+
if (success) {
|
1914
|
+
this.safeSetAttributes({ _mainScenePath: scenePath });
|
1915
|
+
this.store.setMainViewFocusPath(this.mainView);
|
1916
|
+
this.updateSceneIndex();
|
1917
|
+
this.dispatchInternalEvent(Events.SetMainViewScenePath, { nextScenePath: scenePath });
|
1918
|
+
}
|
1919
|
+
}
|
1920
|
+
async setMainViewSceneIndex(index) {
|
1921
|
+
if (this.room) {
|
1922
|
+
if (this.store.getMainViewSceneIndex() === index)
|
1923
|
+
return;
|
1924
|
+
const mainViewScenePath = this.store.getMainViewScenePath();
|
1925
|
+
if (mainViewScenePath) {
|
1926
|
+
const sceneDir = parseSceneDir(mainViewScenePath);
|
1927
|
+
const scenePath = makeValidScenePath(this.displayer, sceneDir, index);
|
1928
|
+
if (scenePath) {
|
1929
|
+
const success = this.setMainViewFocusPath(scenePath);
|
1930
|
+
if (success) {
|
1931
|
+
this.store.setMainViewScenePath(scenePath);
|
1932
|
+
this.safeSetAttributes({ _mainSceneIndex: index });
|
1933
|
+
}
|
1934
|
+
} else {
|
1935
|
+
throw new Error(`[WindowManager]: ${sceneDir}: ${index} not valid index`);
|
1936
|
+
}
|
1937
|
+
}
|
1938
|
+
}
|
1939
|
+
}
|
1940
|
+
getAppInitPath(appId) {
|
1941
|
+
var _a;
|
1942
|
+
const attrs = this.store.getAppAttributes(appId);
|
1943
|
+
if (attrs) {
|
1944
|
+
return (_a = attrs == null ? void 0 : attrs.options) == null ? void 0 : _a.scenePath;
|
1945
|
+
}
|
1946
|
+
}
|
1947
|
+
safeDispatchMagixEvent(event, payload) {
|
1948
|
+
if (this.canOperate) {
|
1949
|
+
this.displayer.dispatchMagixEvent(event, payload);
|
1950
|
+
}
|
1951
|
+
}
|
1952
|
+
focusByAttributes(apps) {
|
1953
|
+
var _a;
|
1954
|
+
if (apps && Object.keys(apps).length === ((_a = this.boxManager) == null ? void 0 : _a.boxSize)) {
|
1955
|
+
const focusAppId = this.store.focus;
|
1956
|
+
if (focusAppId) {
|
1957
|
+
this.boxManager.focusBox({ appId: focusAppId });
|
1958
|
+
}
|
1959
|
+
}
|
1960
|
+
}
|
1961
|
+
async onReconnected() {
|
1962
|
+
const appProxies = Array.from(this.appProxies.values());
|
1963
|
+
const reconnected = appProxies.map((appProxy) => {
|
1964
|
+
return appProxy.onReconnected();
|
1965
|
+
});
|
1966
|
+
await Promise.all(reconnected);
|
1967
|
+
}
|
1968
|
+
notifyContainerRectUpdate(rect) {
|
1969
|
+
this.appProxies.forEach((appProxy) => {
|
1970
|
+
appProxy.appEmitter.emit("containerRectUpdate", rect);
|
1971
|
+
});
|
1972
|
+
}
|
1973
|
+
dispatchInternalEvent(event, payload) {
|
1974
|
+
this.safeDispatchMagixEvent(MagixEventName, {
|
1975
|
+
eventName: event,
|
1976
|
+
payload
|
1977
|
+
});
|
1978
|
+
}
|
1979
|
+
destroy() {
|
1980
|
+
var _a, _b;
|
1981
|
+
this.displayer.callbacks.off(this.eventName, this.displayerStateListener);
|
1982
|
+
this.displayer.callbacks.off("onEnableWriteNowChanged", this.displayerWritableListener);
|
1983
|
+
this.appListeners.removeListeners();
|
1984
|
+
emitter.offAny(this.boxEventListener);
|
1985
|
+
emitter.clearListeners();
|
1986
|
+
if (this.appProxies.size) {
|
1987
|
+
this.appProxies.forEach((appProxy) => {
|
1988
|
+
appProxy.destroy(true, false, true);
|
1989
|
+
});
|
1990
|
+
}
|
1991
|
+
this.viewManager.destroy();
|
1992
|
+
(_a = this.boxManager) == null ? void 0 : _a.destroy();
|
1993
|
+
(_b = this.refresher) == null ? void 0 : _b.destroy();
|
1994
|
+
this.mainViewProxy.destroy();
|
1995
|
+
callbacks.clearListeners();
|
1996
|
+
this._prevSceneIndex = void 0;
|
1997
|
+
}
|
1998
|
+
}
|
1999
|
+
const ResizeObserver = window.ResizeObserver || ResizeObserver$1;
|
2000
|
+
class ContainerResizeObserver {
|
2001
|
+
constructor(emitter2) {
|
2002
|
+
this.emitter = emitter2;
|
2003
|
+
}
|
2004
|
+
static create(container, sizer, wrapper, emitter2) {
|
2005
|
+
const containerResizeObserver = new ContainerResizeObserver(emitter2);
|
2006
|
+
containerResizeObserver.observePlaygroundSize(container, sizer, wrapper);
|
2007
|
+
return containerResizeObserver;
|
2008
|
+
}
|
2009
|
+
observePlaygroundSize(container, sizer, wrapper) {
|
2010
|
+
this.updateSizer(container.getBoundingClientRect(), sizer, wrapper);
|
2011
|
+
this.containerResizeObserver = new ResizeObserver((entries) => {
|
2012
|
+
var _a;
|
2013
|
+
const containerRect = (_a = entries[0]) == null ? void 0 : _a.contentRect;
|
2014
|
+
if (containerRect) {
|
2015
|
+
this.updateSizer(containerRect, sizer, wrapper);
|
2016
|
+
this.emitter.emit("playgroundSizeChange", containerRect);
|
2017
|
+
}
|
2018
|
+
});
|
2019
|
+
this.containerResizeObserver.observe(container);
|
2020
|
+
}
|
2021
|
+
updateSizer({ width, height }, sizer, wrapper) {
|
2022
|
+
if (width && height) {
|
2023
|
+
if (height / width > WindowManager.containerSizeRatio) {
|
2024
|
+
height = width * WindowManager.containerSizeRatio;
|
2025
|
+
sizer.classList.toggle("netless-window-manager-sizer-horizontal", true);
|
2026
|
+
} else {
|
2027
|
+
width = height / WindowManager.containerSizeRatio;
|
2028
|
+
sizer.classList.toggle("netless-window-manager-sizer-horizontal", false);
|
2029
|
+
}
|
2030
|
+
wrapper.style.width = `${width}px`;
|
2031
|
+
wrapper.style.height = `${height}px`;
|
2032
|
+
}
|
2033
|
+
}
|
2034
|
+
disconnect() {
|
2035
|
+
var _a;
|
2036
|
+
(_a = this.containerResizeObserver) == null ? void 0 : _a.disconnect();
|
2037
|
+
}
|
2038
|
+
}
|
2039
|
+
const createBoxManager = (manager, callbacks2, emitter2, options) => {
|
2040
|
+
return new BoxManager({
|
2041
|
+
safeSetAttributes: (attributes) => manager.safeSetAttributes(attributes),
|
2042
|
+
getMainView: () => manager.mainView,
|
2043
|
+
updateAppState: (...args) => {
|
2044
|
+
var _a;
|
2045
|
+
return (_a = manager.appManager) == null ? void 0 : _a.store.updateAppState(...args);
|
2046
|
+
},
|
2047
|
+
canOperate: () => manager.canOperate,
|
2048
|
+
notifyContainerRectUpdate: (rect) => {
|
2049
|
+
var _a;
|
2050
|
+
return (_a = manager.appManager) == null ? void 0 : _a.notifyContainerRectUpdate(rect);
|
2051
|
+
},
|
2052
|
+
cleanFocus: () => {
|
2053
|
+
var _a;
|
2054
|
+
return (_a = manager.appManager) == null ? void 0 : _a.store.cleanFocus();
|
2055
|
+
},
|
2056
|
+
callbacks: callbacks2,
|
2057
|
+
emitter: emitter2
|
2058
|
+
}, options);
|
2059
|
+
};
|
2060
|
+
class BoxManager {
|
2061
|
+
constructor(context2, createTeleBoxManagerConfig) {
|
2062
|
+
this.context = context2;
|
2063
|
+
this.createTeleBoxManagerConfig = createTeleBoxManagerConfig;
|
2064
|
+
this.playgroundSizeChangeListener = () => {
|
2065
|
+
this.updateManagerRect();
|
2066
|
+
};
|
2067
|
+
const { emitter: emitter2, callbacks: callbacks2 } = context2;
|
2068
|
+
this.teleBoxManager = this.setupBoxManager(createTeleBoxManagerConfig);
|
2069
|
+
this.teleBoxManager.events.on(TELE_BOX_MANAGER_EVENT.State, (state) => {
|
2070
|
+
if (state) {
|
2071
|
+
this.context.callbacks.emit("boxStateChange", state);
|
2072
|
+
this.context.emitter.emit("boxStateChange", state);
|
2073
|
+
}
|
2074
|
+
});
|
2075
|
+
this.teleBoxManager.events.on("minimized", (minimized) => {
|
2076
|
+
this.context.safeSetAttributes({ minimized });
|
2077
|
+
if (minimized) {
|
2078
|
+
this.context.cleanFocus();
|
2079
|
+
this.blurAllBox();
|
2080
|
+
}
|
2081
|
+
});
|
2082
|
+
this.teleBoxManager.events.on("maximized", (maximized) => {
|
2083
|
+
this.context.safeSetAttributes({ maximized });
|
2084
|
+
});
|
2085
|
+
this.teleBoxManager.events.on("removed", (boxes) => {
|
2086
|
+
boxes.forEach((box) => {
|
2087
|
+
emitter2.emit("close", { appId: box.id });
|
2088
|
+
});
|
2089
|
+
});
|
2090
|
+
this.teleBoxManager.events.on("intrinsic_move", debounce((box) => {
|
2091
|
+
emitter2.emit("move", { appId: box.id, x: box.intrinsicX, y: box.intrinsicY });
|
2092
|
+
}, 50));
|
2093
|
+
this.teleBoxManager.events.on("intrinsic_resize", debounce((box) => {
|
2094
|
+
emitter2.emit("resize", {
|
2095
|
+
appId: box.id,
|
2096
|
+
width: box.intrinsicWidth,
|
2097
|
+
height: box.intrinsicHeight
|
2098
|
+
});
|
2099
|
+
}, 200));
|
2100
|
+
this.teleBoxManager.events.on("focused", (box) => {
|
2101
|
+
if (box) {
|
2102
|
+
if (this.canOperate) {
|
2103
|
+
emitter2.emit("focus", { appId: box.id });
|
2104
|
+
} else {
|
2105
|
+
this.teleBoxManager.blurBox(box.id);
|
2106
|
+
}
|
2107
|
+
}
|
2108
|
+
});
|
2109
|
+
this.teleBoxManager.events.on("dark_mode", (darkMode) => {
|
2110
|
+
callbacks2.emit("darkModeChange", darkMode);
|
2111
|
+
});
|
2112
|
+
this.teleBoxManager.events.on("prefers_color_scheme", (colorScheme) => {
|
2113
|
+
callbacks2.emit("prefersColorSchemeChange", colorScheme);
|
2114
|
+
});
|
2115
|
+
this.teleBoxManager.events.on("z_index", (box) => {
|
2116
|
+
this.context.updateAppState(box.id, AppAttributes.ZIndex, box.zIndex);
|
2117
|
+
});
|
2118
|
+
emitter2.on("playgroundSizeChange", this.playgroundSizeChangeListener);
|
2119
|
+
}
|
2120
|
+
get mainView() {
|
2121
|
+
return this.context.getMainView();
|
2122
|
+
}
|
2123
|
+
get canOperate() {
|
2124
|
+
return this.context.canOperate();
|
2125
|
+
}
|
2126
|
+
get boxState() {
|
2127
|
+
return this.teleBoxManager.state;
|
2128
|
+
}
|
2129
|
+
get maximized() {
|
2130
|
+
return this.teleBoxManager.maximized;
|
2131
|
+
}
|
2132
|
+
get minimized() {
|
2133
|
+
return this.teleBoxManager.minimized;
|
2134
|
+
}
|
2135
|
+
get darkMode() {
|
2136
|
+
return this.teleBoxManager.darkMode;
|
2137
|
+
}
|
2138
|
+
get prefersColorScheme() {
|
2139
|
+
return this.teleBoxManager.prefersColorScheme;
|
2140
|
+
}
|
2141
|
+
get boxSize() {
|
2142
|
+
return this.teleBoxManager.boxes.length;
|
2143
|
+
}
|
2144
|
+
createBox(params) {
|
2145
|
+
var _a, _b, _c;
|
2146
|
+
if (!this.teleBoxManager)
|
2147
|
+
return;
|
2148
|
+
let { minwidth = MIN_WIDTH, minheight = MIN_HEIGHT } = (_a = params.app.config) != null ? _a : {};
|
2149
|
+
const { width, height } = (_b = params.app.config) != null ? _b : {};
|
2150
|
+
const title = ((_c = params.options) == null ? void 0 : _c.title) || params.appId;
|
2151
|
+
const rect = this.teleBoxManager.containerRect;
|
2152
|
+
if (minwidth > 1) {
|
2153
|
+
minwidth = minwidth / rect.width;
|
2154
|
+
}
|
2155
|
+
if (minheight > 1) {
|
2156
|
+
minheight = minheight / rect.height;
|
2157
|
+
}
|
2158
|
+
const createBoxConfig = {
|
2159
|
+
title,
|
2160
|
+
minWidth: minwidth,
|
2161
|
+
minHeight: minheight,
|
2162
|
+
width,
|
2163
|
+
height,
|
2164
|
+
id: params.appId
|
2165
|
+
};
|
2166
|
+
this.teleBoxManager.create(createBoxConfig, params.smartPosition);
|
2167
|
+
this.context.emitter.emit(`${params.appId}${Events.WindowCreated}`);
|
2168
|
+
}
|
2169
|
+
setBoxInitState(appId) {
|
2170
|
+
const box = this.teleBoxManager.queryOne({ id: appId });
|
2171
|
+
if (box) {
|
2172
|
+
if (box.state === TELE_BOX_STATE.Maximized) {
|
2173
|
+
this.context.emitter.emit("resize", {
|
2174
|
+
appId,
|
2175
|
+
x: box.x,
|
2176
|
+
y: box.y,
|
2177
|
+
width: box.intrinsicWidth,
|
2178
|
+
height: box.intrinsicHeight
|
2179
|
+
});
|
2180
|
+
}
|
2181
|
+
}
|
2182
|
+
}
|
2183
|
+
setupBoxManager(createTeleBoxManagerConfig) {
|
2184
|
+
const root = WindowManager.wrapper ? WindowManager.wrapper : document.body;
|
2185
|
+
const rect = root.getBoundingClientRect();
|
2186
|
+
const initManagerState = {
|
2187
|
+
root,
|
2188
|
+
containerRect: {
|
2189
|
+
x: 0,
|
2190
|
+
y: 0,
|
2191
|
+
width: rect.width,
|
2192
|
+
height: rect.height
|
2193
|
+
},
|
2194
|
+
fence: false,
|
2195
|
+
prefersColorScheme: createTeleBoxManagerConfig == null ? void 0 : createTeleBoxManagerConfig.prefersColorScheme
|
2196
|
+
};
|
2197
|
+
const manager = new TeleBoxManager(initManagerState);
|
2198
|
+
if (this.teleBoxManager) {
|
2199
|
+
this.teleBoxManager.destroy();
|
2200
|
+
}
|
2201
|
+
this.teleBoxManager = manager;
|
2202
|
+
const container = (createTeleBoxManagerConfig == null ? void 0 : createTeleBoxManagerConfig.collectorContainer) || WindowManager.wrapper;
|
2203
|
+
if (container) {
|
2204
|
+
this.setCollectorContainer(container);
|
2205
|
+
}
|
2206
|
+
return manager;
|
2207
|
+
}
|
2208
|
+
setCollectorContainer(container) {
|
2209
|
+
var _a;
|
2210
|
+
const collector = new TeleBoxCollector({
|
2211
|
+
styles: (_a = this.createTeleBoxManagerConfig) == null ? void 0 : _a.collectorStyles
|
2212
|
+
}).mount(container);
|
2213
|
+
this.teleBoxManager.setCollector(collector);
|
2214
|
+
}
|
2215
|
+
getBox(appId) {
|
2216
|
+
return this.teleBoxManager.queryOne({ id: appId });
|
2217
|
+
}
|
2218
|
+
closeBox(appId, skipUpdate = false) {
|
2219
|
+
return this.teleBoxManager.remove(appId, skipUpdate);
|
2220
|
+
}
|
2221
|
+
boxIsFocus(appId) {
|
2222
|
+
const box = this.getBox(appId);
|
2223
|
+
return box == null ? void 0 : box.focus;
|
2224
|
+
}
|
2225
|
+
getFocusBox() {
|
2226
|
+
const boxes = this.teleBoxManager.query({ focus: true });
|
2227
|
+
return boxes[0];
|
2228
|
+
}
|
2229
|
+
getTopBox() {
|
2230
|
+
const boxes = this.teleBoxManager.query();
|
2231
|
+
return maxBy(boxes, "zIndex");
|
2232
|
+
}
|
2233
|
+
updateBoxState(state) {
|
2234
|
+
if (!state)
|
2235
|
+
return;
|
2236
|
+
const box = this.getBox(state.id);
|
2237
|
+
if (box) {
|
2238
|
+
this.teleBoxManager.update(box.id, {
|
2239
|
+
x: state.x,
|
2240
|
+
y: state.y,
|
2241
|
+
width: state.width || 0.5,
|
2242
|
+
height: state.height || 0.5,
|
2243
|
+
zIndex: state.zIndex
|
2244
|
+
}, true);
|
2245
|
+
setTimeout(() => {
|
2246
|
+
if (state.focus) {
|
2247
|
+
this.teleBoxManager.focusBox(box.id, true);
|
2248
|
+
}
|
2249
|
+
if (state.maximized != null) {
|
2250
|
+
this.teleBoxManager.setMaximized(Boolean(state.maximized), true);
|
2251
|
+
}
|
2252
|
+
if (state.minimized != null) {
|
2253
|
+
this.teleBoxManager.setMinimized(Boolean(state.minimized), true);
|
2254
|
+
}
|
2255
|
+
}, 50);
|
2256
|
+
this.context.callbacks.emit("boxStateChange", this.teleBoxManager.state);
|
2257
|
+
}
|
2258
|
+
}
|
2259
|
+
updateManagerRect() {
|
2260
|
+
var _a;
|
2261
|
+
const rect = (_a = this.mainView.divElement) == null ? void 0 : _a.getBoundingClientRect();
|
2262
|
+
if (rect && rect.width > 0 && rect.height > 0) {
|
2263
|
+
const containerRect = { x: 0, y: 0, width: rect.width, height: rect.height };
|
2264
|
+
this.teleBoxManager.setContainerRect(containerRect);
|
2265
|
+
this.context.notifyContainerRectUpdate(this.teleBoxManager.containerRect);
|
2266
|
+
}
|
2267
|
+
}
|
2268
|
+
moveBox({ appId, x, y }) {
|
2269
|
+
this.teleBoxManager.update(appId, { x, y }, true);
|
2270
|
+
}
|
2271
|
+
focusBox({ appId }, skipUpdate = true) {
|
2272
|
+
this.teleBoxManager.focusBox(appId, skipUpdate);
|
2273
|
+
}
|
2274
|
+
resizeBox({ appId, width, height, skipUpdate }) {
|
2275
|
+
this.teleBoxManager.update(appId, { width, height }, skipUpdate);
|
2276
|
+
}
|
2277
|
+
setBoxMinSize(params) {
|
2278
|
+
this.teleBoxManager.update(params.appId, {
|
2279
|
+
minWidth: params.minWidth,
|
2280
|
+
minHeight: params.minHeight
|
2281
|
+
}, true);
|
2282
|
+
}
|
2283
|
+
setBoxTitle(params) {
|
2284
|
+
this.teleBoxManager.update(params.appId, { title: params.title }, true);
|
2285
|
+
}
|
2286
|
+
blurAllBox() {
|
2287
|
+
this.teleBoxManager.blurAll();
|
2288
|
+
}
|
2289
|
+
updateAll(config) {
|
2290
|
+
this.teleBoxManager.updateAll(config);
|
2291
|
+
}
|
2292
|
+
setMaximized(maximized) {
|
2293
|
+
if (maximized !== this.maximized) {
|
2294
|
+
this.teleBoxManager.setMaximized(maximized, true);
|
2295
|
+
}
|
2296
|
+
}
|
2297
|
+
setMinimized(minimized, skipUpdate = true) {
|
2298
|
+
this.teleBoxManager.setMinimized(minimized, skipUpdate);
|
2299
|
+
}
|
2300
|
+
focusTopBox() {
|
2301
|
+
const boxes = this.teleBoxManager.query();
|
2302
|
+
if (boxes.length >= 1) {
|
2303
|
+
const box = this.getTopBox();
|
2304
|
+
if (box) {
|
2305
|
+
this.focusBox({ appId: box.id }, false);
|
2306
|
+
}
|
2307
|
+
}
|
2308
|
+
}
|
2309
|
+
updateBox(id, payload, skipUpdate = true) {
|
2310
|
+
this.teleBoxManager.update(id, payload, skipUpdate);
|
2311
|
+
}
|
2312
|
+
setReadonly(readonly) {
|
2313
|
+
this.teleBoxManager.setReadonly(readonly);
|
2314
|
+
}
|
2315
|
+
setPrefersColorScheme(colorScheme) {
|
2316
|
+
this.teleBoxManager.setPrefersColorScheme(colorScheme);
|
2317
|
+
}
|
2318
|
+
setZIndex(id, zIndex, skipUpdate = true) {
|
2319
|
+
this.teleBoxManager.update(id, { zIndex }, skipUpdate);
|
2320
|
+
}
|
2321
|
+
destroy() {
|
2322
|
+
emitter.off("playgroundSizeChange", this.playgroundSizeChangeListener);
|
2323
|
+
this.teleBoxManager.destroy();
|
2324
|
+
}
|
2325
|
+
}
|
2326
|
+
function noop() {
|
2327
|
+
}
|
2328
|
+
function run(fn) {
|
2329
|
+
return fn();
|
2330
|
+
}
|
2331
|
+
function blank_object() {
|
2332
|
+
return Object.create(null);
|
2333
|
+
}
|
2334
|
+
function run_all(fns) {
|
2335
|
+
fns.forEach(run);
|
2336
|
+
}
|
2337
|
+
function is_function(thing) {
|
2338
|
+
return typeof thing === "function";
|
2339
|
+
}
|
2340
|
+
function safe_not_equal(a, b) {
|
2341
|
+
return a != a ? b == b : a !== b || (a && typeof a === "object" || typeof a === "function");
|
2342
|
+
}
|
2343
|
+
let src_url_equal_anchor;
|
2344
|
+
function src_url_equal(element_src, url) {
|
2345
|
+
if (!src_url_equal_anchor) {
|
2346
|
+
src_url_equal_anchor = document.createElement("a");
|
2347
|
+
}
|
2348
|
+
src_url_equal_anchor.href = url;
|
2349
|
+
return element_src === src_url_equal_anchor.href;
|
2350
|
+
}
|
2351
|
+
function is_empty(obj) {
|
2352
|
+
return Object.keys(obj).length === 0;
|
2353
|
+
}
|
2354
|
+
function append(target, node) {
|
2355
|
+
target.appendChild(node);
|
2356
|
+
}
|
2357
|
+
function insert(target, node, anchor) {
|
2358
|
+
target.insertBefore(node, anchor || null);
|
2359
|
+
}
|
2360
|
+
function detach(node) {
|
2361
|
+
node.parentNode.removeChild(node);
|
2362
|
+
}
|
2363
|
+
function element(name) {
|
2364
|
+
return document.createElement(name);
|
2365
|
+
}
|
2366
|
+
function text$1(data) {
|
2367
|
+
return document.createTextNode(data);
|
2368
|
+
}
|
2369
|
+
function space() {
|
2370
|
+
return text$1(" ");
|
2371
|
+
}
|
2372
|
+
function attr(node, attribute, value) {
|
2373
|
+
if (value == null)
|
2374
|
+
node.removeAttribute(attribute);
|
2375
|
+
else if (node.getAttribute(attribute) !== value)
|
2376
|
+
node.setAttribute(attribute, value);
|
2377
|
+
}
|
2378
|
+
function children(element2) {
|
2379
|
+
return Array.from(element2.childNodes);
|
2380
|
+
}
|
2381
|
+
function set_data(text2, data) {
|
2382
|
+
data = "" + data;
|
2383
|
+
if (text2.wholeText !== data)
|
2384
|
+
text2.data = data;
|
2385
|
+
}
|
2386
|
+
function set_style(node, key, value, important) {
|
2387
|
+
if (value === null) {
|
2388
|
+
node.style.removeProperty(key);
|
2389
|
+
} else {
|
2390
|
+
node.style.setProperty(key, value, important ? "important" : "");
|
2391
|
+
}
|
2392
|
+
}
|
2393
|
+
let current_component;
|
2394
|
+
function set_current_component(component) {
|
2395
|
+
current_component = component;
|
2396
|
+
}
|
2397
|
+
const dirty_components = [];
|
2398
|
+
const binding_callbacks = [];
|
2399
|
+
const render_callbacks = [];
|
2400
|
+
const flush_callbacks = [];
|
2401
|
+
const resolved_promise = Promise.resolve();
|
2402
|
+
let update_scheduled = false;
|
2403
|
+
function schedule_update() {
|
2404
|
+
if (!update_scheduled) {
|
2405
|
+
update_scheduled = true;
|
2406
|
+
resolved_promise.then(flush);
|
2407
|
+
}
|
2408
|
+
}
|
2409
|
+
function add_render_callback(fn) {
|
2410
|
+
render_callbacks.push(fn);
|
2411
|
+
}
|
2412
|
+
const seen_callbacks = new Set();
|
2413
|
+
let flushidx = 0;
|
2414
|
+
function flush() {
|
2415
|
+
const saved_component = current_component;
|
2416
|
+
do {
|
2417
|
+
while (flushidx < dirty_components.length) {
|
2418
|
+
const component = dirty_components[flushidx];
|
2419
|
+
flushidx++;
|
2420
|
+
set_current_component(component);
|
2421
|
+
update(component.$$);
|
2422
|
+
}
|
2423
|
+
set_current_component(null);
|
2424
|
+
dirty_components.length = 0;
|
2425
|
+
flushidx = 0;
|
2426
|
+
while (binding_callbacks.length)
|
2427
|
+
binding_callbacks.pop()();
|
2428
|
+
for (let i = 0; i < render_callbacks.length; i += 1) {
|
2429
|
+
const callback = render_callbacks[i];
|
2430
|
+
if (!seen_callbacks.has(callback)) {
|
2431
|
+
seen_callbacks.add(callback);
|
2432
|
+
callback();
|
2433
|
+
}
|
2434
|
+
}
|
2435
|
+
render_callbacks.length = 0;
|
2436
|
+
} while (dirty_components.length);
|
2437
|
+
while (flush_callbacks.length) {
|
2438
|
+
flush_callbacks.pop()();
|
2439
|
+
}
|
2440
|
+
update_scheduled = false;
|
2441
|
+
seen_callbacks.clear();
|
2442
|
+
set_current_component(saved_component);
|
2443
|
+
}
|
2444
|
+
function update($$) {
|
2445
|
+
if ($$.fragment !== null) {
|
2446
|
+
$$.update();
|
2447
|
+
run_all($$.before_update);
|
2448
|
+
const dirty = $$.dirty;
|
2449
|
+
$$.dirty = [-1];
|
2450
|
+
$$.fragment && $$.fragment.p($$.ctx, dirty);
|
2451
|
+
$$.after_update.forEach(add_render_callback);
|
2452
|
+
}
|
2453
|
+
}
|
2454
|
+
const outroing = new Set();
|
2455
|
+
function transition_in(block, local) {
|
2456
|
+
if (block && block.i) {
|
2457
|
+
outroing.delete(block);
|
2458
|
+
block.i(local);
|
2459
|
+
}
|
2460
|
+
}
|
2461
|
+
function mount_component(component, target, anchor, customElement) {
|
2462
|
+
const { fragment, on_mount, on_destroy, after_update } = component.$$;
|
2463
|
+
fragment && fragment.m(target, anchor);
|
2464
|
+
if (!customElement) {
|
2465
|
+
add_render_callback(() => {
|
2466
|
+
const new_on_destroy = on_mount.map(run).filter(is_function);
|
2467
|
+
if (on_destroy) {
|
2468
|
+
on_destroy.push(...new_on_destroy);
|
2469
|
+
} else {
|
2470
|
+
run_all(new_on_destroy);
|
2471
|
+
}
|
2472
|
+
component.$$.on_mount = [];
|
2473
|
+
});
|
2474
|
+
}
|
2475
|
+
after_update.forEach(add_render_callback);
|
2476
|
+
}
|
2477
|
+
function destroy_component(component, detaching) {
|
2478
|
+
const $$ = component.$$;
|
2479
|
+
if ($$.fragment !== null) {
|
2480
|
+
run_all($$.on_destroy);
|
2481
|
+
$$.fragment && $$.fragment.d(detaching);
|
2482
|
+
$$.on_destroy = $$.fragment = null;
|
2483
|
+
$$.ctx = [];
|
2484
|
+
}
|
2485
|
+
}
|
2486
|
+
function make_dirty(component, i) {
|
2487
|
+
if (component.$$.dirty[0] === -1) {
|
2488
|
+
dirty_components.push(component);
|
2489
|
+
schedule_update();
|
2490
|
+
component.$$.dirty.fill(0);
|
2491
|
+
}
|
2492
|
+
component.$$.dirty[i / 31 | 0] |= 1 << i % 31;
|
2493
|
+
}
|
2494
|
+
function init(component, options, instance2, create_fragment2, not_equal, props, append_styles, dirty = [-1]) {
|
2495
|
+
const parent_component = current_component;
|
2496
|
+
set_current_component(component);
|
2497
|
+
const $$ = component.$$ = {
|
2498
|
+
fragment: null,
|
2499
|
+
ctx: null,
|
2500
|
+
props,
|
2501
|
+
update: noop,
|
2502
|
+
not_equal,
|
2503
|
+
bound: blank_object(),
|
2504
|
+
on_mount: [],
|
2505
|
+
on_destroy: [],
|
2506
|
+
on_disconnect: [],
|
2507
|
+
before_update: [],
|
2508
|
+
after_update: [],
|
2509
|
+
context: new Map(options.context || (parent_component ? parent_component.$$.context : [])),
|
2510
|
+
callbacks: blank_object(),
|
2511
|
+
dirty,
|
2512
|
+
skip_bound: false,
|
2513
|
+
root: options.target || parent_component.$$.root
|
2514
|
+
};
|
2515
|
+
append_styles && append_styles($$.root);
|
2516
|
+
let ready = false;
|
2517
|
+
$$.ctx = instance2 ? instance2(component, options.props || {}, (i, ret, ...rest) => {
|
2518
|
+
const value = rest.length ? rest[0] : ret;
|
2519
|
+
if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) {
|
2520
|
+
if (!$$.skip_bound && $$.bound[i])
|
2521
|
+
$$.bound[i](value);
|
2522
|
+
if (ready)
|
2523
|
+
make_dirty(component, i);
|
2524
|
+
}
|
2525
|
+
return ret;
|
2526
|
+
}) : [];
|
2527
|
+
$$.update();
|
2528
|
+
ready = true;
|
2529
|
+
run_all($$.before_update);
|
2530
|
+
$$.fragment = create_fragment2 ? create_fragment2($$.ctx) : false;
|
2531
|
+
if (options.target) {
|
2532
|
+
if (options.hydrate) {
|
2533
|
+
const nodes = children(options.target);
|
2534
|
+
$$.fragment && $$.fragment.l(nodes);
|
2535
|
+
nodes.forEach(detach);
|
2536
|
+
} else {
|
2537
|
+
$$.fragment && $$.fragment.c();
|
2538
|
+
}
|
2539
|
+
if (options.intro)
|
2540
|
+
transition_in(component.$$.fragment);
|
2541
|
+
mount_component(component, options.target, options.anchor, options.customElement);
|
2542
|
+
flush();
|
2543
|
+
}
|
2544
|
+
set_current_component(parent_component);
|
2545
|
+
}
|
2546
|
+
class SvelteComponent {
|
2547
|
+
$destroy() {
|
2548
|
+
destroy_component(this, 1);
|
2549
|
+
this.$destroy = noop;
|
2550
|
+
}
|
2551
|
+
$on(type, callback) {
|
2552
|
+
const callbacks2 = this.$$.callbacks[type] || (this.$$.callbacks[type] = []);
|
2553
|
+
callbacks2.push(callback);
|
2554
|
+
return () => {
|
2555
|
+
const index = callbacks2.indexOf(callback);
|
2556
|
+
if (index !== -1)
|
2557
|
+
callbacks2.splice(index, 1);
|
2558
|
+
};
|
2559
|
+
}
|
2560
|
+
$set($$props) {
|
2561
|
+
if (this.$$set && !is_empty($$props)) {
|
2562
|
+
this.$$.skip_bound = true;
|
2563
|
+
this.$$set($$props);
|
2564
|
+
this.$$.skip_bound = false;
|
2565
|
+
}
|
2566
|
+
}
|
2567
|
+
}
|
2568
|
+
function create_if_block_1(ctx) {
|
2569
|
+
let img;
|
2570
|
+
let img_style_value;
|
2571
|
+
let img_src_value;
|
2572
|
+
return {
|
2573
|
+
c() {
|
2574
|
+
img = element("img");
|
2575
|
+
attr(img, "class", "netless-window-manager-cursor-selector-avatar");
|
2576
|
+
attr(img, "style", img_style_value = ctx[15]());
|
2577
|
+
if (!src_url_equal(img.src, img_src_value = ctx[7]))
|
2578
|
+
attr(img, "src", img_src_value);
|
2579
|
+
attr(img, "alt", "avatar");
|
2580
|
+
},
|
2581
|
+
m(target, anchor) {
|
2582
|
+
insert(target, img, anchor);
|
2583
|
+
},
|
2584
|
+
p(ctx2, dirty) {
|
2585
|
+
if (dirty & 128 && !src_url_equal(img.src, img_src_value = ctx2[7])) {
|
2586
|
+
attr(img, "src", img_src_value);
|
2587
|
+
}
|
2588
|
+
},
|
2589
|
+
d(detaching) {
|
2590
|
+
if (detaching)
|
2591
|
+
detach(img);
|
2592
|
+
}
|
2593
|
+
};
|
2594
|
+
}
|
2595
|
+
function create_if_block(ctx) {
|
2596
|
+
let span;
|
2597
|
+
let t;
|
2598
|
+
return {
|
2599
|
+
c() {
|
2600
|
+
span = element("span");
|
2601
|
+
t = text$1(ctx[1]);
|
2602
|
+
attr(span, "class", "netless-window-manager-cursor-tag-name");
|
2603
|
+
set_style(span, "background-color", ctx[10]);
|
2604
|
+
},
|
2605
|
+
m(target, anchor) {
|
2606
|
+
insert(target, span, anchor);
|
2607
|
+
append(span, t);
|
2608
|
+
},
|
2609
|
+
p(ctx2, dirty) {
|
2610
|
+
if (dirty & 2)
|
2611
|
+
set_data(t, ctx2[1]);
|
2612
|
+
if (dirty & 1024) {
|
2613
|
+
set_style(span, "background-color", ctx2[10]);
|
2614
|
+
}
|
2615
|
+
},
|
2616
|
+
d(detaching) {
|
2617
|
+
if (detaching)
|
2618
|
+
detach(span);
|
2619
|
+
}
|
2620
|
+
};
|
2621
|
+
}
|
2622
|
+
function create_fragment(ctx) {
|
2623
|
+
let div3;
|
2624
|
+
let div1;
|
2625
|
+
let div0;
|
2626
|
+
let t0;
|
2627
|
+
let span;
|
2628
|
+
let t1;
|
2629
|
+
let t2;
|
2630
|
+
let t3;
|
2631
|
+
let div2;
|
2632
|
+
let img;
|
2633
|
+
let img_class_value;
|
2634
|
+
let img_src_value;
|
2635
|
+
let if_block0 = ctx[13] && create_if_block_1(ctx);
|
2636
|
+
let if_block1 = ctx[14] && create_if_block(ctx);
|
2637
|
+
return {
|
2638
|
+
c() {
|
2639
|
+
div3 = element("div");
|
2640
|
+
div1 = element("div");
|
2641
|
+
div0 = element("div");
|
2642
|
+
if (if_block0)
|
2643
|
+
if_block0.c();
|
2644
|
+
t0 = space();
|
2645
|
+
span = element("span");
|
2646
|
+
t1 = text$1(ctx[0]);
|
2647
|
+
t2 = space();
|
2648
|
+
if (if_block1)
|
2649
|
+
if_block1.c();
|
2650
|
+
t3 = space();
|
2651
|
+
div2 = element("div");
|
2652
|
+
img = element("img");
|
2653
|
+
set_style(span, "overflow", "hidden");
|
2654
|
+
set_style(span, "white-space", "nowrap");
|
2655
|
+
set_style(span, "text-overflow", "ellipsis");
|
2656
|
+
set_style(span, "max-width", "80px");
|
2657
|
+
attr(div0, "class", ctx[8]);
|
2658
|
+
set_style(div0, "background-color", ctx[2]);
|
2659
|
+
set_style(div0, "color", ctx[9]);
|
2660
|
+
set_style(div0, "opacity", ctx[11]);
|
2661
|
+
attr(div1, "class", "netless-window-manager-cursor-name");
|
2662
|
+
attr(img, "class", img_class_value = "netless-window-manager-cursor-" + ctx[3] + "-image");
|
2663
|
+
if (!src_url_equal(img.src, img_src_value = ctx[6]))
|
2664
|
+
attr(img, "src", img_src_value);
|
2665
|
+
attr(img, "alt", ctx[3]);
|
2666
|
+
attr(div2, "class", "cursor-image-wrapper");
|
2667
|
+
attr(div3, "class", "netless-window-manager-cursor-mid");
|
2668
|
+
set_style(div3, "transform", "translateX(" + ctx[4] + "px) translateY(" + ctx[5] + "px)");
|
2669
|
+
set_style(div3, "display", ctx[12]);
|
2670
|
+
},
|
2671
|
+
m(target, anchor) {
|
2672
|
+
insert(target, div3, anchor);
|
2673
|
+
append(div3, div1);
|
2674
|
+
append(div1, div0);
|
2675
|
+
if (if_block0)
|
2676
|
+
if_block0.m(div0, null);
|
2677
|
+
append(div0, t0);
|
2678
|
+
append(div0, span);
|
2679
|
+
append(span, t1);
|
2680
|
+
append(div0, t2);
|
2681
|
+
if (if_block1)
|
2682
|
+
if_block1.m(div0, null);
|
2683
|
+
append(div3, t3);
|
2684
|
+
append(div3, div2);
|
2685
|
+
append(div2, img);
|
2686
|
+
},
|
2687
|
+
p(ctx2, [dirty]) {
|
2688
|
+
if (ctx2[13]) {
|
2689
|
+
if (if_block0) {
|
2690
|
+
if_block0.p(ctx2, dirty);
|
2691
|
+
} else {
|
2692
|
+
if_block0 = create_if_block_1(ctx2);
|
2693
|
+
if_block0.c();
|
2694
|
+
if_block0.m(div0, t0);
|
2695
|
+
}
|
2696
|
+
} else if (if_block0) {
|
2697
|
+
if_block0.d(1);
|
2698
|
+
if_block0 = null;
|
2699
|
+
}
|
2700
|
+
if (dirty & 1)
|
2701
|
+
set_data(t1, ctx2[0]);
|
2702
|
+
if (ctx2[14]) {
|
2703
|
+
if (if_block1) {
|
2704
|
+
if_block1.p(ctx2, dirty);
|
2705
|
+
} else {
|
2706
|
+
if_block1 = create_if_block(ctx2);
|
2707
|
+
if_block1.c();
|
2708
|
+
if_block1.m(div0, null);
|
2709
|
+
}
|
2710
|
+
} else if (if_block1) {
|
2711
|
+
if_block1.d(1);
|
2712
|
+
if_block1 = null;
|
2713
|
+
}
|
2714
|
+
if (dirty & 256) {
|
2715
|
+
attr(div0, "class", ctx2[8]);
|
2716
|
+
}
|
2717
|
+
if (dirty & 4) {
|
2718
|
+
set_style(div0, "background-color", ctx2[2]);
|
2719
|
+
}
|
2720
|
+
if (dirty & 512) {
|
2721
|
+
set_style(div0, "color", ctx2[9]);
|
2722
|
+
}
|
2723
|
+
if (dirty & 2048) {
|
2724
|
+
set_style(div0, "opacity", ctx2[11]);
|
2725
|
+
}
|
2726
|
+
if (dirty & 8 && img_class_value !== (img_class_value = "netless-window-manager-cursor-" + ctx2[3] + "-image")) {
|
2727
|
+
attr(img, "class", img_class_value);
|
2728
|
+
}
|
2729
|
+
if (dirty & 64 && !src_url_equal(img.src, img_src_value = ctx2[6])) {
|
2730
|
+
attr(img, "src", img_src_value);
|
2731
|
+
}
|
2732
|
+
if (dirty & 8) {
|
2733
|
+
attr(img, "alt", ctx2[3]);
|
2734
|
+
}
|
2735
|
+
if (dirty & 48) {
|
2736
|
+
set_style(div3, "transform", "translateX(" + ctx2[4] + "px) translateY(" + ctx2[5] + "px)");
|
2737
|
+
}
|
2738
|
+
if (dirty & 4096) {
|
2739
|
+
set_style(div3, "display", ctx2[12]);
|
2740
|
+
}
|
2741
|
+
},
|
2742
|
+
i: noop,
|
2743
|
+
o: noop,
|
2744
|
+
d(detaching) {
|
2745
|
+
if (detaching)
|
2746
|
+
detach(div3);
|
2747
|
+
if (if_block0)
|
2748
|
+
if_block0.d();
|
2749
|
+
if (if_block1)
|
2750
|
+
if_block1.d();
|
2751
|
+
}
|
2752
|
+
};
|
2753
|
+
}
|
2754
|
+
function instance($$self, $$props, $$invalidate) {
|
2755
|
+
let hasName;
|
2756
|
+
let hasTagName;
|
2757
|
+
let hasAvatar;
|
2758
|
+
let display;
|
2759
|
+
let { cursorName } = $$props;
|
2760
|
+
let { tagName } = $$props;
|
2761
|
+
let { backgroundColor } = $$props;
|
2762
|
+
let { appliance } = $$props;
|
2763
|
+
let { x } = $$props;
|
2764
|
+
let { y } = $$props;
|
2765
|
+
let { src } = $$props;
|
2766
|
+
let { visible } = $$props;
|
2767
|
+
let { avatar } = $$props;
|
2768
|
+
let { theme } = $$props;
|
2769
|
+
let { color } = $$props;
|
2770
|
+
let { cursorTagBackgroundColor } = $$props;
|
2771
|
+
let { opacity } = $$props;
|
2772
|
+
const computedAvatarStyle = () => {
|
2773
|
+
return Object.entries({
|
2774
|
+
width: (hasName ? 19 : 28) + "px",
|
2775
|
+
height: (hasName ? 19 : 28) + "px",
|
2776
|
+
position: hasName ? "initial" : "absolute",
|
2777
|
+
"border-color": hasName ? "white" : backgroundColor,
|
2778
|
+
"margin-right": (hasName ? 4 : 0) + "px"
|
2779
|
+
}).map(([key, v]) => `${key}: ${v}`).join(";");
|
2780
|
+
};
|
2781
|
+
$$self.$$set = ($$props2) => {
|
2782
|
+
if ("cursorName" in $$props2)
|
2783
|
+
$$invalidate(0, cursorName = $$props2.cursorName);
|
2784
|
+
if ("tagName" in $$props2)
|
2785
|
+
$$invalidate(1, tagName = $$props2.tagName);
|
2786
|
+
if ("backgroundColor" in $$props2)
|
2787
|
+
$$invalidate(2, backgroundColor = $$props2.backgroundColor);
|
2788
|
+
if ("appliance" in $$props2)
|
2789
|
+
$$invalidate(3, appliance = $$props2.appliance);
|
2790
|
+
if ("x" in $$props2)
|
2791
|
+
$$invalidate(4, x = $$props2.x);
|
2792
|
+
if ("y" in $$props2)
|
2793
|
+
$$invalidate(5, y = $$props2.y);
|
2794
|
+
if ("src" in $$props2)
|
2795
|
+
$$invalidate(6, src = $$props2.src);
|
2796
|
+
if ("visible" in $$props2)
|
2797
|
+
$$invalidate(16, visible = $$props2.visible);
|
2798
|
+
if ("avatar" in $$props2)
|
2799
|
+
$$invalidate(7, avatar = $$props2.avatar);
|
2800
|
+
if ("theme" in $$props2)
|
2801
|
+
$$invalidate(8, theme = $$props2.theme);
|
2802
|
+
if ("color" in $$props2)
|
2803
|
+
$$invalidate(9, color = $$props2.color);
|
2804
|
+
if ("cursorTagBackgroundColor" in $$props2)
|
2805
|
+
$$invalidate(10, cursorTagBackgroundColor = $$props2.cursorTagBackgroundColor);
|
2806
|
+
if ("opacity" in $$props2)
|
2807
|
+
$$invalidate(11, opacity = $$props2.opacity);
|
2808
|
+
};
|
2809
|
+
$$self.$$.update = () => {
|
2810
|
+
if ($$self.$$.dirty & 1) {
|
2811
|
+
hasName = !isEmpty(cursorName);
|
2812
|
+
}
|
2813
|
+
if ($$self.$$.dirty & 2) {
|
2814
|
+
$$invalidate(14, hasTagName = !isEmpty(tagName));
|
2815
|
+
}
|
2816
|
+
if ($$self.$$.dirty & 128) {
|
2817
|
+
$$invalidate(13, hasAvatar = !isEmpty(avatar));
|
2818
|
+
}
|
2819
|
+
if ($$self.$$.dirty & 65536) {
|
2820
|
+
$$invalidate(12, display = visible ? "initial" : "none");
|
2821
|
+
}
|
2822
|
+
};
|
2823
|
+
return [
|
2824
|
+
cursorName,
|
2825
|
+
tagName,
|
2826
|
+
backgroundColor,
|
2827
|
+
appliance,
|
2828
|
+
x,
|
2829
|
+
y,
|
2830
|
+
src,
|
2831
|
+
avatar,
|
2832
|
+
theme,
|
2833
|
+
color,
|
2834
|
+
cursorTagBackgroundColor,
|
2835
|
+
opacity,
|
2836
|
+
display,
|
2837
|
+
hasAvatar,
|
2838
|
+
hasTagName,
|
2839
|
+
computedAvatarStyle,
|
2840
|
+
visible
|
2841
|
+
];
|
2842
|
+
}
|
2843
|
+
class Cursor$1 extends SvelteComponent {
|
2844
|
+
constructor(options) {
|
2845
|
+
super();
|
2846
|
+
init(this, options, instance, create_fragment, safe_not_equal, {
|
2847
|
+
cursorName: 0,
|
2848
|
+
tagName: 1,
|
2849
|
+
backgroundColor: 2,
|
2850
|
+
appliance: 3,
|
2851
|
+
x: 4,
|
2852
|
+
y: 5,
|
2853
|
+
src: 6,
|
2854
|
+
visible: 16,
|
2855
|
+
avatar: 7,
|
2856
|
+
theme: 8,
|
2857
|
+
color: 9,
|
2858
|
+
cursorTagBackgroundColor: 10,
|
2859
|
+
opacity: 11
|
2860
|
+
});
|
2861
|
+
}
|
2862
|
+
}
|
2863
|
+
var pencil = "data:image/png;base64,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";
|
2864
|
+
var selector = "data:image/png;base64,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";
|
2865
|
+
var eraser = "data:image/png;base64,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";
|
2866
|
+
var shape = "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNDBweCIgaGVpZ2h0PSI0MHB4IiB2aWV3Qm94PSIwIDAgNDAgNDAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDYwLjEgKDg4MTMzKSAtIGh0dHBzOi8vc2tldGNoLmNvbSAtLT4KICAgIDx0aXRsZT5zaGFwZS1jdXJzb3I8L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZGVmcz4KICAgICAgICA8cGF0aCBkPSJNMjAsMjEuNSBDMjAuMjQ1NDU5OSwyMS41IDIwLjQ0OTYwODQsMjEuNjc2ODc1MiAyMC40OTE5NDQzLDIxLjkxMDEyNDQgTDIwLjUsMjIgTDIwLjUsMjcgQzIwLjUsMjcuMjc2MTQyNCAyMC4yNzYxNDI0LDI3LjUgMjAsMjcuNSBDMTkuNzU0NTQwMSwyNy41IDE5LjU1MDM5MTYsMjcuMzIzMTI0OCAxOS41MDgwNTU3LDI3LjA4OTg3NTYgTDE5LjUsMjcgTDE5LjUsMjIgQzE5LjUsMjEuNzIzODU3NiAxOS43MjM4NTc2LDIxLjUgMjAsMjEuNSBaIE0yNywxOS41IEMyNy4yNzYxNDI0LDE5LjUgMjcuNSwxOS43MjM4NTc2IDI3LjUsMjAgQzI3LjUsMjAuMjQ1NDU5OSAyNy4zMjMxMjQ4LDIwLjQ0OTYwODQgMjcuMDg5ODc1NiwyMC40OTE5NDQzIEwyNywyMC41IEwyMiwyMC41IEMyMS43MjM4NTc2LDIwLjUgMjEuNSwyMC4yNzYxNDI0IDIxLjUsMjAgQzIxLjUsMTkuNzU0NTQwMSAyMS42NzY4NzUyLDE5LjU1MDM5MTYgMjEuOTEwMTI0NCwxOS41MDgwNTU3IEwyMiwxOS41IEwyNywxOS41IFogTTE4LDE5LjUgQzE4LjI3NjE0MjQsMTkuNSAxOC41LDE5LjcyMzg1NzYgMTguNSwyMCBDMTguNSwyMC4yNDU0NTk5IDE4LjMyMzEyNDgsMjAuNDQ5NjA4NCAxOC4wODk4NzU2LDIwLjQ5MTk0NDMgTDE4LDIwLjUgTDEzLDIwLjUgQzEyLjcyMzg1NzYsMjAuNSAxMi41LDIwLjI3NjE0MjQgMTIuNSwyMCBDMTIuNSwxOS43NTQ1NDAxIDEyLjY3Njg3NTIsMTkuNTUwMzkxNiAxMi45MTAxMjQ0LDE5LjUwODA1NTcgTDEzLDE5LjUgTDE4LDE5LjUgWiBNMjAsMTIuNSBDMjAuMjQ1NDU5OSwxMi41IDIwLjQ0OTYwODQsMTIuNjc2ODc1MiAyMC40OTE5NDQzLDEyLjkxMDEyNDQgTDIwLjUsMTMgTDIwLjUsMTggQzIwLjUsMTguMjc2MTQyNCAyMC4yNzYxNDI0LDE4LjUgMjAsMTguNSBDMTkuNzU0NTQwMSwxOC41IDE5LjU1MDM5MTYsMTguMzIzMTI0OCAxOS41MDgwNTU3LDE4LjA4OTg3NTYgTDE5LjUsMTggTDE5LjUsMTMgQzE5LjUsMTIuNzIzODU3NiAxOS43MjM4NTc2LDEyLjUgMjAsMTIuNSBaIiBpZD0icGF0aC0xIj48L3BhdGg+CiAgICAgICAgPGZpbHRlciB4PSItNjQuNiUiIHk9Ii01OS41JSIgd2lkdGg9IjIyOS4zJSIgaGVpZ2h0PSIyNDYuMSUiIGZpbHRlclVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgaWQ9ImZpbHRlci0yIj4KICAgICAgICAgICAgPGZlTW9ycGhvbG9neSByYWRpdXM9IjEiIG9wZXJhdG9yPSJkaWxhdGUiIGluPSJTb3VyY2VBbHBoYSIgcmVzdWx0PSJzaGFkb3dTcHJlYWRPdXRlcjEiPjwvZmVNb3JwaG9sb2d5PgogICAgICAgICAgICA8ZmVPZmZzZXQgZHg9IjAiIGR5PSIyIiBpbj0ic2hhZG93U3ByZWFkT3V0ZXIxIiByZXN1bHQ9InNoYWRvd09mZnNldE91dGVyMSI+PC9mZU9mZnNldD4KICAgICAgICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMyIgaW49InNoYWRvd09mZnNldE91dGVyMSIgcmVzdWx0PSJzaGFkb3dCbHVyT3V0ZXIxIj48L2ZlR2F1c3NpYW5CbHVyPgogICAgICAgICAgICA8ZmVDb21wb3NpdGUgaW49InNoYWRvd0JsdXJPdXRlcjEiIGluMj0iU291cmNlQWxwaGEiIG9wZXJhdG9yPSJvdXQiIHJlc3VsdD0ic2hhZG93Qmx1ck91dGVyMSI+PC9mZUNvbXBvc2l0ZT4KICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggdmFsdWVzPSIwIDAgMCAwIDAgICAwIDAgMCAwIDAgICAwIDAgMCAwIDAgIDAgMCAwIDAuMTYgMCIgdHlwZT0ibWF0cml4IiBpbj0ic2hhZG93Qmx1ck91dGVyMSI+PC9mZUNvbG9yTWF0cml4PgogICAgICAgIDwvZmlsdGVyPgogICAgPC9kZWZzPgogICAgPGcgaWQ9Iumhtemdoi00IiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0iV2hpdGVib2FyZC1HdWlkZWxpbmVzIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMzQ0LjAwMDAwMCwgLTc1MS4wMDAwMDApIj4KICAgICAgICAgICAgPGcgaWQ9InNoYXBlLWN1cnNvciIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzQ0LjAwMDAwMCwgNzUxLjAwMDAwMCkiPgogICAgICAgICAgICAgICAgPHJlY3QgaWQ9IuefqeW9ouWkh+S7vS00NCIgZmlsbD0iI0ZGRkZGRiIgb3BhY2l0eT0iMC4wMSIgeD0iMCIgeT0iMCIgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiByeD0iMiI+PC9yZWN0PgogICAgICAgICAgICAgICAgPGcgaWQ9IuW9oueKtue7k+WQiCIgZmlsbC1ydWxlPSJub256ZXJvIj4KICAgICAgICAgICAgICAgICAgICA8dXNlIGZpbGw9ImJsYWNrIiBmaWxsLW9wYWNpdHk9IjEiIGZpbHRlcj0idXJsKCNmaWx0ZXItMikiIHhsaW5rOmhyZWY9IiNwYXRoLTEiPjwvdXNlPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIHN0cm9rZT0iI0ZGRkZGRiIgc3Ryb2tlLXdpZHRoPSIxIiBkPSJNMjAsMjEgQzIwLjQ4NTQxMDMsMjEgMjAuODk4MDg1LDIxLjM0Nzk5OTMgMjAuOTg5OTQ3OSwyMS44NjU0ODc3IEwyMSwyMiBMMjEsMjcgQzIxLDI3LjU1MjI4NDcgMjAuNTUyMjg0NywyOCAyMCwyOCBDMTkuNTE0NTg5NywyOCAxOS4xMDE5MTUsMjcuNjUyMDAwNyAxOS4wMTAwNTIxLDI3LjEzNDUxMjMgTDE5LDI3IEwxOSwyMiBDMTksMjEuNDQ3NzE1MyAxOS40NDc3MTUzLDIxIDIwLDIxIFogTTI3LDE5IEMyNy41NTIyODQ3LDE5IDI4LDE5LjQ0NzcxNTMgMjgsMjAgQzI4LDIwLjQ4NTQxMDMgMjcuNjUyMDAwNywyMC44OTgwODUgMjcuMTM0NTEyMywyMC45ODk5NDc5IEwyNywyMSBMMjIsMjEgQzIxLjQ0NzcxNTMsMjEgMjEsMjAuNTUyMjg0NyAyMSwyMCBDMjEsMTkuNTE0NTg5NyAyMS4zNDc5OTkzLDE5LjEwMTkxNSAyMS44NjU0ODc3LDE5LjAxMDA1MjEgTDIyLDE5IEwyNywxOSBaIE0xOCwxOSBDMTguNTUyMjg0NywxOSAxOSwxOS40NDc3MTUzIDE5LDIwIEMxOSwyMC40ODU0MTAzIDE4LjY1MjAwMDcsMjAuODk4MDg1IDE4LjEzNDUxMjMsMjAuOTg5OTQ3OSBMMTgsMjEgTDEzLDIxIEMxMi40NDc3MTUzLDIxIDEyLDIwLjU1MjI4NDcgMTIsMjAgQzEyLDE5LjUxNDU4OTcgMTIuMzQ3OTk5MywxOS4xMDE5MTUgMTIuODY1NDg3NywxOS4wMTAwNTIxIEwxMywxOSBMMTgsMTkgWiBNMjAsMTIgQzIwLjQ4NTQxMDMsMTIgMjAuODk4MDg1LDEyLjM0Nzk5OTMgMjAuOTg5OTQ3OSwxMi44NjU0ODc3IEwyMSwxMyBMMjEsMTggQzIxLDE4LjU1MjI4NDcgMjAuNTUyMjg0NywxOSAyMCwxOSBDMTkuNTE0NTg5NywxOSAxOS4xMDE5MTUsMTguNjUyMDAwNyAxOS4wMTAwNTIxLDE4LjEzNDUxMjMgTDE5LDE4IEwxOSwxMyBDMTksMTIuNDQ3NzE1MyAxOS40NDc3MTUzLDEyIDIwLDEyIFoiIGZpbGw9IiMyMTIzMjQiIGZpbGwtcnVsZT0iZXZlbm9kZCI+PC9wYXRoPgogICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgPHJlY3QgaWQ9IuefqeW9oiIgZmlsbD0iI0ZGRkZGRiIgeD0iMTguNSIgeT0iMTciIHdpZHRoPSIzIiBoZWlnaHQ9IjYiPjwvcmVjdD4KICAgICAgICAgICAgICAgIDxyZWN0IGlkPSLnn6nlvaIiIGZpbGw9IiNGRkZGRkYiIHg9IjE3IiB5PSIxOC41IiB3aWR0aD0iNiIgaGVpZ2h0PSIzIj48L3JlY3Q+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMjAsMjEuNSBDMjAuMjQ1NDU5OSwyMS41IDIwLjQ0OTYwODQsMjEuNjc2ODc1MiAyMC40OTE5NDQzLDIxLjkxMDEyNDQgTDIwLjUsMjIgTDIwLjUsMjcgQzIwLjUsMjcuMjc2MTQyNCAyMC4yNzYxNDI0LDI3LjUgMjAsMjcuNSBDMTkuNzU0NTQwMSwyNy41IDE5LjU1MDM5MTYsMjcuMzIzMTI0OCAxOS41MDgwNTU3LDI3LjA4OTg3NTYgTDE5LjUsMjcgTDE5LjUsMjIgQzE5LjUsMjEuNzIzODU3NiAxOS43MjM4NTc2LDIxLjUgMjAsMjEuNSBaIE0yNywxOS41IEMyNy4yNzYxNDI0LDE5LjUgMjcuNSwxOS43MjM4NTc2IDI3LjUsMjAgQzI3LjUsMjAuMjQ1NDU5OSAyNy4zMjMxMjQ4LDIwLjQ0OTYwODQgMjcuMDg5ODc1NiwyMC40OTE5NDQzIEwyNywyMC41IEwyMiwyMC41IEMyMS43MjM4NTc2LDIwLjUgMjEuNSwyMC4yNzYxNDI0IDIxLjUsMjAgQzIxLjUsMTkuNzU0NTQwMSAyMS42NzY4NzUyLDE5LjU1MDM5MTYgMjEuOTEwMTI0NCwxOS41MDgwNTU3IEwyMiwxOS41IEwyNywxOS41IFogTTE4LDE5LjUgQzE4LjI3NjE0MjQsMTkuNSAxOC41LDE5LjcyMzg1NzYgMTguNSwyMCBDMTguNSwyMC4yNDU0NTk5IDE4LjMyMzEyNDgsMjAuNDQ5NjA4NCAxOC4wODk4NzU2LDIwLjQ5MTk0NDMgTDE4LDIwLjUgTDEzLDIwLjUgQzEyLjcyMzg1NzYsMjAuNSAxMi41LDIwLjI3NjE0MjQgMTIuNSwyMCBDMTIuNSwxOS43NTQ1NDAxIDEyLjY3Njg3NTIsMTkuNTUwMzkxNiAxMi45MTAxMjQ0LDE5LjUwODA1NTcgTDEzLDE5LjUgTDE4LDE5LjUgWiBNMjAsMTIuNSBDMjAuMjQ1NDU5OSwxMi41IDIwLjQ0OTYwODQsMTIuNjc2ODc1MiAyMC40OTE5NDQzLDEyLjkxMDEyNDQgTDIwLjUsMTMgTDIwLjUsMTggQzIwLjUsMTguMjc2MTQyNCAyMC4yNzYxNDI0LDE4LjUgMjAsMTguNSBDMTkuNzU0NTQwMSwxOC41IDE5LjU1MDM5MTYsMTguMzIzMTI0OCAxOS41MDgwNTU3LDE4LjA4OTg3NTYgTDE5LjUsMTggTDE5LjUsMTMgQzE5LjUsMTIuNzIzODU3NiAxOS43MjM4NTc2LDEyLjUgMjAsMTIuNSBaIiBpZD0i5b2i54q257uT5ZCIIiBmaWxsPSIjMjEyMzI0IiBmaWxsLXJ1bGU9Im5vbnplcm8iPjwvcGF0aD4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+";
|
2867
|
+
var text = "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNDdweCIgaGVpZ2h0PSI0MHB4IiB2aWV3Qm94PSIwIDAgNDcgNDAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDYwLjEgKDg4MTMzKSAtIGh0dHBzOi8vc2tldGNoLmNvbSAtLT4KICAgIDx0aXRsZT50ZXh0LWN1cnNvcjwvdGl0bGU+CiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KICAgIDxkZWZzPgogICAgICAgIDxwYXRoIGQ9Ik0xNiwyNi41IEMxNS43MjM4NTc2LDI2LjUgMTUuNSwyNi4yNzYxNDI0IDE1LjUsMjYgQzE1LjUsMjUuNzU0NTQwMSAxNS42NzY4NzUyLDI1LjU1MDM5MTYgMTUuOTEwMTI0NCwyNS41MDgwNTU3IEwxNiwyNS41IEwxOS41LDI1LjUgTDE5LjUsMTQuNSBMMTYsMTQuNSBDMTUuNzIzODU3NiwxNC41IDE1LjUsMTQuMjc2MTQyNCAxNS41LDE0IEMxNS41LDEzLjc1NDU0MDEgMTUuNjc2ODc1MiwxMy41NTAzOTE2IDE1LjkxMDEyNDQsMTMuNTA4MDU1NyBMMTYsMTMuNSBMMjQsMTMuNSBDMjQuMjc2MTQyNCwxMy41IDI0LjUsMTMuNzIzODU3NiAyNC41LDE0IEMyNC41LDE0LjI0NTQ1OTkgMjQuMzIzMTI0OCwxNC40NDk2MDg0IDI0LjA4OTg3NTYsMTQuNDkxOTQ0MyBMMjQsMTQuNSBMMjAuNSwxNC41IEwyMC41LDI1LjUgTDI0LDI1LjUgQzI0LjI3NjE0MjQsMjUuNSAyNC41LDI1LjcyMzg1NzYgMjQuNSwyNiBDMjQuNSwyNi4yNDU0NTk5IDI0LjMyMzEyNDgsMjYuNDQ5NjA4NCAyNC4wODk4NzU2LDI2LjQ5MTk0NDMgTDI0LDI2LjUgTDE2LDI2LjUgWiIgaWQ9InBhdGgtMSI+PC9wYXRoPgogICAgICAgIDxmaWx0ZXIgeD0iLTI4NC4wJSIgeT0iLTgxLjUlIiB3aWR0aD0iNjY4LjElIiBoZWlnaHQ9IjI5My45JSIgZmlsdGVyVW5pdHM9Im9iamVjdEJvdW5kaW5nQm94IiBpZD0iZmlsdGVyLTIiPgogICAgICAgICAgICA8ZmVNb3JwaG9sb2d5IHJhZGl1cz0iMSIgb3BlcmF0b3I9ImRpbGF0ZSIgaW49IlNvdXJjZUFscGhhIiByZXN1bHQ9InNoYWRvd1NwcmVhZE91dGVyMSI+PC9mZU1vcnBob2xvZ3k+CiAgICAgICAgICAgIDxmZU9mZnNldCBkeD0iMCIgZHk9IjIiIGluPSJzaGFkb3dTcHJlYWRPdXRlcjEiIHJlc3VsdD0ic2hhZG93T2Zmc2V0T3V0ZXIxIj48L2ZlT2Zmc2V0PgogICAgICAgICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIzIiBpbj0ic2hhZG93T2Zmc2V0T3V0ZXIxIiByZXN1bHQ9InNoYWRvd0JsdXJPdXRlcjEiPjwvZmVHYXVzc2lhbkJsdXI+CiAgICAgICAgICAgIDxmZUNvbXBvc2l0ZSBpbj0ic2hhZG93Qmx1ck91dGVyMSIgaW4yPSJTb3VyY2VBbHBoYSIgb3BlcmF0b3I9Im91dCIgcmVzdWx0PSJzaGFkb3dCbHVyT3V0ZXIxIj48L2ZlQ29tcG9zaXRlPgogICAgICAgICAgICA8ZmVDb2xvck1hdHJpeCB2YWx1ZXM9IjAgMCAwIDAgMCAgIDAgMCAwIDAgMCAgIDAgMCAwIDAgMCAgMCAwIDAgMC4xNiAwIiB0eXBlPSJtYXRyaXgiIGluPSJzaGFkb3dCbHVyT3V0ZXIxIj48L2ZlQ29sb3JNYXRyaXg+CiAgICAgICAgPC9maWx0ZXI+CiAgICA8L2RlZnM+CiAgICA8ZyBpZD0i6aG16Z2iLTQiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSJXaGl0ZWJvYXJkLUd1aWRlbGluZXMiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0zODguMDAwMDAwLCAtNjcyLjAwMDAwMCkiPgogICAgICAgICAgICA8ZyBpZD0idGV4dC1jdXJzb3IiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDM5Mi4wMDAwMDAsIDY3Mi4wMDAwMDApIj4KICAgICAgICAgICAgICAgIDxyZWN0IGlkPSLnn6nlvaLlpIfku70tNDAiIGZpbGw9IiNGRkZGRkYiIG9wYWNpdHk9IjAuMDEiIHg9IjAiIHk9IjAiIHdpZHRoPSI0MCIgaGVpZ2h0PSI0MCIgcng9IjIiPjwvcmVjdD4KICAgICAgICAgICAgICAgIDxnIGlkPSLlvaLnirbnu5PlkIgiIGZpbGwtcnVsZT0ibm9uemVybyI+CiAgICAgICAgICAgICAgICAgICAgPHVzZSBmaWxsPSJibGFjayIgZmlsbC1vcGFjaXR5PSIxIiBmaWx0ZXI9InVybCgjZmlsdGVyLTIpIiB4bGluazpocmVmPSIjcGF0aC0xIj48L3VzZT4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBzdHJva2U9IiNGRkZGRkYiIHN0cm9rZS13aWR0aD0iMSIgZD0iTTE5LDI1IEwxOSwxNSBMMTYsMTUgQzE1LjQ0NzcxNTMsMTUgMTUsMTQuNTUyMjg0NyAxNSwxNCBDMTUsMTMuNTE0NTg5NyAxNS4zNDc5OTkzLDEzLjEwMTkxNSAxNS44NjU0ODc3LDEzLjAxMDA1MjEgTDE2LDEzIEwyNCwxMyBDMjQuNTUyMjg0NywxMyAyNSwxMy40NDc3MTUzIDI1LDE0IEMyNSwxNC40ODU0MTAzIDI0LjY1MjAwMDcsMTQuODk4MDg1IDI0LjEzNDUxMjMsMTQuOTg5OTQ3OSBMMjQsMTUgTDIxLDE1IEwyMSwyNSBMMjQsMjUgQzI0LjU1MjI4NDcsMjUgMjUsMjUuNDQ3NzE1MyAyNSwyNiBDMjUsMjYuNDg1NDEwMyAyNC42NTIwMDA3LDI2Ljg5ODA4NSAyNC4xMzQ1MTIzLDI2Ljk4OTk0NzkgTDI0LDI3IEwxNiwyNyBDMTUuNDQ3NzE1MywyNyAxNSwyNi41NTIyODQ3IDE1LDI2IEMxNSwyNS41MTQ1ODk3IDE1LjM0Nzk5OTMsMjUuMTAxOTE1IDE1Ljg2NTQ4NzcsMjUuMDEwMDUyMSBMMTYsMjUgTDE5LDI1IFoiIGZpbGw9IiMyMTIzMjQiIGZpbGwtcnVsZT0iZXZlbm9kZCI+PC9wYXRoPgogICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICA8L2c+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4=";
|
2868
|
+
const ApplianceMap = {
|
2869
|
+
[ApplianceNames.pencil]: pencil,
|
2870
|
+
[ApplianceNames.selector]: selector,
|
2871
|
+
[ApplianceNames.eraser]: eraser,
|
2872
|
+
[ApplianceNames.shape]: shape,
|
2873
|
+
[ApplianceNames.text]: text
|
2874
|
+
};
|
2875
|
+
class Cursor extends Base {
|
2876
|
+
constructor(manager, addCursorChangeListener, cursors, memberId, cursorManager, wrapper) {
|
2877
|
+
super(manager);
|
2878
|
+
this.cursors = cursors;
|
2879
|
+
this.memberId = memberId;
|
2880
|
+
this.cursorManager = cursorManager;
|
2881
|
+
this.wrapper = wrapper;
|
2882
|
+
this.onCursorChange = (position, state) => {
|
2883
|
+
var _a;
|
2884
|
+
if (position.type === "main") {
|
2885
|
+
const rect = this.cursorManager.wrapperRect;
|
2886
|
+
if (this.component && rect) {
|
2887
|
+
this.autoHidden();
|
2888
|
+
this.moveCursor(position, rect, this.manager.mainView);
|
2889
|
+
}
|
2890
|
+
} else {
|
2891
|
+
const focusView = this.cursorManager.focusView;
|
2892
|
+
const viewRect = (_a = focusView == null ? void 0 : focusView.divElement) == null ? void 0 : _a.getBoundingClientRect();
|
2893
|
+
const viewCamera = focusView == null ? void 0 : focusView.camera;
|
2894
|
+
if (focusView && viewRect && viewCamera && this.component) {
|
2895
|
+
this.autoHidden();
|
2896
|
+
this.moveCursor(position, viewRect, focusView);
|
2897
|
+
}
|
2898
|
+
}
|
2899
|
+
if (state && state === CursorState.Leave) {
|
2900
|
+
this.hide();
|
2901
|
+
}
|
2902
|
+
};
|
2903
|
+
this.setMember();
|
2904
|
+
this.createCursor();
|
2905
|
+
addCursorChangeListener(this.memberId, this.onCursorChange);
|
2906
|
+
this.autoHidden();
|
2907
|
+
}
|
2908
|
+
moveCursor(cursor, rect, view) {
|
2909
|
+
var _a, _b;
|
2910
|
+
const { x, y, type } = cursor;
|
2911
|
+
const point = view == null ? void 0 : view.screen.convertPointToScreen(x, y);
|
2912
|
+
if (point) {
|
2913
|
+
let translateX = point.x - 2;
|
2914
|
+
let translateY = point.y - 18;
|
2915
|
+
if (type === "app") {
|
2916
|
+
const wrapperRect = this.cursorManager.wrapperRect;
|
2917
|
+
if (wrapperRect) {
|
2918
|
+
translateX = translateX + rect.x - wrapperRect.x;
|
2919
|
+
translateY = translateY + rect.y - wrapperRect.y;
|
2920
|
+
}
|
2921
|
+
}
|
2922
|
+
if (point.x < 0 || point.x > rect.width || point.y < 0 || point.y > rect.height) {
|
2923
|
+
(_a = this.component) == null ? void 0 : _a.$set({ visible: false, x: translateX, y: translateY });
|
2924
|
+
} else {
|
2925
|
+
(_b = this.component) == null ? void 0 : _b.$set({ visible: true, x: translateX, y: translateY });
|
2926
|
+
}
|
2927
|
+
}
|
2928
|
+
}
|
2929
|
+
get memberApplianceName() {
|
2930
|
+
var _a, _b;
|
2931
|
+
return (_b = (_a = this.member) == null ? void 0 : _a.memberState) == null ? void 0 : _b.currentApplianceName;
|
2932
|
+
}
|
2933
|
+
get memberColor() {
|
2934
|
+
var _a, _b;
|
2935
|
+
const rgb = (_b = (_a = this.member) == null ? void 0 : _a.memberState) == null ? void 0 : _b.strokeColor.join(",");
|
2936
|
+
return `rgb(${rgb})`;
|
2937
|
+
}
|
2938
|
+
get payload() {
|
2939
|
+
var _a;
|
2940
|
+
return (_a = this.member) == null ? void 0 : _a.payload;
|
2941
|
+
}
|
2942
|
+
get memberCursorName() {
|
2943
|
+
var _a, _b;
|
2944
|
+
return ((_a = this.payload) == null ? void 0 : _a.nickName) || ((_b = this.payload) == null ? void 0 : _b.cursorName) || this.memberId;
|
2945
|
+
}
|
2946
|
+
get memberTheme() {
|
2947
|
+
var _a;
|
2948
|
+
if ((_a = this.payload) == null ? void 0 : _a.theme) {
|
2949
|
+
return "netless-window-manager-cursor-inner-mellow";
|
2950
|
+
} else {
|
2951
|
+
return "netless-window-manager-cursor-inner";
|
2952
|
+
}
|
2953
|
+
}
|
2954
|
+
get memberCursorTextColor() {
|
2955
|
+
var _a;
|
2956
|
+
return ((_a = this.payload) == null ? void 0 : _a.cursorTextColor) || "#FFFFFF";
|
2957
|
+
}
|
2958
|
+
get memberCursorTagBackgroundColor() {
|
2959
|
+
var _a;
|
2960
|
+
return ((_a = this.payload) == null ? void 0 : _a.cursorTagBackgroundColor) || this.memberColor;
|
2961
|
+
}
|
2962
|
+
get memberAvatar() {
|
2963
|
+
var _a;
|
2964
|
+
return (_a = this.payload) == null ? void 0 : _a.avatar;
|
2965
|
+
}
|
2966
|
+
get memberOpacity() {
|
2967
|
+
if (!this.memberCursorName && !this.memberAvatar) {
|
2968
|
+
return 0;
|
2969
|
+
} else {
|
2970
|
+
return 1;
|
2971
|
+
}
|
2972
|
+
}
|
2973
|
+
get cursorState() {
|
2974
|
+
return get(this.cursors, [this.memberId, Fields.CursorState]);
|
2975
|
+
}
|
2976
|
+
get cursorPosition() {
|
2977
|
+
return get(this.cursors, [this.memberId, Fields.Position]);
|
2978
|
+
}
|
2979
|
+
autoHidden() {
|
2980
|
+
if (this.timer) {
|
2981
|
+
clearTimeout(this.timer);
|
2982
|
+
}
|
2983
|
+
this.timer = window.setTimeout(() => {
|
2984
|
+
this.hide();
|
2985
|
+
this.store.updateCursorState(this.memberId, CursorState.Leave);
|
2986
|
+
}, 1e3 * 10);
|
2987
|
+
}
|
2988
|
+
async createCursor() {
|
2989
|
+
if (this.member && this.wrapper) {
|
2990
|
+
this.component = new Cursor$1({
|
2991
|
+
target: this.wrapper,
|
2992
|
+
props: this.initProps()
|
2993
|
+
});
|
2994
|
+
}
|
2995
|
+
}
|
2996
|
+
initProps() {
|
2997
|
+
return {
|
2998
|
+
x: 0,
|
2999
|
+
y: 0,
|
3000
|
+
appliance: this.memberApplianceName,
|
3001
|
+
avatar: this.memberAvatar,
|
3002
|
+
src: this.getIcon(),
|
3003
|
+
visible: false,
|
3004
|
+
backgroundColor: this.memberColor,
|
3005
|
+
cursorName: this.memberCursorName,
|
3006
|
+
theme: this.memberTheme,
|
3007
|
+
color: this.memberCursorTextColor,
|
3008
|
+
cursorTagBackgroundColor: this.memberCursorTagBackgroundColor,
|
3009
|
+
opacity: this.memberOpacity
|
3010
|
+
};
|
3011
|
+
}
|
3012
|
+
getIcon() {
|
3013
|
+
if (this.member) {
|
3014
|
+
const applianceSrc = ApplianceMap[this.memberApplianceName || ApplianceNames.shape];
|
3015
|
+
return applianceSrc || ApplianceMap[ApplianceNames.shape];
|
3016
|
+
}
|
3017
|
+
}
|
3018
|
+
setMember() {
|
3019
|
+
this.member = this.context.findMemberByUid(this.memberId);
|
3020
|
+
this.updateComponent();
|
3021
|
+
}
|
3022
|
+
updateComponent() {
|
3023
|
+
var _a;
|
3024
|
+
(_a = this.component) == null ? void 0 : _a.$set(omit(this.initProps(), ["x", "y"]));
|
3025
|
+
}
|
3026
|
+
destroy() {
|
3027
|
+
var _a;
|
3028
|
+
if (this.component) {
|
3029
|
+
this.component.$destroy();
|
3030
|
+
}
|
3031
|
+
(_a = this.manager.refresher) == null ? void 0 : _a.remove(this.memberId);
|
3032
|
+
this.cursorManager.cursorInstances.delete(this.memberId);
|
3033
|
+
}
|
3034
|
+
hide() {
|
3035
|
+
if (this.component) {
|
3036
|
+
this.component.$set({ visible: false });
|
3037
|
+
}
|
3038
|
+
}
|
3039
|
+
}
|
3040
|
+
class CursorManager extends Base {
|
3041
|
+
constructor(appManager) {
|
3042
|
+
super(appManager);
|
3043
|
+
var _a;
|
3044
|
+
this.appManager = appManager;
|
3045
|
+
this.cursorInstances = new Map();
|
3046
|
+
this.sideEffectManager = new SideEffectManager();
|
3047
|
+
this.getUids = (members) => {
|
3048
|
+
return compact(uniq(members == null ? void 0 : members.map((member) => {
|
3049
|
+
var _a2;
|
3050
|
+
return (_a2 = member.payload) == null ? void 0 : _a2.uid;
|
3051
|
+
})));
|
3052
|
+
};
|
3053
|
+
this.handleRoomMembersChange = debounce((wrapper2) => {
|
3054
|
+
const uids = this.getUids(this.roomMembers);
|
3055
|
+
const cursors = Object.keys(this.cursors);
|
3056
|
+
if (uids == null ? void 0 : uids.length) {
|
3057
|
+
cursors.map((uid) => {
|
3058
|
+
if (uids.includes(uid) && !this.cursorInstances.has(uid)) {
|
3059
|
+
if (uid === this.context.uid) {
|
3060
|
+
return;
|
3061
|
+
}
|
3062
|
+
const component = new Cursor(this.appManager, this.addCursorChangeListener, this.cursors, uid, this, wrapper2);
|
3063
|
+
this.cursorInstances.set(uid, component);
|
3064
|
+
}
|
3065
|
+
});
|
3066
|
+
}
|
3067
|
+
}, 100);
|
3068
|
+
this.mouseMoveListener = debounce((event) => {
|
3069
|
+
this.updateCursor(this.getType(event), event.clientX, event.clientY);
|
3070
|
+
}, 5);
|
3071
|
+
this.getPoint = (view, clientX, clientY) => {
|
3072
|
+
var _a2;
|
3073
|
+
const rect = (_a2 = view == null ? void 0 : view.divElement) == null ? void 0 : _a2.getBoundingClientRect();
|
3074
|
+
if (rect) {
|
3075
|
+
const point = view == null ? void 0 : view.convertToPointInWorld({
|
3076
|
+
x: clientX - rect.x,
|
3077
|
+
y: clientY - rect.y
|
3078
|
+
});
|
3079
|
+
return point;
|
3080
|
+
}
|
3081
|
+
};
|
3082
|
+
this.getType = (event) => {
|
3083
|
+
var _a2;
|
3084
|
+
const target = event.target;
|
3085
|
+
const focusApp = this.appManager.focusApp;
|
3086
|
+
switch (target.parentElement) {
|
3087
|
+
case this.mainViewElement: {
|
3088
|
+
return { type: "main" };
|
3089
|
+
}
|
3090
|
+
case ((_a2 = focusApp == null ? void 0 : focusApp.view) == null ? void 0 : _a2.divElement): {
|
3091
|
+
return { type: "app" };
|
3092
|
+
}
|
3093
|
+
default: {
|
3094
|
+
return { type: "main" };
|
3095
|
+
}
|
3096
|
+
}
|
3097
|
+
};
|
3098
|
+
this.mouseLeaveListener = () => {
|
3099
|
+
this.hideCursor(this.context.uid);
|
3100
|
+
this.store.updateCursorState(this.context.uid, CursorState.Leave);
|
3101
|
+
};
|
3102
|
+
this.addCursorChangeListener = (uid, callback) => {
|
3103
|
+
var _a2;
|
3104
|
+
(_a2 = this.manager.refresher) == null ? void 0 : _a2.add(uid, () => {
|
3105
|
+
const disposer = autorun(() => {
|
3106
|
+
const position = get(this.cursors, [uid, Fields.Position]);
|
3107
|
+
const state = get(this.cursors, [uid, Fields.CursorState]);
|
3108
|
+
if (position) {
|
3109
|
+
callback(position, state);
|
3110
|
+
}
|
3111
|
+
});
|
3112
|
+
return disposer;
|
3113
|
+
});
|
3114
|
+
};
|
3115
|
+
this.roomMembers = (_a = this.appManager.room) == null ? void 0 : _a.state.roomMembers;
|
3116
|
+
const wrapper = WindowManager.wrapper;
|
3117
|
+
if (wrapper) {
|
3118
|
+
this.setupWrapper(wrapper);
|
3119
|
+
}
|
3120
|
+
emitter.on("onReconnected", () => {
|
3121
|
+
this.onReconnect();
|
3122
|
+
});
|
3123
|
+
}
|
3124
|
+
setupWrapper(wrapper) {
|
3125
|
+
var _a;
|
3126
|
+
if ((_a = this.manager.refresher) == null ? void 0 : _a.hasReactor("cursors")) {
|
3127
|
+
this.destroy();
|
3128
|
+
}
|
3129
|
+
this.sideEffectManager.add(() => {
|
3130
|
+
wrapper.addEventListener("pointerenter", this.mouseMoveListener);
|
3131
|
+
wrapper.addEventListener("pointermove", this.mouseMoveListener);
|
3132
|
+
wrapper.addEventListener("pointerleave", this.mouseLeaveListener);
|
3133
|
+
return () => {
|
3134
|
+
wrapper.removeEventListener("pointerenter", this.mouseMoveListener);
|
3135
|
+
wrapper.removeEventListener("pointermove", this.mouseMoveListener);
|
3136
|
+
wrapper.removeEventListener("pointerleave", this.mouseLeaveListener);
|
3137
|
+
};
|
3138
|
+
});
|
3139
|
+
this.initCursorAttributes();
|
3140
|
+
this.wrapperRect = wrapper.getBoundingClientRect();
|
3141
|
+
this.startReaction(wrapper);
|
3142
|
+
}
|
3143
|
+
setMainViewDivElement(div) {
|
3144
|
+
this.mainViewElement = div;
|
3145
|
+
}
|
3146
|
+
startReaction(wrapper) {
|
3147
|
+
var _a;
|
3148
|
+
(_a = this.manager.refresher) == null ? void 0 : _a.add("cursors", () => {
|
3149
|
+
return onObjectInserted(this.cursors, () => {
|
3150
|
+
this.handleRoomMembersChange(wrapper);
|
3151
|
+
});
|
3152
|
+
});
|
3153
|
+
}
|
3154
|
+
get cursors() {
|
3155
|
+
var _a;
|
3156
|
+
return (_a = this.manager.attributes) == null ? void 0 : _a[Fields.Cursors];
|
3157
|
+
}
|
3158
|
+
get boxState() {
|
3159
|
+
return this.store.getBoxState();
|
3160
|
+
}
|
3161
|
+
get focusView() {
|
3162
|
+
var _a;
|
3163
|
+
return (_a = this.appManager.focusApp) == null ? void 0 : _a.view;
|
3164
|
+
}
|
3165
|
+
updateCursor(event, clientX, clientY) {
|
3166
|
+
if (this.wrapperRect && this.manager.canOperate) {
|
3167
|
+
const view = event.type === "main" ? this.appManager.mainView : this.focusView;
|
3168
|
+
const point = this.getPoint(view, clientX, clientY);
|
3169
|
+
if (point) {
|
3170
|
+
this.setNormalCursorState();
|
3171
|
+
this.store.updateCursor(this.context.uid, __spreadValues({
|
3172
|
+
x: point.x,
|
3173
|
+
y: point.y
|
3174
|
+
}, event));
|
3175
|
+
}
|
3176
|
+
}
|
3177
|
+
}
|
3178
|
+
initCursorAttributes() {
|
3179
|
+
this.store.updateCursor(this.context.uid, {
|
3180
|
+
x: 0,
|
3181
|
+
y: 0,
|
3182
|
+
type: "main"
|
3183
|
+
});
|
3184
|
+
this.store.updateCursorState(this.context.uid, CursorState.Leave);
|
3185
|
+
}
|
3186
|
+
setNormalCursorState() {
|
3187
|
+
const cursorState = this.store.getCursorState(this.context.uid);
|
3188
|
+
if (cursorState !== CursorState.Normal) {
|
3189
|
+
this.store.updateCursorState(this.context.uid, CursorState.Normal);
|
3190
|
+
}
|
3191
|
+
}
|
3192
|
+
updateContainerRect() {
|
3193
|
+
var _a, _b;
|
3194
|
+
this.containerRect = (_a = WindowManager.container) == null ? void 0 : _a.getBoundingClientRect();
|
3195
|
+
this.wrapperRect = (_b = WindowManager.wrapper) == null ? void 0 : _b.getBoundingClientRect();
|
3196
|
+
}
|
3197
|
+
setRoomMembers(members) {
|
3198
|
+
this.roomMembers = members;
|
3199
|
+
this.cursorInstances.forEach((cursor) => {
|
3200
|
+
cursor.setMember();
|
3201
|
+
});
|
3202
|
+
if (WindowManager.wrapper) {
|
3203
|
+
this.handleRoomMembersChange(WindowManager.wrapper);
|
3204
|
+
}
|
3205
|
+
}
|
3206
|
+
deleteCursor(uid) {
|
3207
|
+
this.store.cleanCursor(uid);
|
3208
|
+
const cursor = this.cursorInstances.get(uid);
|
3209
|
+
if (cursor) {
|
3210
|
+
cursor.destroy();
|
3211
|
+
}
|
3212
|
+
}
|
3213
|
+
hideCursor(uid) {
|
3214
|
+
const cursor = this.cursorInstances.get(uid);
|
3215
|
+
if (cursor) {
|
3216
|
+
cursor.hide();
|
3217
|
+
}
|
3218
|
+
}
|
3219
|
+
cleanMemberAttributes(members) {
|
3220
|
+
const uids = this.getUids(members);
|
3221
|
+
const needDeleteIds = [];
|
3222
|
+
const cursors = Object.keys(this.cursors);
|
3223
|
+
cursors.map((cursorId) => {
|
3224
|
+
const index = uids.findIndex((id) => id === cursorId);
|
3225
|
+
if (index === -1) {
|
3226
|
+
needDeleteIds.push(cursorId);
|
3227
|
+
}
|
3228
|
+
});
|
3229
|
+
needDeleteIds.forEach((uid) => {
|
3230
|
+
this.deleteCursor(uid);
|
3231
|
+
});
|
3232
|
+
}
|
3233
|
+
onReconnect() {
|
3234
|
+
var _a;
|
3235
|
+
if (this.cursorInstances.size) {
|
3236
|
+
this.cursorInstances.forEach((cursor) => cursor.destroy());
|
3237
|
+
this.cursorInstances.clear();
|
3238
|
+
}
|
3239
|
+
this.roomMembers = (_a = this.appManager.room) == null ? void 0 : _a.state.roomMembers;
|
3240
|
+
if (WindowManager.wrapper) {
|
3241
|
+
this.handleRoomMembersChange(WindowManager.wrapper);
|
3242
|
+
}
|
3243
|
+
}
|
3244
|
+
destroy() {
|
3245
|
+
var _a;
|
3246
|
+
this.sideEffectManager.flushAll();
|
3247
|
+
if (this.cursorInstances.size) {
|
3248
|
+
this.cursorInstances.forEach((cursor) => {
|
3249
|
+
cursor.destroy();
|
3250
|
+
});
|
3251
|
+
this.cursorInstances.clear();
|
3252
|
+
}
|
3253
|
+
(_a = this.manager.refresher) == null ? void 0 : _a.remove("cursors");
|
3254
|
+
}
|
3255
|
+
}
|
3256
|
+
class ReconnectRefresher {
|
3257
|
+
constructor(ctx) {
|
3258
|
+
this.ctx = ctx;
|
3259
|
+
this.reactors = new Map();
|
3260
|
+
this.disposers = new Map();
|
3261
|
+
this.onPhaseChanged = (phase) => {
|
3262
|
+
if (phase === RoomPhase.Connected && this.phase === RoomPhase.Reconnecting) {
|
3263
|
+
this.onReconnected();
|
3264
|
+
}
|
3265
|
+
this.phase = phase;
|
3266
|
+
};
|
3267
|
+
this.onReconnected = debounce(() => {
|
3268
|
+
log("onReconnected refresh reactors");
|
3269
|
+
this.releaseDisposers();
|
3270
|
+
this.reactors.forEach((func, id) => {
|
3271
|
+
if (isFunction(func)) {
|
3272
|
+
this.disposers.set(id, func());
|
3273
|
+
}
|
3274
|
+
});
|
3275
|
+
this.ctx.emitter.emit("onReconnected", void 0);
|
3276
|
+
}, 3e3);
|
3277
|
+
}
|
3278
|
+
setRoom(room) {
|
3279
|
+
this.room = room;
|
3280
|
+
this.phase = room == null ? void 0 : room.phase;
|
3281
|
+
room == null ? void 0 : room.callbacks.off("onPhaseChanged", this.onPhaseChanged);
|
3282
|
+
room == null ? void 0 : room.callbacks.on("onPhaseChanged", this.onPhaseChanged);
|
3283
|
+
}
|
3284
|
+
setContext(ctx) {
|
3285
|
+
this.ctx = ctx;
|
3286
|
+
}
|
3287
|
+
releaseDisposers() {
|
3288
|
+
this.disposers.forEach((disposer) => {
|
3289
|
+
if (isFunction(disposer)) {
|
3290
|
+
disposer();
|
3291
|
+
}
|
3292
|
+
});
|
3293
|
+
this.disposers.clear();
|
3294
|
+
}
|
3295
|
+
add(id, func) {
|
3296
|
+
if (isFunction(func)) {
|
3297
|
+
this.reactors.set(id, func);
|
3298
|
+
this.disposers.set(id, func());
|
3299
|
+
}
|
3300
|
+
}
|
3301
|
+
remove(id) {
|
3302
|
+
if (this.reactors.has(id)) {
|
3303
|
+
this.reactors.delete(id);
|
3304
|
+
}
|
3305
|
+
const disposer = this.disposers.get(id);
|
3306
|
+
if (disposer) {
|
3307
|
+
if (isFunction(disposer)) {
|
3308
|
+
disposer();
|
3309
|
+
}
|
3310
|
+
this.disposers.delete(id);
|
3311
|
+
}
|
3312
|
+
}
|
3313
|
+
hasReactor(id) {
|
3314
|
+
return this.reactors.has(id);
|
3315
|
+
}
|
3316
|
+
destroy() {
|
3317
|
+
var _a;
|
3318
|
+
(_a = this.room) == null ? void 0 : _a.callbacks.off("onPhaseChanged", this.onPhaseChanged);
|
3319
|
+
this.releaseDisposers();
|
3320
|
+
}
|
3321
|
+
}
|
3322
|
+
const replaceRoomFunction = (room, manager) => {
|
3323
|
+
if (isPlayer(room)) {
|
3324
|
+
const player = room;
|
3325
|
+
const originSeek = player.seekToProgressTime;
|
3326
|
+
async function newSeek(time) {
|
3327
|
+
const seekResult = await originSeek.call(player, time);
|
3328
|
+
if (seekResult === "success") {
|
3329
|
+
emitter.emit("seek", time);
|
3330
|
+
}
|
3331
|
+
return seekResult;
|
3332
|
+
}
|
3333
|
+
player.seekToProgressTime = newSeek;
|
3334
|
+
} else {
|
3335
|
+
const descriptor = Object.getOwnPropertyDescriptor(room, "disableCameraTransform");
|
3336
|
+
if (descriptor)
|
3337
|
+
return;
|
3338
|
+
Object.defineProperty(room, "disableCameraTransform", {
|
3339
|
+
get() {
|
3340
|
+
return manager.mainView.disableCameraTransform;
|
3341
|
+
},
|
3342
|
+
set(disable) {
|
3343
|
+
manager.mainView.disableCameraTransform = disable;
|
3344
|
+
}
|
3345
|
+
});
|
3346
|
+
Object.defineProperty(room, "canUndoSteps", {
|
3347
|
+
get() {
|
3348
|
+
return manager.mainView.canUndoSteps;
|
3349
|
+
}
|
3350
|
+
});
|
3351
|
+
Object.defineProperty(room, "canRedoSteps", {
|
3352
|
+
get() {
|
3353
|
+
return manager.mainView.canRedoSteps;
|
3354
|
+
}
|
3355
|
+
});
|
3356
|
+
room.moveCamera = (camera) => manager.mainView.moveCamera(camera);
|
3357
|
+
room.moveCameraToContain = (...args) => manager.moveCameraToContain(...args);
|
3358
|
+
room.convertToPointInWorld = (...args) => manager.mainView.convertToPointInWorld(...args);
|
3359
|
+
room.setCameraBound = (...args) => manager.mainView.setCameraBound(...args);
|
3360
|
+
room.scenePreview = (...args) => manager.mainView.scenePreview(...args);
|
3361
|
+
room.fillSceneSnapshot = (...args) => manager.mainView.fillSceneSnapshot(...args);
|
3362
|
+
room.generateScreenshot = (...args) => manager.mainView.generateScreenshot(...args);
|
3363
|
+
room.setMemberState = (...args) => manager.mainView.setMemberState(...args);
|
3364
|
+
room.redo = () => manager.mainView.redo();
|
3365
|
+
room.undo = () => manager.mainView.undo();
|
3366
|
+
room.cleanCurrentScene = () => manager.mainView.cleanCurrentScene();
|
3367
|
+
}
|
3368
|
+
};
|
3369
|
+
var style$2 = "";
|
3370
|
+
const setupBuiltin = () => {
|
3371
|
+
if (WindowManager.debug) {
|
3372
|
+
setOptions({ verbose: true });
|
3373
|
+
}
|
3374
|
+
WindowManager.register({
|
3375
|
+
kind: AppDocsViewer.kind,
|
3376
|
+
src: AppDocsViewer
|
3377
|
+
});
|
3378
|
+
WindowManager.register({
|
3379
|
+
kind: AppMediaPlayer.kind,
|
3380
|
+
src: AppMediaPlayer
|
3381
|
+
});
|
3382
|
+
};
|
3383
|
+
const BuiltinApps = {
|
3384
|
+
DocsViewer: AppDocsViewer.kind,
|
3385
|
+
MediaPlayer: AppMediaPlayer.kind
|
3386
|
+
};
|
3387
|
+
const setupWrapper = (root) => {
|
3388
|
+
const playground = document.createElement("div");
|
3389
|
+
playground.className = "netless-window-manager-playground";
|
3390
|
+
const sizer = document.createElement("div");
|
3391
|
+
sizer.className = "netless-window-manager-sizer";
|
3392
|
+
const wrapper = document.createElement("div");
|
3393
|
+
wrapper.className = "netless-window-manager-wrapper";
|
3394
|
+
const mainViewElement = document.createElement("div");
|
3395
|
+
mainViewElement.className = "netless-window-manager-main-view";
|
3396
|
+
playground.appendChild(sizer);
|
3397
|
+
sizer.appendChild(wrapper);
|
3398
|
+
wrapper.appendChild(mainViewElement);
|
3399
|
+
root.appendChild(playground);
|
3400
|
+
WindowManager.wrapper = wrapper;
|
3401
|
+
return { playground, wrapper, sizer, mainViewElement };
|
3402
|
+
};
|
3403
|
+
var style$1 = "";
|
3404
|
+
var style = "";
|
3405
|
+
const emitter = new Emittery();
|
3406
|
+
const callbacks = new Emittery();
|
3407
|
+
const reconnectRefresher = new ReconnectRefresher({ emitter });
|
3408
|
+
const _WindowManager = class extends InvisiblePlugin {
|
3409
|
+
constructor(context2) {
|
3410
|
+
super(context2);
|
3411
|
+
this.version = "0.4.0-canary.16";
|
3412
|
+
this.emitter = callbacks;
|
3413
|
+
this.viewMode = ViewMode.Broadcaster;
|
3414
|
+
this.isReplay = isPlayer(this.displayer);
|
3415
|
+
_WindowManager.displayer = context2.displayer;
|
3416
|
+
}
|
3417
|
+
static async mount(params) {
|
3418
|
+
const room = params.room;
|
3419
|
+
_WindowManager.container = params.container;
|
3420
|
+
const containerSizeRatio = params.containerSizeRatio;
|
3421
|
+
const debug = params.debug;
|
3422
|
+
const cursor = params.cursor;
|
3423
|
+
_WindowManager.params = params;
|
3424
|
+
this.checkVersion();
|
3425
|
+
if (isRoom(room)) {
|
3426
|
+
if (room.phase !== RoomPhase.Connected) {
|
3427
|
+
throw new Error("[WindowManager]: Room only Connected can be mount");
|
3428
|
+
}
|
3429
|
+
if (room.phase === RoomPhase.Connected && room.isWritable) {
|
3430
|
+
room.disableSerialization = false;
|
3431
|
+
}
|
3432
|
+
}
|
3433
|
+
if (_WindowManager.isCreated) {
|
3434
|
+
throw new Error("[WindowManager]: Already created cannot be created again");
|
3435
|
+
}
|
3436
|
+
let manager = await this.initManager(room);
|
3437
|
+
this.debug = Boolean(debug);
|
3438
|
+
log("Already insert room", manager);
|
3439
|
+
if (isRoom(this.displayer)) {
|
3440
|
+
if (!manager) {
|
3441
|
+
throw new Error("[WindowManager]: init InvisiblePlugin failed");
|
3442
|
+
}
|
3443
|
+
} else {
|
3444
|
+
await pRetry(async (count) => {
|
3445
|
+
manager = await this.initManager(room);
|
3446
|
+
if (!manager) {
|
3447
|
+
log(`manager is empty. retrying ${count}`);
|
3448
|
+
throw new Error();
|
3449
|
+
}
|
3450
|
+
}, { retries: 10 });
|
3451
|
+
}
|
3452
|
+
if (containerSizeRatio) {
|
3453
|
+
_WindowManager.containerSizeRatio = containerSizeRatio;
|
3454
|
+
}
|
3455
|
+
await manager.ensureAttributes();
|
3456
|
+
manager.appManager = new AppManager(manager);
|
3457
|
+
if (cursor) {
|
3458
|
+
manager.cursorManager = new CursorManager(manager.appManager);
|
3459
|
+
}
|
3460
|
+
if (params.container) {
|
3461
|
+
manager.bindContainer(params.container);
|
3462
|
+
}
|
3463
|
+
replaceRoomFunction(room, manager);
|
3464
|
+
emitter.emit("onCreated");
|
3465
|
+
_WindowManager.isCreated = true;
|
3466
|
+
try {
|
3467
|
+
await initDb();
|
3468
|
+
} catch (error) {
|
3469
|
+
console.warn("[WindowManager]: indexedDB open failed");
|
3470
|
+
console.log(error);
|
3471
|
+
}
|
3472
|
+
return manager;
|
3473
|
+
}
|
3474
|
+
static async initManager(room) {
|
3475
|
+
let manager = room.getInvisiblePlugin(_WindowManager.kind);
|
3476
|
+
if (!manager) {
|
3477
|
+
if (isRoom(room)) {
|
3478
|
+
if (room.isWritable === false) {
|
3479
|
+
try {
|
3480
|
+
await room.setWritable(true);
|
3481
|
+
} catch (error) {
|
3482
|
+
throw new Error("[WindowManger]: room must be switched to be writable");
|
3483
|
+
}
|
3484
|
+
manager = await room.createInvisiblePlugin(_WindowManager, {});
|
3485
|
+
manager.ensureAttributes();
|
3486
|
+
await wait(500);
|
3487
|
+
await room.setWritable(false);
|
3488
|
+
} else {
|
3489
|
+
manager = await room.createInvisiblePlugin(_WindowManager, {});
|
3490
|
+
}
|
3491
|
+
}
|
3492
|
+
}
|
3493
|
+
return manager;
|
3494
|
+
}
|
3495
|
+
static initContainer(manager, container, chessboard, overwriteStyles) {
|
3496
|
+
if (!_WindowManager.container) {
|
3497
|
+
_WindowManager.container = container;
|
3498
|
+
}
|
3499
|
+
const { playground, wrapper, sizer, mainViewElement } = setupWrapper(container);
|
3500
|
+
_WindowManager.playground = playground;
|
3501
|
+
if (chessboard) {
|
3502
|
+
sizer.classList.add("netless-window-manager-chess-sizer");
|
3503
|
+
}
|
3504
|
+
if (overwriteStyles) {
|
3505
|
+
const style2 = document.createElement("style");
|
3506
|
+
style2.textContent = overwriteStyles;
|
3507
|
+
playground.appendChild(style2);
|
3508
|
+
}
|
3509
|
+
manager.containerResizeObserver = ContainerResizeObserver.create(playground, sizer, wrapper, emitter);
|
3510
|
+
_WindowManager.wrapper = wrapper;
|
3511
|
+
return mainViewElement;
|
3512
|
+
}
|
3513
|
+
bindContainer(container) {
|
3514
|
+
var _a, _b, _c, _d, _e, _f;
|
3515
|
+
if (_WindowManager.isCreated && _WindowManager.container) {
|
3516
|
+
if (_WindowManager.container.firstChild) {
|
3517
|
+
container.appendChild(_WindowManager.container.firstChild);
|
3518
|
+
}
|
3519
|
+
} else {
|
3520
|
+
if (_WindowManager.params) {
|
3521
|
+
const params = _WindowManager.params;
|
3522
|
+
const mainViewElement = _WindowManager.initContainer(this, container, params.chessboard, params.overwriteStyles);
|
3523
|
+
const boxManager = createBoxManager(this, callbacks, emitter, {
|
3524
|
+
collectorContainer: params.collectorContainer,
|
3525
|
+
collectorStyles: params.collectorStyles,
|
3526
|
+
prefersColorScheme: params.prefersColorScheme
|
3527
|
+
});
|
3528
|
+
this.boxManager = boxManager;
|
3529
|
+
(_a = this.appManager) == null ? void 0 : _a.setBoxManager(boxManager);
|
3530
|
+
this.bindMainView(mainViewElement, params.disableCameraTransform);
|
3531
|
+
if (_WindowManager.wrapper) {
|
3532
|
+
(_b = this.cursorManager) == null ? void 0 : _b.setupWrapper(_WindowManager.wrapper);
|
3533
|
+
}
|
3534
|
+
}
|
3535
|
+
}
|
3536
|
+
(_c = this.boxManager) == null ? void 0 : _c.updateManagerRect();
|
3537
|
+
(_d = this.appManager) == null ? void 0 : _d.refresh();
|
3538
|
+
(_e = this.appManager) == null ? void 0 : _e.resetMaximized();
|
3539
|
+
(_f = this.appManager) == null ? void 0 : _f.resetMinimized();
|
3540
|
+
_WindowManager.container = container;
|
3541
|
+
}
|
3542
|
+
bindCollectorContainer(container) {
|
3543
|
+
if (_WindowManager.isCreated && this.boxManager) {
|
3544
|
+
this.boxManager.setCollectorContainer(container);
|
3545
|
+
} else {
|
3546
|
+
if (_WindowManager.params) {
|
3547
|
+
_WindowManager.params.collectorContainer = container;
|
3548
|
+
}
|
3549
|
+
}
|
3550
|
+
}
|
3551
|
+
static register(params) {
|
3552
|
+
return appRegister.register(params);
|
3553
|
+
}
|
3554
|
+
async addApp(params) {
|
3555
|
+
var _a, _b, _c;
|
3556
|
+
if (this.appManager) {
|
3557
|
+
if (!params.kind || typeof params.kind !== "string") {
|
3558
|
+
throw new ParamsInvalidError();
|
3559
|
+
}
|
3560
|
+
const appImpl = await ((_a = appRegister.appClasses.get(params.kind)) == null ? void 0 : _a());
|
3561
|
+
if (appImpl && ((_b = appImpl.config) == null ? void 0 : _b.singleton)) {
|
3562
|
+
if (this.appManager.appProxies.has(params.kind)) {
|
3563
|
+
throw new AppCreateError();
|
3564
|
+
}
|
3565
|
+
}
|
3566
|
+
const isDynamicPPT = this.setupScenePath(params, this.appManager);
|
3567
|
+
if (isDynamicPPT === void 0) {
|
3568
|
+
return;
|
3569
|
+
}
|
3570
|
+
if ((_c = params == null ? void 0 : params.options) == null ? void 0 : _c.scenePath) {
|
3571
|
+
params.options.scenePath = ensureValidScenePath(params.options.scenePath);
|
3572
|
+
}
|
3573
|
+
const appId = await this.appManager.addApp(params, Boolean(isDynamicPPT));
|
3574
|
+
return appId;
|
3575
|
+
} else {
|
3576
|
+
throw new AppManagerNotInitError();
|
3577
|
+
}
|
3578
|
+
}
|
3579
|
+
setupScenePath(params, appManager) {
|
3580
|
+
var _a, _b, _c;
|
3581
|
+
let isDynamicPPT = false;
|
3582
|
+
if (params.options) {
|
3583
|
+
const { scenePath, scenes } = params.options;
|
3584
|
+
if (scenePath) {
|
3585
|
+
if (!isValidScenePath(scenePath)) {
|
3586
|
+
throw new InvalidScenePath();
|
3587
|
+
}
|
3588
|
+
const apps = Object.keys(this.apps || {});
|
3589
|
+
for (const appId of apps) {
|
3590
|
+
const appScenePath = appManager.store.getAppScenePath(appId);
|
3591
|
+
if (appScenePath && appScenePath === scenePath) {
|
3592
|
+
console.warn(`[WindowManager]: ScenePath ${scenePath} Already opened`);
|
3593
|
+
if (this.boxManager) {
|
3594
|
+
const topBox = this.boxManager.getTopBox();
|
3595
|
+
if (topBox) {
|
3596
|
+
this.boxManager.setZIndex(appId, topBox.zIndex + 1, false);
|
3597
|
+
}
|
3598
|
+
}
|
3599
|
+
return;
|
3600
|
+
}
|
3601
|
+
}
|
3602
|
+
}
|
3603
|
+
if (scenePath && scenes && scenes.length > 0) {
|
3604
|
+
if (this.isDynamicPPT(scenes)) {
|
3605
|
+
isDynamicPPT = true;
|
3606
|
+
if (!this.displayer.entireScenes()[scenePath]) {
|
3607
|
+
(_a = this.room) == null ? void 0 : _a.putScenes(scenePath, scenes);
|
3608
|
+
}
|
3609
|
+
} else {
|
3610
|
+
if (!this.displayer.entireScenes()[scenePath]) {
|
3611
|
+
(_b = this.room) == null ? void 0 : _b.putScenes(scenePath, [{ name: scenes[0].name }]);
|
3612
|
+
}
|
3613
|
+
}
|
3614
|
+
}
|
3615
|
+
if (scenePath && scenes === void 0) {
|
3616
|
+
(_c = this.room) == null ? void 0 : _c.putScenes(scenePath, [{}]);
|
3617
|
+
}
|
3618
|
+
}
|
3619
|
+
return isDynamicPPT;
|
3620
|
+
}
|
3621
|
+
async setMainViewScenePath(scenePath) {
|
3622
|
+
if (this.appManager) {
|
3623
|
+
await this.appManager.setMainViewScenePath(scenePath);
|
3624
|
+
}
|
3625
|
+
}
|
3626
|
+
async setMainViewSceneIndex(index) {
|
3627
|
+
if (this.appManager) {
|
3628
|
+
await this.appManager.setMainViewSceneIndex(index);
|
3629
|
+
}
|
3630
|
+
}
|
3631
|
+
getMainViewScenePath() {
|
3632
|
+
var _a;
|
3633
|
+
return (_a = this.appManager) == null ? void 0 : _a.store.getMainViewScenePath();
|
3634
|
+
}
|
3635
|
+
getMainViewSceneIndex() {
|
3636
|
+
var _a;
|
3637
|
+
return (_a = this.appManager) == null ? void 0 : _a.store.getMainViewSceneIndex();
|
3638
|
+
}
|
3639
|
+
setReadonly(readonly) {
|
3640
|
+
var _a;
|
3641
|
+
this.readonly = readonly;
|
3642
|
+
(_a = this.boxManager) == null ? void 0 : _a.setReadonly(readonly);
|
3643
|
+
}
|
3644
|
+
switchMainViewToWriter() {
|
3645
|
+
var _a;
|
3646
|
+
return (_a = this.appManager) == null ? void 0 : _a.mainViewProxy.mainViewClickHandler();
|
3647
|
+
}
|
3648
|
+
onAppDestroy(kind, listener) {
|
3649
|
+
addEmitterOnceListener(`destroy-${kind}`, listener);
|
3650
|
+
}
|
3651
|
+
setViewMode(mode) {
|
3652
|
+
var _a, _b, _c;
|
3653
|
+
if (!this.canOperate)
|
3654
|
+
return;
|
3655
|
+
if (mode === ViewMode.Broadcaster) {
|
3656
|
+
(_a = this.appManager) == null ? void 0 : _a.mainViewProxy.setCameraAndSize();
|
3657
|
+
(_b = this.appManager) == null ? void 0 : _b.mainViewProxy.start();
|
3658
|
+
}
|
3659
|
+
if (mode === ViewMode.Freedom) {
|
3660
|
+
(_c = this.appManager) == null ? void 0 : _c.mainViewProxy.stop();
|
3661
|
+
}
|
3662
|
+
this.viewMode = mode;
|
3663
|
+
}
|
3664
|
+
get mainView() {
|
3665
|
+
if (this.appManager) {
|
3666
|
+
return this.appManager.mainViewProxy.view;
|
3667
|
+
} else {
|
3668
|
+
throw new AppManagerNotInitError();
|
3669
|
+
}
|
3670
|
+
}
|
3671
|
+
get camera() {
|
3672
|
+
if (this.appManager) {
|
3673
|
+
return this.appManager.mainViewProxy.view.camera;
|
3674
|
+
} else {
|
3675
|
+
throw new AppManagerNotInitError();
|
3676
|
+
}
|
3677
|
+
}
|
3678
|
+
get cameraState() {
|
3679
|
+
if (this.appManager) {
|
3680
|
+
return this.appManager.mainViewProxy.cameraState;
|
3681
|
+
} else {
|
3682
|
+
throw new AppManagerNotInitError();
|
3683
|
+
}
|
3684
|
+
}
|
3685
|
+
get apps() {
|
3686
|
+
var _a;
|
3687
|
+
return (_a = this.appManager) == null ? void 0 : _a.store.apps();
|
3688
|
+
}
|
3689
|
+
get boxState() {
|
3690
|
+
var _a;
|
3691
|
+
if (this.appManager) {
|
3692
|
+
return (_a = this.appManager.boxManager) == null ? void 0 : _a.boxState;
|
3693
|
+
} else {
|
3694
|
+
throw new AppManagerNotInitError();
|
3695
|
+
}
|
3696
|
+
}
|
3697
|
+
get darkMode() {
|
3698
|
+
var _a, _b;
|
3699
|
+
return Boolean((_b = (_a = this.appManager) == null ? void 0 : _a.boxManager) == null ? void 0 : _b.darkMode);
|
3700
|
+
}
|
3701
|
+
get prefersColorScheme() {
|
3702
|
+
var _a;
|
3703
|
+
if (this.appManager) {
|
3704
|
+
return (_a = this.appManager.boxManager) == null ? void 0 : _a.prefersColorScheme;
|
3705
|
+
} else {
|
3706
|
+
throw new AppManagerNotInitError();
|
3707
|
+
}
|
3708
|
+
}
|
3709
|
+
get focused() {
|
3710
|
+
return this.attributes.focus;
|
3711
|
+
}
|
3712
|
+
get mainViewSceneIndex() {
|
3713
|
+
var _a;
|
3714
|
+
return (_a = this.appManager) == null ? void 0 : _a.store.getMainViewSceneIndex();
|
3715
|
+
}
|
3716
|
+
get mainViewSceneDir() {
|
3717
|
+
var _a;
|
3718
|
+
const scenePath = (_a = this.appManager) == null ? void 0 : _a.store.getMainViewScenePath();
|
3719
|
+
if (scenePath) {
|
3720
|
+
return parseSceneDir(scenePath);
|
3721
|
+
} else {
|
3722
|
+
throw new Error("[WindowManager]: mainViewSceneDir not found");
|
3723
|
+
}
|
3724
|
+
}
|
3725
|
+
queryAll() {
|
3726
|
+
var _a;
|
3727
|
+
return Array.from(((_a = this.appManager) == null ? void 0 : _a.appProxies.values()) || []);
|
3728
|
+
}
|
3729
|
+
queryOne(appId) {
|
3730
|
+
var _a;
|
3731
|
+
return (_a = this.appManager) == null ? void 0 : _a.appProxies.get(appId);
|
3732
|
+
}
|
3733
|
+
async closeApp(appId) {
|
3734
|
+
var _a;
|
3735
|
+
return (_a = this.appManager) == null ? void 0 : _a.closeApp(appId);
|
3736
|
+
}
|
3737
|
+
moveCamera(camera) {
|
3738
|
+
this.mainView.moveCamera(camera);
|
3739
|
+
}
|
3740
|
+
moveCameraToContain(rectangle) {
|
3741
|
+
var _a;
|
3742
|
+
this.mainView.moveCameraToContain(rectangle);
|
3743
|
+
(_a = this.appManager) == null ? void 0 : _a.dispatchInternalEvent(Events.MoveCameraToContain, rectangle);
|
3744
|
+
setTimeout(() => {
|
3745
|
+
var _a2;
|
3746
|
+
(_a2 = this.appManager) == null ? void 0 : _a2.mainViewProxy.setCameraAndSize();
|
3747
|
+
}, 1e3);
|
3748
|
+
}
|
3749
|
+
convertToPointInWorld(point) {
|
3750
|
+
return this.mainView.convertToPointInWorld(point);
|
3751
|
+
}
|
3752
|
+
setCameraBound(cameraBound) {
|
3753
|
+
this.mainView.setCameraBound(cameraBound);
|
3754
|
+
}
|
3755
|
+
onDestroy() {
|
3756
|
+
this._destroy();
|
3757
|
+
}
|
3758
|
+
destroy() {
|
3759
|
+
this._destroy();
|
3760
|
+
}
|
3761
|
+
_destroy() {
|
3762
|
+
var _a, _b, _c, _d;
|
3763
|
+
(_a = this.containerResizeObserver) == null ? void 0 : _a.disconnect();
|
3764
|
+
(_b = this.appManager) == null ? void 0 : _b.destroy();
|
3765
|
+
(_c = this.cursorManager) == null ? void 0 : _c.destroy();
|
3766
|
+
_WindowManager.container = void 0;
|
3767
|
+
_WindowManager.wrapper = void 0;
|
3768
|
+
_WindowManager.isCreated = false;
|
3769
|
+
if (_WindowManager.playground) {
|
3770
|
+
(_d = _WindowManager.playground.parentNode) == null ? void 0 : _d.removeChild(_WindowManager.playground);
|
3771
|
+
}
|
3772
|
+
_WindowManager.params = void 0;
|
3773
|
+
log("Destroyed");
|
3774
|
+
}
|
3775
|
+
bindMainView(divElement, disableCameraTransform) {
|
3776
|
+
var _a;
|
3777
|
+
if (this.appManager) {
|
3778
|
+
this.appManager.bindMainView(divElement, Boolean(disableCameraTransform));
|
3779
|
+
(_a = this.cursorManager) == null ? void 0 : _a.setMainViewDivElement(divElement);
|
3780
|
+
}
|
3781
|
+
}
|
3782
|
+
get canOperate() {
|
3783
|
+
if (isRoom(this.displayer)) {
|
3784
|
+
return this.displayer.isWritable && this.displayer.phase === RoomPhase.Connected;
|
3785
|
+
} else {
|
3786
|
+
return false;
|
3787
|
+
}
|
3788
|
+
}
|
3789
|
+
get room() {
|
3790
|
+
return this.displayer;
|
3791
|
+
}
|
3792
|
+
safeSetAttributes(attributes) {
|
3793
|
+
if (this.canOperate) {
|
3794
|
+
this.setAttributes(attributes);
|
3795
|
+
}
|
3796
|
+
}
|
3797
|
+
safeUpdateAttributes(keys, value) {
|
3798
|
+
if (this.canOperate) {
|
3799
|
+
this.updateAttributes(keys, value);
|
3800
|
+
}
|
3801
|
+
}
|
3802
|
+
setPrefersColorScheme(scheme) {
|
3803
|
+
var _a, _b;
|
3804
|
+
(_b = (_a = this.appManager) == null ? void 0 : _a.boxManager) == null ? void 0 : _b.setPrefersColorScheme(scheme);
|
3805
|
+
}
|
3806
|
+
isDynamicPPT(scenes) {
|
3807
|
+
var _a, _b;
|
3808
|
+
const sceneSrc = (_b = (_a = scenes[0]) == null ? void 0 : _a.ppt) == null ? void 0 : _b.src;
|
3809
|
+
return sceneSrc == null ? void 0 : sceneSrc.startsWith("pptx://");
|
3810
|
+
}
|
3811
|
+
static checkVersion() {
|
3812
|
+
const version = getVersionNumber(WhiteVersion);
|
3813
|
+
if (version < getVersionNumber(REQUIRE_VERSION)) {
|
3814
|
+
throw new WhiteWebSDKInvalidError(REQUIRE_VERSION);
|
3815
|
+
}
|
3816
|
+
}
|
3817
|
+
async ensureAttributes() {
|
3818
|
+
if (isNull(this.attributes)) {
|
3819
|
+
await wait(50);
|
3820
|
+
}
|
3821
|
+
if (isObject(this.attributes)) {
|
3822
|
+
if (!this.attributes[Fields.Apps]) {
|
3823
|
+
this.safeSetAttributes({ [Fields.Apps]: {} });
|
3824
|
+
}
|
3825
|
+
if (!this.attributes[Fields.Cursors]) {
|
3826
|
+
this.safeSetAttributes({ [Fields.Cursors]: {} });
|
3827
|
+
}
|
3828
|
+
const sceneState = this.displayer.state.sceneState;
|
3829
|
+
if (!this.attributes["_mainScenePath"]) {
|
3830
|
+
this.safeSetAttributes({ _mainScenePath: sceneState.scenePath });
|
3831
|
+
}
|
3832
|
+
if (!this.attributes["_mainSceneIndex"]) {
|
3833
|
+
this.safeSetAttributes({ _mainSceneIndex: sceneState.index });
|
3834
|
+
}
|
3835
|
+
}
|
3836
|
+
}
|
3837
|
+
};
|
3838
|
+
let WindowManager = _WindowManager;
|
3839
|
+
WindowManager.kind = "WindowManager";
|
3840
|
+
WindowManager.debug = false;
|
3841
|
+
WindowManager.containerSizeRatio = DEFAULT_CONTAINER_RATIO;
|
3842
|
+
WindowManager.isCreated = false;
|
3843
|
+
setupBuiltin();
|
3844
|
+
export { BuiltinApps, WindowManager, callbacks, emitter, reconnectRefresher };
|
2
3845
|
//# sourceMappingURL=index.es.js.map
|