// reactive component for displaying the menu filesComponent = (el) => new Proxy({ html: (data) => `

${data.tabs.map( (t) => ` ` ).join('') }



`, tabs: [ {name: "offline", id: "localFiles"} ], show: false, $localFiles: $localFiles = el.querySelector("#localFiles"), toggle(state){ this.show = state !== undefined ? state : !this.show }, remove(){ el.parent.remove(el) }, init(opts){ this.decorateFileButton() // create HTML element el.innerHTML = this.html(this) for( i in this ) el[i] = this[i] this.toggle(this.show) // trigger visibility document.querySelector("#messages").appendChild(el); // setup input listeners (['click']).map( (e) => el.addEventListener(e, (ev) => this[e] && this[e](ev.target.id,ev) ) ) // signal ready setTimeout( () => { document.dispatchEvent( new CustomEvent("$files:ready", {detail: {$files:this,xrf}}) ) },100) return this }, decorateFileButton: function(){ // rename button document.querySelector("#load").setAttribute("value","3D file") // decorate fileLoaders window.frontend.fileLoaders = ( (fileLoaders) => { this.fileLoaders = fileLoaders return () => this.toggle() })( window.frontend.fileLoaders ) }, click(id,e){ switch(id){ case "icon": case "more": return this.toggle(); break; } } }, { get(me,k,v){ return me[k] }, set(me,k,v){ me[k] = v switch( k ){ case "show":{ el.style.display = v ? '' : 'none'; if( v ) $chat.visible = true break; } case "tabs":{ el.innerHTML = $files.html($files) break; } } }, renderButtons: (data) => `${data.buttons.join('')}` }) // reactify component! document.addEventListener('$chat:ready', (e) => { window.$files = filesComponent( document.createElement('div') ).init(e.detail) })