feat(15): start form, save state, decode steps
This commit is contained in:
parent
febc77032b
commit
6ed489835f
|
@ -166,6 +166,7 @@
|
||||||
<input
|
<input
|
||||||
class="mr-2 w-9 h-5 ml-2 rounded-full appearance-none mt-[0.3rem] bg-marine-blue after:absolute after:h-3 after:w-3 after:rounded-full after:border-none after:bg-neutral-100 after:transition-[background-color_0.2s,transform_0.2s] checked:after:ml-[1.2rem] after:ml-[0.25rem] after:mt-[0.25rem] hover:cursor-pointer col-start-2 row-start-1 peer"
|
class="mr-2 w-9 h-5 ml-2 rounded-full appearance-none mt-[0.3rem] bg-marine-blue after:absolute after:h-3 after:w-3 after:rounded-full after:border-none after:bg-neutral-100 after:transition-[background-color_0.2s,transform_0.2s] checked:after:ml-[1.2rem] after:ml-[0.25rem] after:mt-[0.25rem] hover:cursor-pointer col-start-2 row-start-1 peer"
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
|
name="isPackageYearly"
|
||||||
role="switch"
|
role="switch"
|
||||||
id="packageDuration"
|
id="packageDuration"
|
||||||
/>
|
/>
|
||||||
|
|
|
@ -114,6 +114,7 @@
|
||||||
<input
|
<input
|
||||||
id="multiplayer-games"
|
id="multiplayer-games"
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
|
value="OnlineService"
|
||||||
name="addon-services"
|
name="addon-services"
|
||||||
class="my-7 w-6 h-6 peer"
|
class="my-7 w-6 h-6 peer"
|
||||||
/>
|
/>
|
||||||
|
@ -137,6 +138,7 @@
|
||||||
id="larger-storage"
|
id="larger-storage"
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
name="addon-services"
|
name="addon-services"
|
||||||
|
value="LargerStorage"
|
||||||
class="my-7 w-6 h-6 peer"
|
class="my-7 w-6 h-6 peer"
|
||||||
/>
|
/>
|
||||||
<div
|
<div
|
||||||
|
@ -159,6 +161,7 @@
|
||||||
id="custom-profile"
|
id="custom-profile"
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
name="addon-services"
|
name="addon-services"
|
||||||
|
value="CustomProfile"
|
||||||
class="my-7 w-6 h-6 peer"
|
class="my-7 w-6 h-6 peer"
|
||||||
/>
|
/>
|
||||||
<div
|
<div
|
||||||
|
|
|
@ -14,19 +14,23 @@ object Models {
|
||||||
def fragmentName: String = s"step${currentStep}"
|
def fragmentName: String = s"step${currentStep}"
|
||||||
def updateStep(stepNum: Int, rawData: String): Answers = {
|
def updateStep(stepNum: Int, rawData: String): Answers = {
|
||||||
stepNum match {
|
stepNum match {
|
||||||
case 1 => this.copy(
|
case 1 =>
|
||||||
|
this.copy(
|
||||||
step1 = this.step1.fromFormData(rawData),
|
step1 = this.step1.fromFormData(rawData),
|
||||||
currentStep = stepNum + 1
|
currentStep = stepNum + 1
|
||||||
)
|
)
|
||||||
case 2 => this.copy(
|
case 2 =>
|
||||||
|
this.copy(
|
||||||
step2 = this.step2.fromFormData(rawData),
|
step2 = this.step2.fromFormData(rawData),
|
||||||
currentStep = stepNum + 1
|
currentStep = stepNum + 1
|
||||||
)
|
)
|
||||||
case 3 => this.copy(
|
case 3 =>
|
||||||
|
this.copy(
|
||||||
step3 = this.step3.fromFormData(rawData),
|
step3 = this.step3.fromFormData(rawData),
|
||||||
currentStep = stepNum + 1
|
currentStep = stepNum + 1
|
||||||
)
|
)
|
||||||
case 4 => this.copy(
|
case 4 =>
|
||||||
|
this.copy(
|
||||||
currentStep = stepNum + 1
|
currentStep = stepNum + 1
|
||||||
)
|
)
|
||||||
case _ => this
|
case _ => this
|
||||||
|
@ -50,10 +54,14 @@ object Models {
|
||||||
phone: String = ""
|
phone: String = ""
|
||||||
) extends StepAnswers {
|
) extends StepAnswers {
|
||||||
override def fromFormData(rawData: String): Step1 = {
|
override def fromFormData(rawData: String): Step1 = {
|
||||||
val fieldValues = rawData.split("&").map { field =>
|
println(s"parsing step 1 data $rawData")
|
||||||
|
val fieldValues = rawData
|
||||||
|
.split("&")
|
||||||
|
.map { field =>
|
||||||
val Array(name, value) = field.split("=")
|
val Array(name, value) = field.split("=")
|
||||||
name -> value
|
name -> value
|
||||||
}.toMap
|
}
|
||||||
|
.toMap
|
||||||
|
|
||||||
val name = fieldValues.getOrElse("name", "")
|
val name = fieldValues.getOrElse("name", "")
|
||||||
val email = fieldValues.getOrElse("email", "")
|
val email = fieldValues.getOrElse("email", "")
|
||||||
|
@ -67,15 +75,41 @@ object Models {
|
||||||
isYearly: Boolean = false
|
isYearly: Boolean = false
|
||||||
) extends StepAnswers {
|
) extends StepAnswers {
|
||||||
override def fromFormData(rawData: String): Step2 = {
|
override def fromFormData(rawData: String): Step2 = {
|
||||||
val a = 1
|
println(s"parsing step 2 data $rawData")
|
||||||
Step2()
|
val fieldValues = rawData
|
||||||
|
.split("&")
|
||||||
|
.map { field =>
|
||||||
|
val Array(name, value) = field.split("=")
|
||||||
|
name -> value
|
||||||
|
}
|
||||||
|
.toMap
|
||||||
|
|
||||||
|
val planType =
|
||||||
|
PlanType.valueOf(fieldValues.getOrElse("plan-type", "Arcade"))
|
||||||
|
val isYearly = fieldValues.get("isPackageYearly").contains("on")
|
||||||
|
|
||||||
|
Step2(planType, isYearly)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final case class Step3(addons: Set[Addons] = Set.empty)
|
final case class Step3(addons: Set[Addons] = Set.empty)
|
||||||
extends StepAnswers {
|
extends StepAnswers {
|
||||||
override def fromFormData(rawData: String): Step3 = {
|
override def fromFormData(rawData: String): Step3 = {
|
||||||
val a = 1
|
println(s"parsing step 3 data $rawData")
|
||||||
Step3()
|
// for multiple checkboxes data comes in form of
|
||||||
|
// addon-services=OnlineService&addon-services=CustomProfile
|
||||||
|
val fieldValues = rawData
|
||||||
|
.split("&")
|
||||||
|
.map { field =>
|
||||||
|
val Array(name, value) = field.split("=")
|
||||||
|
name -> value
|
||||||
|
}
|
||||||
|
|
||||||
|
val addonsStrings = fieldValues.groupMap(_._1)(_._2)
|
||||||
|
.getOrElse("addon-services", Array.empty[String])
|
||||||
|
println(s"in step 3 got strings $addonsStrings")
|
||||||
|
val addons = addonsStrings.map(Addons.valueOf(_)).toSet
|
||||||
|
|
||||||
|
Step3(addons)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -69,7 +69,9 @@ case class Routes()(implicit cc: castor.Context, log: cask.Logger)
|
||||||
*/
|
*/
|
||||||
@cask.get("/get-form")
|
@cask.get("/get-form")
|
||||||
def getForm(sessionId: cask.Cookie) = {
|
def getForm(sessionId: cask.Cookie) = {
|
||||||
val state = Models.Answers(currentStep = 1)
|
val id = sessionId.value
|
||||||
|
val state = Sessions.sessionReplies.getOrElse(id, Answers(id))
|
||||||
|
println(s"starting form for $state")
|
||||||
val context = new Context()
|
val context = new Context()
|
||||||
context.setVariable(formDataContextVarName, state)
|
context.setVariable(formDataContextVarName, state)
|
||||||
val formFragment = templateEngine.process(
|
val formFragment = templateEngine.process(
|
||||||
|
@ -96,6 +98,9 @@ case class Routes()(implicit cc: castor.Context, log: cask.Logger)
|
||||||
val userAnswers = Sessions.sessionReplies.getOrElse(id, Answers(id))
|
val userAnswers = Sessions.sessionReplies.getOrElse(id, Answers(id))
|
||||||
|
|
||||||
val updatedAnswers = userAnswers.updateStep(stepNum, request.text())
|
val updatedAnswers = userAnswers.updateStep(stepNum, request.text())
|
||||||
|
|
||||||
|
Sessions.sessionReplies.update(id, updatedAnswers)
|
||||||
|
|
||||||
val context = new Context()
|
val context = new Context()
|
||||||
context.setVariable(formDataContextVarName, updatedAnswers)
|
context.setVariable(formDataContextVarName, updatedAnswers)
|
||||||
val nextFormFragment = templateEngine.process(
|
val nextFormFragment = templateEngine.process(
|
||||||
|
|
Loading…
Reference in New Issue