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.

92 lines
2.9 KiB

4 years ago
  1. package com.example.playscalajsreact
  2. import com.example.playscalajsreact.shared.SharedMessages
  3. import org.scalajs.dom
  4. import japgolly.scalajs.react._
  5. import japgolly.scalajs.react.vdom.html_<^._
  6. import japgolly.scalajs.react.extra._
  7. import com.example.playscalajsreact.model.HelloWorldSJSRComponent
  8. import japgolly.scalajs.react.extra.router._
  9. import japgolly.scalajs.react.extra.router.StaticDsl.Route
  10. object ScalaJSExample {
  11. def main(args: Array[String]): Unit = {
  12. sealed trait Page
  13. case object Home extends Page
  14. case object Hello extends Page
  15. case class Person(user: String) extends Page
  16. case class ID(id: Int) extends Page
  17. case class Menu(name: String, route: Page)
  18. val mainMenu = Vector(
  19. Menu("Home", Home),
  20. Menu("Hello", Hello)
  21. )
  22. def layout(c: RouterCtl[Page], r: Resolution[Page]) =
  23. <.ul(
  24. // c.link(Home)("Home"),
  25. // c.link(Hello)("Hello"),
  26. mainMenu.toTagMod { item =>
  27. {
  28. <.li(
  29. ^.key := item.name,
  30. item.name,
  31. c setOnClick item.route
  32. )
  33. }
  34. },
  35. r.render()
  36. )
  37. val x = <.ol(
  38. ^.id := "my-list",
  39. ^.lang := "en",
  40. ^.margin := 8.px,
  41. <.li("Item 1"),
  42. <.li("Item 2"),
  43. HelloWorldSJSRComponent("Hello", 18)
  44. )
  45. val routerConfig = RouterConfigDsl[Page].buildConfig { dsl =>
  46. import dsl._
  47. import japgolly.scalajs.react.vdom.Implicits._
  48. case class Item(category: String, itemId: java.util.UUID) extends Page
  49. // val r =
  50. // ("category" / string("[a-z]+") / "item" / int.caseClassDebug[ID])
  51. // FIXME uncomment this block to get an error - Companion object not found for class Product
  52. // case class Product(category: Int, item: Int) extends Page
  53. // val r: Route[Product] = ("cat" / int / "item" / int).caseClass[Product]
  54. // val testRoute =
  55. // ("user" / string("[a-z0-9]{1,20}") / "age" / int).pmap {
  56. // case (a, b) => {}
  57. // }
  58. (emptyRule
  59. | staticRoute(root, Home) ~> render(x)
  60. // FIXME uncomment this block to get an error - Companion object not found for class Person
  61. // | dynamicRouteCT("user" / string("[a-z0-9]{1,20}").caseClass[Person]) ~> dynRender(
  62. // (page: Person) => {
  63. // HelloWorldSJSRComponent(page.user, 0)
  64. // }
  65. // )
  66. | staticRoute("#hello", Hello) ~> render(<.div("TODO"))
  67. | staticRedirect("#hey") ~> redirectToPage(Hello)(SetRouteVia.HistoryReplace))
  68. .notFound(redirectToPage(Home)(SetRouteVia.HistoryReplace))
  69. .renderWith(layout)
  70. }
  71. // x.renderIntoDOM(dom.document.getElementById("app"))
  72. val router = Router(BaseUrl.fromWindowOrigin / "index.html", routerConfig)
  73. router().renderIntoDOM(dom.document.getElementById("app"))
  74. dom.document.getElementById("scalajsShoutOut").textContent =
  75. SharedMessages.itWorks
  76. }
  77. }