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 = `
`