Skip to content

Commit

Permalink
General cleanup.
Browse files Browse the repository at this point in the history
  • Loading branch information
oranda committed May 11, 2015
1 parent 41cd108 commit bb68113
Show file tree
Hide file tree
Showing 5 changed files with 16 additions and 99 deletions.
35 changes: 6 additions & 29 deletions app/js/src/main/scala/com/oranda/libanius/scalajs/QuizScreen.scala
Expand Up @@ -18,25 +18,14 @@

package com.oranda.libanius.scalajs

import com.oranda.libanius.model.UserResponses
import com.oranda.libanius.model.quizgroup.{WordMapping, QuizGroupHeader}
import com.oranda.libanius.model.quizitem._
import japgolly.scalajs.react.vdom.prefix_<^._
import org.scalajs.dom.{alert, document}
import scala.concurrent.Future
import org.scalajs.dom.document
import scalajs.concurrent.JSExecutionContext.Implicits.runNow
import org.scalajs.dom
import org.scalajs.dom.ext.Ajax
import scala.scalajs.js.timers._
import japgolly.scalajs.react._
import upickle._

//import scalatags.JsDom.all._

//import japgolly.scalajs.react.vdom.all._

import scala.scalajs.js.annotation.JSExport
//import scalatags.JsDom.all._

@JSExport
object QuizScreen {
Expand All @@ -56,7 +45,7 @@ object QuizScreen {
val response = QuizItemResponse.construct(curQuizItem, choice)
val data = upickle.write(response)

val sleepMillis: Double = if (response.isCorrect) 100 else 500
val sleepMillis: Double = if (response.isCorrect) 200 else 1000
Ajax.post(url, data).foreach { xhr =>
setTimeout(sleepMillis) { updateStateFromAjaxCall(xhr.responseText, scope) }
}
Expand All @@ -72,30 +61,18 @@ object QuizScreen {
// Set new quiz item and switch curQuizItem into the prevQuizItem position
scope.setState(State(newQuizItem, curQuizItem, quizItemData.scoreText))
}

}

val ScoreText = ReactComponentB[String]("ScoreText")
.render(scoreText => <.span(^.id := "score-text", ^.className := "alignleft",
"Score: " + scoreText))
.build

case class ButtonState()

val DeleteButton = ReactComponentB[Unit]("DeleteButton")
.initialState(ButtonState())
.render(_ =>
<.span(^.className := "alignright",
<.button(^.id := "delete-button", ^.onClick --> alert("TODO: removeCurrentWord()"), "DEL")))
.build

val Header = ReactComponentB[String]("Header")
.render(scoreText =>
<.span(^.id := "header-wrapper", ScoreText(scoreText),
DeleteButton(ButtonState())))
<.span(^.id := "header-wrapper", ScoreText(scoreText)))
.build

// TODO: have better types
case class Question(promptWord: String, responseType: String, numCorrectResponsesInARow: Int)

