1+ import * as React from 'react'
2+ import * as CR from 'typings'
3+
4+ import Debugger from './components/Debugger'
5+ import Routes from './Routes'
6+
7+ interface ReceivedEvent {
8+ data :CR . Action
9+ }
10+
11+ const initialState = { SelectTutorial :'Initial ' }
12+ const initialData :CR . MachineContext = {
13+ position :{ levelId :'' , stageId :'' , stepId :'' } ,
14+ data :{
15+ summary :{
16+ title :'' ,
17+ description :'' ,
18+ levelList :[ ] ,
19+ } ,
20+ levels :{ } ,
21+ stages :{ } ,
22+ steps :{ } ,
23+ } ,
24+ progress :{ levels :{ } , stages :{ } , steps :{ } , complete :false } ,
25+ }
26+
27+ const DataContext = React . createContext ( { state :initialState , ...initialData } )
28+
29+
30+
31+ const App = ( ) => {
32+ const [ state , setState ] = React . useState ( initialState )
33+ const [ data , setData ] :[ CR . MachineContext , ( data :CR . MachineContext ) => void ] = React . useState ( initialData )
34+
35+ const handleEvent = ( event :ReceivedEvent ) :void => {
36+ const message = event . data
37+ console . log ( 'RECEIVED' )
38+ console . log ( message )
39+ // messages from core
40+ if ( message . type === 'SET_STATE' ) {
41+ setState ( message . payload . state )
42+ setData ( message . payload . data )
43+ } else if ( message . type === 'SET_DATA' ) {
44+ setData ( message . payload . data )
45+ }
46+ }
47+
48+ // event bus listener
49+ React . useEffect ( ( ) => {
50+ const listener = 'message'
51+ window . addEventListener ( listener , handleEvent )
52+ return ( ) => {
53+ window . removeEventListener ( listener , handleEvent )
54+ }
55+ } )
56+
57+ const value = {
58+ state,
59+ position :data . position ,
60+ data :data . data ,
61+ progress :data . progress ,
62+ }
63+
64+ // TODO: refactor cond to user <Router><Route> and accept first route as if/else if
65+ return (
66+ < DataContext . Provider value = { value } >
67+ < div >
68+ < Debugger value = { value } />
69+ < Routes state = { state } />
70+ </ div >
71+ </ DataContext . Provider >
72+ )
73+ }
74+
75+ export default App