chatComponent = { html: `
`, init: (el) => new Proxy({ scene: null, visible: true, messages: [], $messages: $messages = el.querySelector("#messages"), $chatline: $chatline = el.querySelector("#chatline"), install(opts){ this.opts = opts this.scene = opts.scene el.className = "xrf" el.style.display = 'none' // start hidden document.body.appendChild( el ) document.dispatchEvent( new CustomEvent("$chat:ready", {detail: opts}) ) $chat.send({message:`Welcome to ${document.location.search.substr(1)}, a 3D scene(file) which simply links to other ones.
You can start a solo offline exploration in XR right away.
Type /help below, or use the arrow- or WASD-keys on your keyboard, and mouse-drag to rotate.
`, class: ["info","multiline"] }) }, initListeners(){ //opts.scene.addEventListener('meeting.peer.add', () => console.log("$chat.peer.add") ) //opts.scene.addEventListener('meeting.peer.remove', () => console.log("$chat.peer.remove") ) $chatline.addEventListener('keydown', (e) => { if (e.key == 'Enter' ){ this.send({message: $chatline.value }) $chatline.value = '' } }) console.dir(this.scene) }, toggle(){ this.visible = !this.visible if( this.visible && window.meeting.status == 'offline' ) window.meeting.start(this.opts) }, send(opts){ opts = { linebreak:true, message:"", class:[], ...opts } let div = document.createElement('div') let msg = document.createElement('div') let br = document.createElement('br') msg.className = "msg" let html = `${ opts.message || ''}${ opts.html ? opts.html(opts) : ''}` if( $messages.last == html ) return msg.innerHTML = html if( opts.el ) msg.appendChild(opts.el) opts.id = Math.random() if( opts.class ){ msg.classList.add.apply(msg.classList, opts.class) br.classList.add.apply(br.classList, opts.class) } div.appendChild(msg) $messages.appendChild(div) if( opts.linebreak ) div.appendChild(br) $messages.scrollTop = $messages.scrollHeight // scroll down document.dispatchEvent( new CustomEvent("$chat:receive", {detail: opts}) ) $messages.last = msg.innerHTML } },{ get(data,k,v){ return data[k] }, set(data,k,v){ data[k] = v switch( k ){ case "visible": { el.style.display = data.visible ? 'block' : 'none' if( !el.inited && (el.inited = true) ) data.initListeners() $menu.collapsed = !data.visible break; } } } }) } // reactify component! document.addEventListener('$menu:ready', (opts) => { opts = opts.detail document.head.innerHTML += chatComponent.css $chat = document.createElement('div') $chat.innerHTML = chatComponent.html $chat = chatComponent.init($chat) $chat.install(opts) //$menu.buttons = ([`📜 toggle text
`]) // .concat($menu.buttons) }) // alpine component for displaying meetings chatComponent.css = ` `