You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

95 lines
2.6 KiB

4 years ago
  1. package com.example.playscalajsreact
  2. import org.scalajs.dom
  3. import japgolly.scalajs.react._
  4. import japgolly.scalajs.react.vdom.html_<^._
  5. import japgolly.scalajs.react.extra._
  6. import com.example.playscalajsreact.component.HelloWorldSJSRComponent
  7. import japgolly.scalajs.react.extra.router._
  8. import japgolly.scalajs.react.extra.router.StaticDsl.Route
  9. import com.example.playscalajsreact.route.AppRouter
  10. import com.example.playscalajsreact.component.Content
  11. import com.example.playscalajsreact.component.Top2
  12. import com.typesafe.config.ConfigFactory
  13. import scala.scalajs.js.JSON
  14. import scala.concurrent.ExecutionContext.Implicits._
  15. import scala.util.Success
  16. import play.api.libs.json.Json
  17. import com.example.playscalajsreact.model.User
  18. import typings.std.stdStrings.auth
  19. case class Response(status: Int, response: String)
  20. case class UserForm(name: String)
  21. object UserForm {
  22. implicit val userFormFormat = Json.format[UserForm]
  23. }
  24. object ScalaJSExample {
  25. def main(args: Array[String]): Unit = {
  26. val conf = ConfigFactory.load()
  27. val backendBaseUrl = conf.getString("app.backendUrl")
  28. val userRoute = s"$backendBaseUrl/user"
  29. val authorRoute = (id: Int) => s"$backendBaseUrl/authors/$id"
  30. println(backendBaseUrl)
  31. val x = Ajax
  32. .get(s"https://jsonplaceholder.typicode.com/todos/1")
  33. .send
  34. .validateStatusIs(200)(Callback.throwException)
  35. .asAsyncCallback
  36. .map(xhr => xhr.responseText)
  37. .logResult
  38. val y = Ajax
  39. .get(userRoute)
  40. .send
  41. .validateStatusIs(200)(Callback.throwException)
  42. .asAsyncCallback
  43. .map(xhr =>
  44. Json
  45. .fromJson[UserForm](Json.parse(xhr.responseText))
  46. .getOrElse(UserForm("empty1"))
  47. )
  48. .logResult
  49. // CallbackTo.
  50. val getAuthors = Ajax
  51. .get(authorRoute(1))
  52. .send
  53. .asAsyncCallback
  54. .map(xhr => xhr.responseText)
  55. .logResult
  56. (x >> y >> getAuthors).unsafeToFuture()
  57. // x.>>=
  58. val domCallback = for {
  59. user <- y
  60. authors <- getAuthors
  61. } yield { <.div(user.name + authors) }
  62. val div = dom.document.createElement("div")
  63. dom.document.body.appendChild(div)
  64. Top2().renderIntoDOM(div)
  65. val div2 = dom.document.createElement("div")
  66. dom.document.body.appendChild(div2)
  67. def myDom(user: UserForm): VdomElement = <.div(user.name)
  68. val z = y.map(myDom)
  69. val Main = React.Suspense(
  70. fallback = <.div(
  71. ^.color := "#33c",
  72. ^.fontSize := "150%",
  73. "AJAXer in progress. Loading..."
  74. ),
  75. asyncBody = domCallback
  76. )
  77. <.div(Main)
  78. Main.renderIntoDOM(div2)
  79. }
  80. }