| ) | ) | ||||
| }, | }, | ||||
| } | } | ||||
| marked.setOptions({ | |||||
| breaks: true, | |||||
| }) | |||||
| addEventListener('focus', m.redraw) | addEventListener('focus', m.redraw) | ||||
| addEventListener('post', ({detail}) => { | addEventListener('post', ({detail}) => { | ||||
| Chat.posts.push(detail) | Chat.posts.push(detail) | ||||
| Chat.posts = [] | Chat.posts = [] | ||||
| Chat.unseenCount = 0 | Chat.unseenCount = 0 | ||||
| }) | }) | ||||
| marked.setOptions({ | |||||
| breaks: true, | |||||
| addEventListener('load', () => { | |||||
| Headers.push([ChatConfig]) | |||||
| Apps.push([Shadow, {key: 'chat-shadow', app: Chat}]) | |||||
| }) | }) |
| ) | ) | ||||
| }, | }, | ||||
| } | } | ||||
| const signalPeerStop = (username) => signal({kind: 'peerInfo', value: {type: 'stop'}, source: username}) | |||||
| const signalPeerStop = (username) => { | |||||
| signal({kind: 'peerInfo', value: {type: 'stop'}, source: username}) | |||||
| } | |||||
| addEventListener('pagehide', () => State.online.forEach(signalPeerStop)) | addEventListener('pagehide', () => State.online.forEach(signalPeerStop)) | ||||
| addEventListener('logout', () => State.online.forEach(signalPeerStop)) | addEventListener('logout', () => State.online.forEach(signalPeerStop)) | ||||
| addEventListener('load', () => { | |||||
| Headers.push([VideoConfig]) | |||||
| Apps.push([StreamContainer, {key: 'stream-container'}]) | |||||
| }) |
| <script src="/libs/mithril.min.js"></script> | <script src="/libs/mithril.min.js"></script> | ||||
| <script src="/libs/marked.min.js"></script> | <script src="/libs/marked.min.js"></script> | ||||
| <script src="/libs/purify.min.js"></script> | <script src="/libs/purify.min.js"></script> | ||||
| <script src="/pico.js" defer></script> | |||||
| <script src="/apps/streams.js"></script> | <script src="/apps/streams.js"></script> | ||||
| <script src="/apps/chat.js"></script> | <script src="/apps/chat.js"></script> | ||||
| <script src="/apps/volume.js"></script> | |||||
| <!-- <script src="/apps/volume.js"></script> --> | |||||
| <!-- <script src="/apps/screen.js"></script> --> | <!-- <script src="/apps/screen.js"></script> --> | ||||
| <script src="/pico.js" defer></script> | |||||
| </head> | </head> | ||||
| <body style="margin: 0; padding: 0;"> | <body style="margin: 0; padding: 0;"> | ||||
| <div>PicoChat requires JS</div> | <div>PicoChat requires JS</div> |
| } | } | ||||
| return m('main', {style: mainStyle}, | return m('main', {style: mainStyle}, | ||||
| m('header', {style: headerStyle}, | m('header', {style: headerStyle}, | ||||
| State.isConnected ? [ | |||||
| m('button', {onclick: Base.sendLogout}, 'log-out'), | |||||
| m(VideoConfig), | |||||
| m(ChatConfig), | |||||
| m('button', {onclick: VolumeMap.toggle}, 'volume'), | |||||
| // m('button', {onclick: ScreenShare.toggle}, 'screen'), | |||||
| ] : [ | |||||
| State.isConnected ? Headers.map(h => m(...h)) : [ | |||||
| m('form.login', | m('form.login', | ||||
| {onsubmit: Base.sendLogin}, | {onsubmit: Base.sendLogin}, | ||||
| m('input', attrs), | m('input', attrs), | ||||
| ], | ], | ||||
| m('span.error', State.info), | m('span.error', State.info), | ||||
| ), | ), | ||||
| State.isConnected ? [ | |||||
| m(StreamContainer, {key: 'lolo'}), | |||||
| m(Shadow, {key: 'chat-shadow', app: Chat}), | |||||
| m(Shadow, {key: 'map-shadow', app: VolumeMap}), | |||||
| // m(Shadow, {key: 'screen-shadow', app: ScreenShare}), | |||||
| ] : m(Settings), | |||||
| State.isConnected ? Apps.map(a => m(...a)) : null, | |||||
| ) | ) | ||||
| }, | }, | ||||
| } | } | ||||
| m.mount(document.body, Base) | |||||
| const Headers = [ | |||||
| ['button', {onclick: Base.sendLogout}, 'log-out'], | |||||
| // m('button', {onclick: VolumeMap.toggle}, 'volume'), | |||||
| // m('button', {onclick: ScreenShare.toggle}, 'screen'), | |||||
| ] | |||||
| const Apps = [ | |||||
| // m(Shadow, {key: 'map-shadow', app: VolumeMap}), | |||||
| // m(Shadow, {key: 'screen-shadow', app: ScreenShare}), | |||||
| ] | |||||
| addEventListener('load', () => m.mount(document.body, Base)) |