Compare commits

...

2 Commits

Author SHA1 Message Date
efim 11e65c009c add very dummy own card controls 2023-04-27 21:07:35 +04:00
efim 107e7507f4 front other players - move to separate file 2023-04-27 20:58:53 +04:00
3 changed files with 76 additions and 32 deletions

View File

@ -0,0 +1,44 @@
package industries.sunshine.planningpoker
import scala.scalajs.js
import com.raquo.laminar.api.L.{*, given}
import industries.sunshine.planningpoker.common.Models.*
object OtherPlayers {
def render(roomStateSignal: Signal[RoomStateView]): Element = {
val otherPlayers = roomStateSignal.map { state =>
state.players.filterNot(_.id == state.me).zipWithIndex
}
div(
className := "flex flex-row",
children <-- otherPlayers.split(_._1.id) { (id, initial, playerSignal) =>
renderPlayer(playerSignal, roomStateSignal.map(_.allowedCards.size))
}
)
}
def renderPlayer(p: Signal[(Player, Int)], cardsAmount: Signal[Int]): Element = {
val xOffsetStyleSignal = p.map(_._2)
div(
className := "w-20 h-20 border-2 border-amber-400 m-2 absolute",
// left <-- p.map(tuple => ((1 + tuple._2) * 10000).toString()),
styleAttr <-- p.map(tuple => s"left: ${(1 + tuple._2) * 100}px"),
child.text <-- p.map(_._1.name),
renderHandCardBacks(cardsAmount)
)
}
def renderHandCardBacks(amountSignal: Signal[Int]): Element = {
def renderCard(index: Int): Element =
div(
className := "w-4 h-8 m-1 rounded bg-gray-600 text-yellow"
)
div(
className := "flex flex-row",
children <-- amountSignal.map { amount => (1 to amount).map(renderCard) }
)
}
}

View File

@ -0,0 +1,30 @@
package industries.sunshine.planningpoker
import scala.scalajs.js
import com.raquo.laminar.api.L.{*, given}
import industries.sunshine.planningpoker.common.Models.*
object OwnHandControls {
def render(roomStateSignal: Signal[RoomStateView]): Element = {
val a = 1
div(
className := "flex flex-row justify-center",
renderCard("xs"),
renderCard("s"),
renderCard("m"),
renderCard("l"),
)
}
def renderCard(value: String): Element = {
div(
className := "w-24 h-48 m-1 rounded flex justify-center items-center m-3",
className := "text-black bg-gray-50 border-black border-2",
div(
className := "-rotate-45 text-xl",
value
)
)
}
}

View File

@ -32,46 +32,16 @@ object RoomView {
val roomStateSignal: Signal[RoomStateView] =
wsStream.received.startWith(RoomStateView.empty)
val otherPlayers = roomStateSignal.map { state =>
state.players.filterNot(_.id == state.me).zipWithIndex
}
val wsFinalDeathSignal = wsStream.closed.collect { case (_, false) => () }
div(
className := "w-full h-full border-4 border-amber-900 flex flex-col",
div(
className := "flex flex-row",
children <-- otherPlayers.split(_._1.id) { (id, initial, playerSignal) =>
renderPlayer(playerSignal, roomStateSignal.map(_.allowedCards.size))
}
),
OtherPlayers.render(roomStateSignal),
TableView.renderTable(roomStateSignal),
OwnHandControls.render(roomStateSignal),
wsStream.connect,
wsFinalDeathSignal.map(_ => false) --> loggedIn
)
}
def renderPlayer(p: Signal[(Player, Int)], cardsAmount: Signal[Int]): Element = {
val xOffsetStyleSignal = p.map(_._2)
div(
className := "w-20 h-20 border-2 border-amber-400 m-2 absolute",
// left <-- p.map(tuple => ((1 + tuple._2) * 10000).toString()),
styleAttr <-- p.map(tuple => s"left: ${(1 + tuple._2) * 100}px"),
child.text <-- p.map(_._1.name),
renderHandCardBacks(cardsAmount)
)
}
def renderHandCardBacks(amountSignal: Signal[Int]): Element = {
def renderCard(index: Int): Element =
div(
className := "w-4 h-8 m-1 rounded bg-gray-600 text-yellow"
)
div(
className := "flex flex-row",
children <-- amountSignal.map { amount => (1 to amount).map(renderCard) }
)
}
}