Compare commits
No commits in common. "ecb1717eb371f6c73030f17f8108d06320dc0552" and "9db42cb52254a821ee28adc7eb970d642959a0e2" have entirely different histories.
ecb1717eb3
...
9db42cb522
|
@ -28,7 +28,7 @@ object MyHttpService {
|
||||||
Stream
|
Stream
|
||||||
.emits(TestModels.testChangesList)
|
.emits(TestModels.testChangesList)
|
||||||
.covary[IO]
|
.covary[IO]
|
||||||
.metered(1.second) ++ Stream.never[IO]
|
.metered(1.second)
|
||||||
)
|
)
|
||||||
.map(state => WebSocketFrame.Text(state.asJson.noSpaces))
|
.map(state => WebSocketFrame.Text(state.asJson.noSpaces))
|
||||||
|
|
||||||
|
@ -48,9 +48,6 @@ object MyHttpService {
|
||||||
case GET -> Root / "new-poll" as (playerId, roomId) => {
|
case GET -> Root / "new-poll" as (playerId, roomId) => {
|
||||||
IO(println(s">> got request to start new voting from $playerId in $roomId")) >> Ok()
|
IO(println(s">> got request to start new voting from $playerId in $roomId")) >> Ok()
|
||||||
}
|
}
|
||||||
case GET -> Root / "logout" as (playerId, roomId) => {
|
|
||||||
IO(println(s">> got request to logout from $playerId in $roomId")) >> Ok()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
val authMiddleware = AuthMiddleware(auth.authUser)
|
val authMiddleware = AuthMiddleware(auth.authUser)
|
||||||
|
|
|
@ -27,7 +27,10 @@ object Main {
|
||||||
def appElement(): Element = {
|
def appElement(): Element = {
|
||||||
div(
|
div(
|
||||||
className := "w-screen h-screen flex flex-col justify-center items-center",
|
className := "w-screen h-screen flex flex-col justify-center items-center",
|
||||||
Header.render(loggedIn.writer),
|
div(
|
||||||
|
className := "h-24 w-full flex flex-for justify-center items-center bg-green-200",
|
||||||
|
p(className := "text-2xl", "Here be header")
|
||||||
|
),
|
||||||
child <-- loggedIn.signal.map(if (_) emptyNode else JoinRoomComponent.render(loggedIn.writer)),
|
child <-- loggedIn.signal.map(if (_) emptyNode else JoinRoomComponent.render(loggedIn.writer)),
|
||||||
child <-- loggedIn.signal.map(
|
child <-- loggedIn.signal.map(
|
||||||
if (_) RoomView.renderRoom(loggedIn.writer) else emptyNode
|
if (_) RoomView.renderRoom(loggedIn.writer) else emptyNode
|
||||||
|
|
|
@ -1,29 +0,0 @@
|
||||||
package industries.sunshine.planningpoker
|
|
||||||
|
|
||||||
import scala.scalajs.js
|
|
||||||
import scala.scalajs.js.annotation.*
|
|
||||||
import com.raquo.laminar.api.L.{*, given}
|
|
||||||
import io.laminext.fetch.Fetch
|
|
||||||
import io.laminext.fetch.FetchResponse
|
|
||||||
import scala.scalajs.js.Dynamic.{global => g}
|
|
||||||
|
|
||||||
import concurrent.ExecutionContext.Implicits.global
|
|
||||||
|
|
||||||
object Header {
|
|
||||||
def render(loggedIn: Observer[Boolean]): Element = {
|
|
||||||
val (responsesStream, responseReceived) = EventStream.withCallback[FetchResponse[String]]
|
|
||||||
|
|
||||||
val logoutButton = button(
|
|
||||||
"Logout",
|
|
||||||
onClick.flatMap(_ => Fetch.get("/api/logout").text) --> responseReceived,
|
|
||||||
responsesStream --> Observer(resp => g.console.info(s"${resp.toString()}")),
|
|
||||||
responsesStream.collect { case resp if resp.ok => false } --> loggedIn
|
|
||||||
)
|
|
||||||
|
|
||||||
div(
|
|
||||||
className := "h-24 w-full flex flex-for justify-center items-center bg-green-200",
|
|
||||||
p(className := "text-2xl", "Here be header"),
|
|
||||||
logoutButton
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,41 +0,0 @@
|
||||||
package industries.sunshine.planningpoker
|
|
||||||
|
|
||||||
import scala.scalajs.js
|
|
||||||
import com.raquo.laminar.api.L.{*, given}
|
|
||||||
import industries.sunshine.planningpoker.common.Models.RoundState
|
|
||||||
import com.raquo.airstream.core.Signal
|
|
||||||
import industries.sunshine.planningpoker.common.Models.RoundState
|
|
||||||
import industries.sunshine.planningpoker.common.Models.RoundState
|
|
||||||
import io.laminext.fetch.Fetch
|
|
||||||
import scala.scalajs.js.Dynamic.{global => g}
|
|
||||||
|
|
||||||
import concurrent.ExecutionContext.Implicits.global
|
|
||||||
|
|
||||||
object TableControls {
|
|
||||||
def render(roundSignal: Signal[RoundState]): Element = {
|
|
||||||
div(
|
|
||||||
child <-- roundSignal.map {
|
|
||||||
case RoundState.Viewing(_) => newPollButton()
|
|
||||||
case RoundState.Voting(_, _) => endPollButton()
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
val commonButtonStyle = "border-2 border-black rounded-xl m-2 p-1"
|
|
||||||
def endPollButton(): Element = button(
|
|
||||||
className := commonButtonStyle,
|
|
||||||
"end voting",
|
|
||||||
onClick.flatMap(_ => Fetch.get("/api/end-voting").text) --> Observer(resp =>
|
|
||||||
g.console.info(resp.toString())
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
def newPollButton(): Element = button(
|
|
||||||
className := commonButtonStyle,
|
|
||||||
"start next round",
|
|
||||||
onClick.flatMap(_ => Fetch.get("/api/new-poll").text) --> Observer(resp =>
|
|
||||||
g.console.info(resp.toString())
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
}
|
|
|
@ -11,23 +11,17 @@ object TableView {
|
||||||
// but, can't have map to player, because overall state is required.
|
// but, can't have map to player, because overall state is required.
|
||||||
// but can i split full state into several observables by that key? i think i should be able to
|
// but can i split full state into several observables by that key? i think i should be able to
|
||||||
// so, it's more efficient to share an observable, than to create multiple copies...
|
// so, it's more efficient to share an observable, than to create multiple copies...
|
||||||
def renderTable(roomStateSignal: Signal[RoomStateView]): Element = {
|
def renderTable(roundSignal: Signal[RoomStateView]): Element = {
|
||||||
val playerIdToCardTypeSignal =
|
val playerIdToCardTypeSignal =
|
||||||
roomStateSignal
|
roundSignal
|
||||||
.map(state =>
|
.map(state =>
|
||||||
state.players.map(p => p.id -> getPlayerCardType(p.id, state.round, p.name, state.me))
|
state.players.map(p => p.id -> getPlayerCardType(p.id, state.round, p.name, state.me))
|
||||||
)
|
)
|
||||||
|
|
||||||
div(
|
div(
|
||||||
className := "w-full h-full border-2 border-amber-700 flex flex-col justify-center items-center bg-green-100",
|
className := "w-full h-full border-2 border-amber-700 flex flex-row justify-center items-center bg-green-100",
|
||||||
div(
|
children <-- playerIdToCardTypeSignal.split(_._1) { (id, initial, cardTypeSignal) =>
|
||||||
className := "w-full border-2 border-amber-600 flex flex-row justify-center items-center bg-green-100",
|
renderPlayerCard(cardTypeSignal.map(_._2))
|
||||||
children <-- playerIdToCardTypeSignal.split(_._1) { (id, initial, cardTypeSignal) =>
|
|
||||||
renderPlayerCard(cardTypeSignal.map(_._2))
|
|
||||||
}
|
|
||||||
),
|
|
||||||
child <-- roomStateSignal.map { state =>
|
|
||||||
if (state.canCloseRound) TableControls.render(roomStateSignal.map(_.round)) else emptyNode
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue