aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/reading/Route.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/scala/reading/Route.scala')
-rw-r--r--src/main/scala/reading/Route.scala55
1 files changed, 41 insertions, 14 deletions
diff --git a/src/main/scala/reading/Route.scala b/src/main/scala/reading/Route.scala
index 9295d49..76a9431 100644
--- a/src/main/scala/reading/Route.scala
+++ b/src/main/scala/reading/Route.scala
@@ -6,12 +6,12 @@ import scala.scalajs.js.URIUtils
import rx.Var
-import reading.models.{ Filter, FilterKind }
+import reading.models.{ Filter, FilterKind, Book, Books => BooksModel }
sealed trait Route
object Route {
- case class Books(filters: Seq[Filter]) extends Route
+ case class Books(filters: Seq[Filter] = Nil, detail: Option[Book] = None) extends Route
val current: Var[Route] = Var(parse(window.location.hash))
@@ -22,20 +22,22 @@ object Route {
def parse(hash: String): Route =
pathAndParams(hash) match {
case ("books" :: Nil, params) => {
- val filters = params.flatMap { param =>
- param.split("=") match {
- case Array(kind, nonFormattedName) =>
- for {
- kind <- FilterKind.withNameOption(kind)
- filter <- Filter(kind, nonFormattedName)
- } yield filter
- case _ => None
- }
+ val filters = params.flatMap {
+ case Param(key, value) =>
+ for {
+ kind <- FilterKind.withNameOption(key)
+ filter <- Filter(kind, value)
+ } yield filter
+ case _ =>
+ None
}
- Books(filters)
+ val detail = params.collectFirst {
+ case Param("detail", title) => BooksModel().find(_.title == title)
+ }.flatten
+ Books(filters, detail)
}
case _ =>
- Books(Nil)
+ Books()
}
def pathAndParams(hash: String): (List[String], List[String]) = {
@@ -48,7 +50,11 @@ object Route {
def url(route: Route): String = {
val hash = route match {
- case Books(filters) => "/books" ++ (if (filters.nonEmpty) filters.map(filter => s"${filter.kind}=${filter.nonFormattedName}").mkString("?", "&", "") else "")
+ case Books(filters, detail) => {
+ val filterParams = filters.map(filter => (filter.kind.toString, filter.nonFormattedName))
+ val detailParams = detail.map(book => ("detail", book.title))
+ s"/books${Param.format(filterParams ++ detailParams)}"
+ }
case _ => "/books"
}
window.location.origin + window.location.pathname + "#" + URIUtils.encodeURI(hash)
@@ -63,3 +69,24 @@ object Route {
window.history.pushState(null, "", url(route));
}
}
+
+object Param {
+ def apply(key: String, value: String): (String, String) = (key, value)
+ def unapply(x: Any): Option[(String, String)] =
+ x match {
+ case str: String =>
+ str.split("=") match {
+ case Array(key, value) => Some((key, value))
+ case _ => None
+ }
+ case _ => None
+ }
+
+ def format(params: Seq[(String, String)]): String =
+ if (params.isEmpty)
+ ""
+ else
+ params
+ .map { case (key, value) => s"$key=$value" }
+ .mkString("?", "&", "")
+}