val QuestionArea = ReactComponentB[Question]("Question")
Expand Down Expand Up @@ -129,7 +106,7 @@ object QuizScreen {
.build

val PreviousQuizItemArea = ReactComponentB[Option[QuizItemReact]]("PreviousQuizItem")
.render(previousQuizItem => previousQuizItem match {
.render(_ match {
case Some(previousQuizItem: QuizItemReact) =>
<.span(^.id := "footer-wrapper",
PreviousPrompt(previousQuizItem.prompt),
Expand All @@ -145,10 +122,10 @@ object QuizScreen {
String =
chosen match {
case None => ""
case Some(chosen) =>
case Some(chosenResponse) =>
if (correctResponse == buttonValue) "correct-response"
else {
if (chosen != buttonValue) "" else "incorrect-response"
if (chosenResponse != buttonValue) "" else "incorrect-response"
}
}

Expand Down
2 changes: 1 addition & 1 deletion app/jvm/src/main/resources/application.conf
Expand Up @@ -7,7 +7,7 @@ libanius {
enableLogging = false
email = "james@oranda.com"

numCorrectAnswersRequired = 5 # 4
numCorrectAnswersRequired = 5
useMultipleChoiceUntil = 6

promptType = English word
Expand Down
55 changes: 0 additions & 55 deletions app/jvm/src/main/scala/com/oranda/libanius/server/QuizScreen.scala
Expand Up @@ -18,16 +18,10 @@

package com.oranda.libanius.server

import scala.concurrent._
import scalatags.Text.all._

object QuizScreen {
//val boot =

// @JSExport
//def main(): Unit =
//"com.oranda.libanius.scalajs.HelloMessageExample().main(document.getElementById('container'))"
//"com.oranda.libanius.scalajs.QuizScreen().main(document.getElementById('container'))"
val skeleton =
html(
head(
Expand All @@ -41,56 +35,7 @@ object QuizScreen {
script(src:="/app-fastopt.js"),
//onload:=boot,
div(cls:="center", id:="container"),
//script("com.oranda.libanius.scalajs.HelloMessageExample().main(document.getElementById('container'))")
script("com.oranda.libanius.scalajs.QuizScreen().main()")

)
)



/*
def showNextQuizItem(quizItem: QuizItemViewWithChoices, prevPrompt: String,
prevChoiceStrings: Array[String], prevResponse: String, prevCorrectResponse: String):
Result = {
future { dataStore.saveQuiz(quiz, conf.filesDir) }
Ok(Json.toJson(DataToClient(promptType = quizItem.promptType,
responseType = quizItem.responseType,
score = score,
prompt = quizItem.prompt.value,
numCorrectResponsesInARow = quizItem.numCorrectAnswersInARow,
choices = Array(quizItem.allChoices(0), quizItem.allChoices(1), quizItem.allChoices(2)),
correctResponse = quizItem.correctResponse.value,
prevPrompt = prevPrompt,
prevChoices = prevChoiceStrings,
prevResponse = prevResponse,
prevCorrectResponse = prevCorrectResponse)))
}
*/
}

/*
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Libanius: Quiz Screen</title>
<link rel="stylesheet" type="text/css" href="quiz.css"/>
</head>
<body>
<div class="center" id="container">
</div>
<P class="status-text"/>
<!-- Include Scala.js compiled code -->
<script type="text/javascript" src="./target/scala-2.11/libanius-scala-js-front-end-fastopt.js"></script>
<!-- Run tutorial.webapp.TutorialApp -->
<script type="text/javascript">
com.oranda.libanius.web.QuizScreen().main(document.getElementById('container'));
</script>
</body>
</html>
*/
Expand Up @@ -39,35 +39,31 @@ object QuizService extends AppDependencyAccess {
val promptType = config.getString("promptType")
val responseType = config.getString("responseType")

//val useMultipleChoiceUntil = config.getString("useMultipleChoiceUntil")

val qgh = dataStore.findQuizGroupHeader(promptType, responseType, WordMapping)
val qghReverse = dataStore.findQuizGroupHeader(responseType, promptType, WordMapping)

// Persistent (immutable) data structure used in this single-user local web application.
var quiz: Quiz = loadQuiz


private def loadQuiz: Quiz = {
val quizGroupHeaders = Seq(qgh, qghReverse).flatten
Quiz(quizGroupHeaders.map(qgh => (qgh, dataStore.loadQuizGroup(qgh))).toMap)
}

private def findPresentableQuizItem: Option[QuizItemViewWithChoices] =
produceQuizItem(quiz, NoParams())
produceQuizItem(quiz, NoParams())

def findNextQuizItem: DataToClient = {
val quizItemReact = findPresentableQuizItem.map { qiv =>
val promptResponseMap = makePromptResponseMap(qiv.allChoices, qiv.quizGroupHeader)
QuizItemReact.construct(qiv, promptResponseMap)
}
DataToClient(quizItemReact, score)
DataToClient(quizItemReact, scoreText)
}

def score: String = StringUtil.formatScore(quiz.scoreSoFar)
def scoreText: String = StringUtil.formatScore(quiz.scoreSoFar)

def processUserResponse(qir: QuizItemResponse): DataToClient = {

for {
qgh <- dataStore.findQuizGroupHeader(qir.promptType, qir.responseType)
quizItem <- quiz.findQuizItem(qgh, qir.prompt, qir.correctResponse)
Expand All @@ -82,10 +78,11 @@ object QuizService extends AppDependencyAccess {

private def promptToResponses(choice: String, quizGroupHeader: QuizGroupHeader):
Tuple2[String, String] = {
val values = (quiz.findPromptsFor(choice, quizGroupHeader) match {
val values = quiz.findPromptsFor(choice, quizGroupHeader) match {
case Nil => quiz.findResponsesFor(choice, quizGroupHeader.reverse)
case values => values
}).toList
case v => v
}

(choice, values.mkString(", "))
}
}
6 changes: 2 additions & 4 deletions build.sbt
@@ -1,7 +1,5 @@
import sbt.Keys._

enablePlugins(ScalaJSPlugin)

name := "Libanius Scala.js front-end"

scalaJSStage in Global := FastOptStage
Expand All @@ -26,8 +24,7 @@ val app = crossProject.settings(
"com.github.japgolly.scalajs-react" %%% "extra" % "0.8.3",
"com.lihaoyi" %%% "scalarx" % "0.2.8"
),
// React itself
// (react-with-addons.js can be react.js, react.min.js, react-with-addons.min.js)
// React itself (react-with-addons.js can be react.js, react.min.js, react-with-addons.min.js)
jsDependencies += "org.webjars" % "react" % "0.13.1" / "react-with-addons.js" commonJSName "React",
skip in packageJSDependencies := false // creates app-jsdeps.js with the react JS lib inside

Expand Down Expand Up @@ -55,6 +52,7 @@ lazy val appJVM = app.jvm.settings(
// copy resources like quiz.css to the server
resourceDirectory in Compile <<= baseDirectory(_ / "../shared/src/main/resources"),

// allow the server to access shared source
unmanagedSourceDirectories in Compile <+= baseDirectory(_ / "../shared/src/main/scala"),

// application.conf too must be in the classpath
Expand Down

0 comments on commit bb68113

Please sign in to comment.