lila/app/views/puzzle/show.scala

69 lines
2.1 KiB
Scala

package views.html.puzzle
import controllers.routes
import play.api.libs.json.{ JsObject, Json }
import lila.api.Context
import lila.app.templating.Environment._
import lila.app.ui.ScalatagsTemplate._
import lila.common.String.html.safeJsonValue
object show {
def apply(
puzzle: lila.puzzle.Puzzle,
data: JsObject,
pref: JsObject,
difficulty: Option[lila.puzzle.PuzzleDifficulty] = None
)(implicit ctx: Context) = {
val isStreak = data.value.contains("streak")
views.html.base.layout(
title = if (isStreak) "Puzzle Streak" else trans.puzzles.txt(),
moreCss = cssTag("puzzle"),
moreJs = frag(
jsModule("puzzle"),
embedJsUnsafeLoadThen(s"""LichessPuzzle(${safeJsonValue(
Json
.obj(
"data" -> data,
"pref" -> pref,
"i18n" -> bits.jsI18n(streak = isStreak)
)
.add("themes" -> ctx.isAuth.option(bits.jsonThemes))
.add("difficulty" -> difficulty.map(_.key))
)})""")
),
csp = defaultCsp.withWebAssembly.some,
openGraph = lila.app.ui
.OpenGraph(
image = cdnUrl(routes.Export.puzzleThumbnail(puzzle.id.value).url).some,
title =
if (isStreak) "Puzzle Streak"
else s"Chess tactic #${puzzle.id} - ${puzzle.color.name.capitalize} to play",
url = s"$netBaseUrl${routes.Puzzle.show(puzzle.id.value).url}",
description =
if (isStreak) trans.puzzle.streakDescription.txt()
else
s"Lichess tactic trainer: ${puzzle.color
.fold(
trans.puzzle.findTheBestMoveForWhite,
trans.puzzle.findTheBestMoveForBlack
)
.txt()}. Played by ${puzzle.plays} players."
)
.some,
zoomable = true,
playing = true
) {
main(cls := "puzzle")(
st.aside(cls := "puzzle__side")(
div(cls := "puzzle__side__metas")
),
div(cls := "puzzle__board main-board")(chessgroundBoard),
div(cls := "puzzle__tools"),
div(cls := "puzzle__controls")
)
}
}
}