diff options
author | Katrin Shechtman <katrin.shechtman@gmail.com> | 2016-06-13 01:23:45 -0400 |
---|---|---|
committer | Katrin Shechtman <katrin.shechtman@gmail.com> | 2016-06-13 11:48:05 -0400 |
commit | 59c9e1e4bfc45f843f89da22e0190d19403b4dc6 (patch) | |
tree | c754e73fa8ac7f7363dd5a66521e17ef1dbab03d /examples | |
parent | b69826c7bc44573f01366ef472a59def6e4f1fc5 (diff) | |
download | cbt-59c9e1e4bfc45f843f89da22e0190d19403b4dc6.tar.gz cbt-59c9e1e4bfc45f843f89da22e0190d19403b4dc6.tar.bz2 cbt-59c9e1e4bfc45f843f89da22e0190d19403b4dc6.zip |
scalajs cross project support as plugin
Diffstat (limited to 'examples')
-rw-r--r-- | examples/build-scalajs/README.md | 12 | ||||
-rw-r--r-- | examples/build-scalajs/build/build.scala | 27 | ||||
-rw-r--r-- | examples/build-scalajs/build/build/build.scala | 11 | ||||
-rw-r--r-- | examples/build-scalajs/js/src/main/scala/App.scala | 22 | ||||
-rw-r--r-- | examples/build-scalajs/js/src/main/scala/Pictures.scala | 105 | ||||
-rw-r--r-- | examples/build-scalajs/server/app.js | 39 | ||||
-rw-r--r-- | examples/build-scalajs/server/package.json | 14 | ||||
-rw-r--r-- | examples/build-scalajs/server/public/index.html | 18 | ||||
-rw-r--r-- | examples/build-scalajs/shared/src/main/scala/prototype/Picture.scala | 3 |
9 files changed, 251 insertions, 0 deletions
diff --git a/examples/build-scalajs/README.md b/examples/build-scalajs/README.md new file mode 100644 index 0000000..ecc4821 --- /dev/null +++ b/examples/build-scalajs/README.md @@ -0,0 +1,12 @@ + +Compilation instructions +------------------------------------------- +1. `cbt compile` +2. `cbt fastOptJS` + +Execution instructions +------------------------------------------- +2. `cd server` +3. `npm install` +4. `node app.js` +5. Go to http://localhost:3000 in a browser
\ No newline at end of file diff --git a/examples/build-scalajs/build/build.scala b/examples/build-scalajs/build/build.scala new file mode 100644 index 0000000..e6c794a --- /dev/null +++ b/examples/build-scalajs/build/build.scala @@ -0,0 +1,27 @@ +import cbt._ +import java.net.URL +import java.io.File +import scala.collection.immutable.Seq + +class Build( context: Context ) extends BasicBuild( context ) with ScalaJsBuild { + + override val projectName = "my-project" + + override def dependencies = ( + super.dependencies ++ + Resolver( mavenCentral ).bind( + //"org.scalatest" %%% "scalatest" % "3.0.0-RC2", + "com.github.japgolly.scalajs-react" %%% "core" % "0.10.4", // for example + // for example if you want explicitely state scala version + "org.scala-js" % "scalajs-dom_sjs0.6_2.11" % "0.9.0" + ) + ) + + /* ++ some JVM only dependencies */ + override def jvmDependencies = Seq.empty + + override def fastOptOutput = { + projectDirectory.getAbsolutePath + "/server/public/" + new File(super.fastOptOutput).getName + } +} + diff --git a/examples/build-scalajs/build/build/build.scala b/examples/build-scalajs/build/build/build.scala new file mode 100644 index 0000000..ca01ba1 --- /dev/null +++ b/examples/build-scalajs/build/build/build.scala @@ -0,0 +1,11 @@ +import cbt._ +import java.net.URL +import java.io.File +import scala.collection.immutable.Seq + +class Build( context: Context ) extends BuildBuild( context ){ + + override def dependencies = + super.dependencies :+ + BuildDependency(new File(context.cbtHome + "/plugins/scalajs")) +} diff --git a/examples/build-scalajs/js/src/main/scala/App.scala b/examples/build-scalajs/js/src/main/scala/App.scala new file mode 100644 index 0000000..2682936 --- /dev/null +++ b/examples/build-scalajs/js/src/main/scala/App.scala @@ -0,0 +1,22 @@ +package prototype + +import japgolly.scalajs.react.ReactDOM +import org.scalajs.dom + +import scala.scalajs.js +import scala.scalajs.js.JSApp +import scala.scalajs.js.annotation.JSExport +import scalajs.js.Dynamic.{global => g} + +/** + * Created by katrin on 2016-04-10. + */ +@JSExport("App") +object App extends JSApp { + + def main(): Unit = { + + val doc = dom.document + ReactDOM.render(Pictures.PictureComponent(), doc.getElementById("main")) + } +} diff --git a/examples/build-scalajs/js/src/main/scala/Pictures.scala b/examples/build-scalajs/js/src/main/scala/Pictures.scala new file mode 100644 index 0000000..88329ee --- /dev/null +++ b/examples/build-scalajs/js/src/main/scala/Pictures.scala @@ -0,0 +1,105 @@ +package prototype + +import japgolly.scalajs.react.{ReactComponentB, BackendScope, Callback} +import org.scalajs.dom + +import scala.scalajs._ +import japgolly.scalajs.react.vdom.all._ + +import scala.scalajs.js.JSON + +/** + * Created by katrin on 2016-04-10. + */ +object Pictures { + + case class State(pictures: List[Picture], favourites: List[Picture]) + + type PicClick = (String, Boolean) => Callback + + class Backend($: BackendScope[Unit, State]) { + + def onPicClick(id: String, favorite: Boolean) = + $.state flatMap { s => + if (favorite) { + val newPics = s.pictures.map(p => if (p.id == id) p.copy(favorite = false) else p) + val newFavs = s.favourites.filter(p => p.id != id) + $.modState(_ => State(newPics, newFavs)) + } else { + var newPic: Picture = null + val newPics = s.pictures.map(p => if (p.id == id) { + newPic = p.copy(favorite = true); newPic + } else p) + val newFavs = s.favourites.+:(newPic) + $.modState(_ => State(newPics, newFavs)) + } + } + + def render(s: State) = + div( + h1("Popular Pixabay Pics"), + pictureList((s.pictures, onPicClick)), + h1("Your favorites"), + favoriteList((s.favourites, onPicClick))) + } + + val picture = ReactComponentB[(Picture, PicClick)]("picture") + .render_P { case (p, b) => + div(if (p.favorite) cls := "picture favorite" else cls := "picture", onClick --> b(p.id, p.favorite))( + img(src := p.src, title := p.title) + ) + } + .build + + val pictureList = ReactComponentB[(List[Picture], PicClick)]("pictureList") + .render_P { case (list, b) => + div(`class` := "pictures")( + if (list.isEmpty) span("Loading Pics..") + else { + list.map(p => picture.withKey(p.id)((p, b))) + } + ) + } + .build + + val favoriteList = ReactComponentB[(List[Picture], PicClick)]("favoriteList") + .render_P { case (list, b) => + div(`class` := "favorites")( + if (list.isEmpty) span("Click an image to mark as favorite") + else { + list.map(p => picture.withKey(p.id)((p, b))) + } + ) + } + .build + + val PictureComponent = ReactComponentB[Unit]("PictureComponent") + .initialState(State(Nil, Nil)) + .renderBackend[Backend] + .componentDidMount(scope => Callback { + import scalajs.js.Dynamic.{global => g} + def isDefined(g: js.Dynamic): Boolean = + g.asInstanceOf[js.UndefOr[AnyRef]].isDefined + val url = "http://localhost:3000/data" + val xhr = new dom.XMLHttpRequest() + xhr.open("GET", url) + xhr.onload = { (e: dom.Event) => + if (xhr.status == 200) { + val result = JSON.parse(xhr.responseText) + if (isDefined(result) && isDefined(result.hits)) { + val hits = result.hits.asInstanceOf[js.Array[js.Dynamic]] + val pics = hits.toList.map(item => Picture( + item.id.toString, + item.pageURL.toString, + item.previewURL.toString, + if (item.tags != null) item.tags.asInstanceOf[js.Array[String]].mkString(",") else "")) + //if (item.caption != null) item.caption.text.toString else "")) + scope.modState(_ => State(pics, Nil)).runNow() + } + } + } + xhr.send() + }) + .buildU + +} diff --git a/examples/build-scalajs/server/app.js b/examples/build-scalajs/server/app.js new file mode 100644 index 0000000..620c26a --- /dev/null +++ b/examples/build-scalajs/server/app.js @@ -0,0 +1,39 @@ +var express = require('express'); +var https = require('https'); + +var app = express(); + +app.get('/data', function(req, res){ + + var request = https.get( + //'https://api.instagram.com/v1/media/popular?client_id=642176ece1e7445e99244cec26f4de1f&callback=?', + 'https://pixabay.com/api/?key=2741116-9706ac6d4a58f2b5416225505&q=yellow+flowers&image_type=photo', + function(response) { + + var body = ""; + response.on('data', function(data) { + body += data; + }); + response.on('end', function() { + console.log(body); + try { + res.send(JSON.parse(body)); + } catch (e) { + return console.error(e); + } + }); + }); + request.on('error', function(e) { + console.log('Problem with request: ' + e.message); + }); + request.end(); +}); + +app.use(express.static(__dirname + '/public')); + +var server = app.listen(3000, function () { + var host = server.address().address; + var port = server.address().port; + + console.log('Example app listening at http://%s:%s', host, port); +}); diff --git a/examples/build-scalajs/server/package.json b/examples/build-scalajs/server/package.json new file mode 100644 index 0000000..d20ec98 --- /dev/null +++ b/examples/build-scalajs/server/package.json @@ -0,0 +1,14 @@ +{ + "name": "server", + "version": "1.0.0", + "description": "prototype", + "main": "app.js", + "author": "Katrin", + "license": "UNLICENSED", + "private": true, + "dependencies": { + "express": "^4.13.3", + "express-ws": "^0.2.6", + "body-parser": "^1.14.1" + } +} diff --git a/examples/build-scalajs/server/public/index.html b/examples/build-scalajs/server/public/index.html new file mode 100644 index 0000000..08de20d --- /dev/null +++ b/examples/build-scalajs/server/public/index.html @@ -0,0 +1,18 @@ +<!DOCTYPE html> +<html> +<head> + <title>Prototype</title> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> +</head> +<body> + + <div id="main"></div> + + <script src="https://fb.me/react-15.1.0.min.js"></script> + <script src="https://fb.me/react-dom-15.1.0.min.js"></script> + <script type="text/javascript" src="./my-project-fastopt.js"></script> + <script type="text/javascript"> + App().main(); + </script> +</body> +</html> diff --git a/examples/build-scalajs/shared/src/main/scala/prototype/Picture.scala b/examples/build-scalajs/shared/src/main/scala/prototype/Picture.scala new file mode 100644 index 0000000..dbb985a --- /dev/null +++ b/examples/build-scalajs/shared/src/main/scala/prototype/Picture.scala @@ -0,0 +1,3 @@ +package prototype + +case class Picture(id: String, url: String, src: String, title: String, favorite: Boolean = false) |