Newer
Older
!!! info ""
:construction: Section under Construction :construction:
This section explain all the functionnalities in the challenge part
## Quiz
A quiz includes 4 basic questions and one custom question.
All basics Questions are created in the quizEntity.json. We have to add :
- questionLabel => Label of the question
- Answers => An array of three answers (answerLabel, isTrue)
- description => Explain the question
- source => Source of the explanaition
This questions and answers are in random order.
In the question page the user have to select an answer and click validate.
Then, he sees the right answer and a modal with the explanation and the source. After this modal, he goes to the next question.
Depends on the answer, the question result state is set either correct or incorrect.
If it is a right answer, the quiz result is incremented by one.
At the end of every quiz, we're creating a custom question. During the creation of the quiz, we have to add :
- type => data or calculation
- period => the period selected for the calcul
We get all this information to determine the custom question (All information are in the quizEntity.json). Depending of the question type, the system calcul a maximum or an average data.
Then, he generate two randoms answers following the right answer.
A user can stop during a quiz and picks up where he left off. To define where the user left off, we have to check if at least one of the question result status is unlocked.
Once the custom question is answered, the quiz state is set to done. Then, the user sees his result and his earned stars. He can also retry or go back to the challenge page.
Exploration is a feature which in the user got to do an action in order to help him to discover all features of this app.
- DECLARATIVE : The user has to do something outside of the app => No way for the app to know if the user did it so we trust him.
- ACTION : Action whitin the app. When the user finish he got a notification.
- CONSUMPTION : He got to do something in his consumption view.
- ECOGESTURE : He need to have a look to a specific Ecogesture.
When the user finish the exploration, he got a success message and five more stars on his challenge progression.
In order to find a valid reference period we search for a period which is defined by the duel duration.
We check the most recent period first if it's complete and then we go farther and farther in the time if the ones before got missing values.
We also define a threshold for a maximum old period (6 months for the moment determined in the code ==> hardcoding).
If the thresold is reached and no valid period was found, we alert the user that he can't launch the duel and have to wait before he can retry this process.
Every time the user go into the duel mode, we are checking if the duel is finished.
if (actualDate - startDate) > duelDuration, the duel is done.
Once the state of the duel is set to DONE, we save the user result and determine if he wins (userComsumption < threshold of the reference period) or if he loses. Then the user sees his earned badge.
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
## Challenges
We can find the file challengeEntity.json in the /db folder. This file contains an array of challenges, and each of them includes relationships to duels, quiz, missions and actions.
### UserData creation
Once a user launch a challenge in the Ecolyo app, we create a userChallenge and store it in the couchDB under the doctype '**com.grandlyon.ecolyo.userchallenge'.** During this process, the objects related to the challenge (quiz, duel, mission, action) will be be converted to an user version which contains informations about the user progress, the fluids connected and so on. So we have now a userChallenge that contains a userQuiz, a userDuel, etc. instead of relations.
To illustrate this, let's show the conversion of quizEntity to userQuiz :
```jsx
DuelEntity {
id: string
title: string
description: string
duration: Duration
}
```
Becomes :
```jsx
UserQuiz {
id: string
title: string
description: string
duration: Duration
threshold: number
state: UserDuelState
startDate: string | null
fluidTypes: FluidType[]
userConsumption: number
}
```
### Data managment schema
