Skip to content

Instantly share code, notes, and snippets.

@busti
Created June 4, 2018 15:24
Show Gist options
  • Save busti/0e678452d8c2dd929e3ed461c4c3b54a to your computer and use it in GitHub Desktop.
Save busti/0e678452d8c2dd929e3ed461c4c3b54a to your computer and use it in GitHub Desktop.
Event stream navbar
import mhtml._
import scala.xml.Node
class Navbar {
sealed trait Event
object Events {
case object Noop extends Event
case object Open extends Event
case object Close extends Event
case object Toggle extends Event
}
case class State(
open: Boolean = false
)
val varEvents = Var(Events.Noop: Event)
val rxState = varEvents.foldp(State()) {
case (state, Events.Noop) =>
state
case (state, Events.Open) =>
state.copy(open = true)
case (state, Events.Close) =>
state.copy(open = false)
case (state, Events.Toggle) =>
state.copy(open = !state.open)
}
val rxOpenStyle = rxState.map(_.open).dropRepeats.map(if (_) "content" else "content show")
def view: Node = {
<nav>
<a class="brand">Brand</a>
<button class="navbar-toggler" type="button" onclick={ () => varEvents := Events.Toggle }>
<span></span>
</button>
<div class={ rxOpenStyle } >
<ul>
<li>
<a>Home</a>
</li>
</ul>
</div>
</nav>
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment