We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see ourdocumentation.
There was an error while loading.Please reload this page.
1 parenteda3451 commit81fb928Copy full SHA for 81fb928
typings/index.d.ts
@@ -123,6 +123,7 @@ export interface MachineContext {
123
exportinterfaceMachineEvent{
124
type:string
125
payload?:any
126
+data?:any
127
}
128
129
exportinterfaceMachineStateSchema{
web-app/src/services/state/actions/api.ts
@@ -1,3 +1,7 @@
1
-exportdefault{
+import*asCRfrom'typings'
2
3
+exportdefault{
4
+userTutorialComplete(context:CR.MachineContext){
5
+console.log('should update user tutorial as complete')
6
+}
7
web-app/src/services/state/actions/context.ts
@@ -1,7 +1,7 @@
import{assign,send}from'xstate'
import*asGfrom'typings/graphql'
import*asCRfrom'typings'
-import*asstoragefrom'./storage'
+import*asstoragefrom'../storage'
exportdefault{
setTutorial:assign({
@@ -11,6 +11,11 @@ export default {
11
returntutorial
12
},
13
}),
14
+continueTutorial:assign({
15
+tutorial:(context:CR.MachineContext,event:CR.MachineEvent)=>event.data.payload.tutorial,
16
+progress:(context:CR.MachineContext,event:CR.MachineEvent)=>event.data.payload.progress,
17
+position:(context:CR.MachineContext,event:CR.MachineEvent)=>event.data.payload.position,
18
+}),
19
//@ts-ignore
20
initPosition:assign({
21
position:(context:CR.MachineContext,event:CR.MachineEvent):CR.Position=>{
web-app/src/services/state/actions/editor.ts
@@ -1,14 +1,7 @@
-import{send}from'xstate'
importchannelfrom'../../channel'
-newOrContinue:send((context:CR.MachineContext):'NEW'|'CONTINUE'=>{
-console.log('new or continue')
8
-// TODO: verify that the user has an existing tutorial to continue
9
-consthasExistingTutorial:boolean=false
10
-returnhasExistingTutorial ?'CONTINUE' :'NEW'
-}),
tutorialStart(){
console.log('EDITOR: TUTORIAL_START')
channel.editorSend({
web-app/src/services/state/actions/invoke.ts
@@ -0,0 +1,25 @@
+
+exportconstnewOrContinue=async(context:CR.MachineContext)=>{
+const[tutorial,position,progress]=awaitPromise.all([
+storage.tutorial.get(),
+storage.position.get(),
+storage.progress.get()
+])
+consthasExistingTutorial=(tutorial&&tutorial.id&&progress&&!progress.complete)
+if(hasExistingTutorial){
+// TODO: calculate position based on progress
+return{
+type:'CONTINUE',
+payload:{
+tutorial,
+position,
+progress
22
23
+// New tutorial
24
+returnPromise.reject()
25
web-app/src/services/state/machine.ts
@@ -1,5 +1,6 @@
import{Machine}from'xstate'
+import*asinvokefrom'./actions/invoke'
exportconstmachine=Machine<CR.MachineContext,CR.MachineStateSchema,CR.MachineEvent>(
{
@@ -20,10 +21,14 @@ export const machine = Machine<CR.MachineContext, CR.MachineStateSchema, CR.Mach
initial:'Startup',
states:{
Startup:{
-onEntry:['newOrContinue'],
-on:{
-CONTINUE:'ContinueTutorial',
26
-NEW:'NewTutorial',
+invoke:{
+id:'newOrContinue',
+src:invoke.newOrContinue,
27
+onDone:{
28
+target:'ContinueTutorial',
29
+actions:['continueTutorial']
30
+},
31
+onError:'NewTutorial'
32
33
34
NewTutorial:{
@@ -158,7 +163,7 @@ export const machine = Machine<CR.MachineContext, CR.MachineStateSchema, CR.Mach
158
163
159
164
Completed:{
160
165
id:'completed-tutorial',
161
-onEntry:['syncCompleted'],
166
+onEntry:['userTutorialComplete'],
162
167
on:{
168
SELECT_TUTORIAL:{
169
target:'#start-new-tutorial',
…pp/src/services/state/actions/storage.ts web-app/src/services/state/storage.tsweb-app/src/services/state/actions/storage.ts renamed to web-app/src/services/state/storage.ts
@@ -9,8 +9,8 @@ class Storage<T> {
constructor(key:string){
this.key=key
-publicget=(key:string):T|null=>{
-constvalue=this.storage.getItem(this.key)
+publicget=async():Promise<T|null>=>{
+constvalue=awaitthis.storage.getItem(this.key)
if(value){
returnJSON.parse(value)