From 0ceee5ed4bae240b8c8e94d2fd7424d9d0b67ec7 Mon Sep 17 00:00:00 2001 From: Jakob Odersky Date: Wed, 9 Oct 2019 17:10:43 -0400 Subject: Migrate build to mill --- ui/src/JsTemplates.scala | 3 +++ ui/src/Main.scala | 30 ++++++++++++++++++++++++++ ui/src/http/XhrBackend.scala | 51 ++++++++++++++++++++++++++++++++++++++++++++ ui/src/http/package.scala | 3 +++ ui/src/main/scala/Main.scala | 30 -------------------------- 5 files changed, 87 insertions(+), 30 deletions(-) create mode 100644 ui/src/JsTemplates.scala create mode 100644 ui/src/Main.scala create mode 100644 ui/src/http/XhrBackend.scala create mode 100644 ui/src/http/package.scala delete mode 100644 ui/src/main/scala/Main.scala (limited to 'ui') diff --git a/ui/src/JsTemplates.scala b/ui/src/JsTemplates.scala new file mode 100644 index 0000000..bbb29c5 --- /dev/null +++ b/ui/src/JsTemplates.scala @@ -0,0 +1,3 @@ +package triad + +object JsTemplates extends Templates(scalatags.JsDom) diff --git a/ui/src/Main.scala b/ui/src/Main.scala new file mode 100644 index 0000000..3621b4a --- /dev/null +++ b/ui/src/Main.scala @@ -0,0 +1,30 @@ +package triad + +import spray.json._ +import ApiProtocol._ +import scalajs.js +import org.scalajs.dom +import org.scalajs.dom.html + +@js.annotation.JSExport +object Main { + + @js.annotation.JSExport + def main(root: html.Element): Unit = { + val source = new dom.EventSource("live") + + source.onmessage = (e: dom.MessageEvent) => { + val str = e.data.asInstanceOf[String] + if (str.nonEmpty) { // ignore empty strings on heartbeats + println(str) + val message = str.parseJson.convertTo[Message] + val template = JsTemplates.message(message) + root.appendChild(template.render) + dom.window + .scrollTo(0, dom.document.body.scrollHeight) // scroll to bottom + } + } + + } + +} diff --git a/ui/src/http/XhrBackend.scala b/ui/src/http/XhrBackend.scala new file mode 100644 index 0000000..3a791c1 --- /dev/null +++ b/ui/src/http/XhrBackend.scala @@ -0,0 +1,51 @@ +package triad +package http + +import org.scalajs.dom.{ErrorEvent, Event, XMLHttpRequest} + +import scala.concurrent.{Future, Promise, TimeoutException} +import scala.scalajs.js +import scala.scalajs.js.typedarray.{ArrayBuffer, Int8Array} + +trait XhrBackend extends Backend { + + def send(request: Request): Future[Response] = { + val promise = Promise[Response] + val xhr = new XMLHttpRequest() + + xhr.open(request.method, request.url) + xhr.responseType = "arraybuffer" + for ((name, value) <- request.headers) { + xhr.setRequestHeader(name, value) + } + + xhr.send(js.Array(request.body: _*)) + + xhr.onload = (e: Event) => { + val body: Array[Byte] = if (!js.isUndefined(xhr.response)) { + val buffer = new Int8Array(xhr.response.asInstanceOf[ArrayBuffer]) + buffer.toArray + } else { + Array.empty[Byte] + } + + val response = Response( + xhr.status, + Map.empty, + body + ) + promise.success(response) + } + + xhr.onerror = (e: ErrorEvent) => { + promise.failure(new RuntimeException(s"XHR error: ${e.message}")) + } + xhr.ontimeout = (e: Event) => { + promise.failure( + new TimeoutException(s"Request timed out: ${xhr.statusText}")) + } + + promise.future + } + +} diff --git a/ui/src/http/package.scala b/ui/src/http/package.scala new file mode 100644 index 0000000..7b680eb --- /dev/null +++ b/ui/src/http/package.scala @@ -0,0 +1,3 @@ +package triad + +package object http extends XhrBackend diff --git a/ui/src/main/scala/Main.scala b/ui/src/main/scala/Main.scala deleted file mode 100644 index 3621b4a..0000000 --- a/ui/src/main/scala/Main.scala +++ /dev/null @@ -1,30 +0,0 @@ -package triad - -import spray.json._ -import ApiProtocol._ -import scalajs.js -import org.scalajs.dom -import org.scalajs.dom.html - -@js.annotation.JSExport -object Main { - - @js.annotation.JSExport - def main(root: html.Element): Unit = { - val source = new dom.EventSource("live") - - source.onmessage = (e: dom.MessageEvent) => { - val str = e.data.asInstanceOf[String] - if (str.nonEmpty) { // ignore empty strings on heartbeats - println(str) - val message = str.parseJson.convertTo[Message] - val template = JsTemplates.message(message) - root.appendChild(template.render) - dom.window - .scrollTo(0, dom.document.body.scrollHeight) // scroll to bottom - } - } - - } - -} -- cgit v1.2.3