summaryrefslogtreecommitdiff
path: root/App.js
blob: fe063b196b096ea0af2f50ee2d49b0121a94920e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
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
let state = {
   character: '你',
   pinyin: 'ni3',

   guessHistory: [],
   
   hintLevel: 0,
   
   inputValue: undefined,
   inputShaking: false,
};

let internalState = {};

const KEY_ENTER = 13;


function setState(update)
{
   for (const key in update)
      state[key] = update[key];
   render();
}


const CurrentCharacter = function({character})
{
   return h(
      'h1',
      { onClick: () => setState({currentCharacter: '我'}) },
      character
   );
}


function shakeInputBox()
{
   setState({ inputShaking: true });
   setTimeout(() => setState({ inputShaking: false }), 300);
}

function handleInputKeyDown(event)
{
   const KEY_ENTER = 13;
   const { pinyin, inputValue } = state;
      
   if (event.keyCode === KEY_ENTER) {
      if (inputValue === pinyin)
         correctAnswer();
      else
         shakeInputBox();
   }
   else {
      setTimeout(() => setState({
         inputValue: event.target.value
      }), 300);
   }
}


function correctAnswer()
{
   setState({
      inputValue: undefined,
      hintLevel: 0,
   });
}


const App = function()
{
   const {
      character, pinyin,
      hintLevel,
      inputValue, inputShaking
   } = state;

   console.log(inputValue);
   
   return h(
      'div', {},
      [
         h(CurrentCharacter,
           { character, }),
         
         h(InputBox,
           { value: inputValue,
             shaking: inputShaking,
             handleKeyDown: handleInputKeyDown,
           }),

         h('br'),
         h('br'),

         h(HintButton,
           {
              answer: pinyin,
              hintLevel,
              handleClick: () => setState({ hintLevel: hintLevel+1 }),
           }),
         ]
      );
   }