diff options
Diffstat (limited to 'src/main/scala/reading/Route.scala')
-rw-r--r-- | src/main/scala/reading/Route.scala | 55 |
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("?", "&", "") +} |