|
@@ -0,0 +1,60 @@
|
|
|
+// Handle messages coming from [Matrix] client if embedded as a [Widget] in some room.
|
|
|
+// [Matrix]: https://matrix.org/
|
|
|
+// [Widget]: https://docs.google.com/document/d/1uPF7XWY_dXTKVKV7jZQ2KmsI19wn9-kFRgQ1tFQP7wQ/edit
|
|
|
+
|
|
|
+class MatrixWidget {
|
|
|
+ constructor () {
|
|
|
+ this.widgetId = null
|
|
|
+ window.addEventListener('message', this.onMessage.bind(this))
|
|
|
+ }
|
|
|
+
|
|
|
+ onMessage (event) {
|
|
|
+ this.widgetId = this.widgetId || event.data.widgetId
|
|
|
+
|
|
|
+ switch (event.data.api) {
|
|
|
+ case 'fromWidget':
|
|
|
+ break
|
|
|
+ case 'toWidget':
|
|
|
+ switch (event.data.action) {
|
|
|
+ case 'capabilities':
|
|
|
+ this.sendResponse(event, {
|
|
|
+ capabilities: ['m.always_on_screen']
|
|
|
+ })
|
|
|
+ break
|
|
|
+ }
|
|
|
+ break
|
|
|
+ default:
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ sendContentLoaded () {
|
|
|
+ this.sendMessage({
|
|
|
+ action: 'content_loaded'
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ setAlwaysOnScreen (value) {
|
|
|
+ // Extension of main spec, see https://github.com/matrix-org/matrix-doc/issues/1354
|
|
|
+ this.sendMessage({
|
|
|
+ action: 'set_always_on_screen',
|
|
|
+ value: value, // once for spec compliance
|
|
|
+ data: { value: value } // and once for Riot
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ sendMessage (message) {
|
|
|
+ if (!this.widgetId) return
|
|
|
+ message.api = message.api || 'fromWidget'
|
|
|
+ message.widgetId = message.widgetId || this.widgetId
|
|
|
+ message.requestId = message.requestId || Math.random().toString(36)
|
|
|
+ window.parent.postMessage(message, '*')
|
|
|
+ }
|
|
|
+
|
|
|
+ sendResponse (event, response) {
|
|
|
+ event.data.response = response
|
|
|
+ event.source.postMessage(event.data, event.origin)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+window.matrixWidget = new MatrixWidget()
|