@@ -2,18 +2,18 @@ use gloo::storage::{LocalStorage, Storage};
22use state:: { Entry , Filter , State } ;
33use strum:: IntoEnumIterator ;
44use yew:: web_sys:: HtmlInputElement as InputElement ;
5- use yew:: { classes, html, Component , ComponentLink , Html , InputData , NodeRef , ShouldRender } ;
5+ use yew:: {
6+ classes, html, Component , ComponentLink , FocusEvent , Html , NodeRef , ShouldRender , TargetCast ,
7+ } ;
68use yew:: { events:: KeyboardEvent , Classes } ;
79
810mod state;
911
1012const KEY : & str = "yew.todomvc.self" ;
1113
1214pub enum Msg {
13- Add ,
14- Edit ( usize ) ,
15- Update ( String ) ,
16- UpdateEdit ( String ) ,
15+ Add ( String ) ,
16+ Edit ( ( usize , String ) ) ,
1717 Remove ( usize ) ,
1818 SetFilter ( Filter ) ,
1919 ToggleAll ,
@@ -38,7 +38,6 @@ impl Component for Model {
3838 let state = State {
3939 entries,
4040 filter : Filter :: All ,
41- value : "" . into ( ) ,
4241 edit_value : "" . into ( ) ,
4342 } ;
4443 let focus_ref = NodeRef :: default ( ) ;
@@ -51,31 +50,20 @@ impl Component for Model {
5150
5251 fn update ( & mut self , msg : Self :: Message ) -> ShouldRender {
5352 match msg {
54- Msg :: Add => {
55- let description = self . state . value . trim ( ) ;
53+ Msg :: Add ( description) => {
5654 if !description. is_empty ( ) {
5755 let entry = Entry {
58- description : description. to_string ( ) ,
56+ description : description. trim ( ) . to_string ( ) ,
5957 completed : false ,
6058 editing : false ,
6159 } ;
6260 self . state . entries . push ( entry) ;
6361 }
64- self . state . value = "" . to_string ( ) ;
6562 }
66- Msg :: Edit ( idx) => {
67- let edit_value = self . state . edit_value . trim ( ) . to_string ( ) ;
68- self . state . complete_edit ( idx, edit_value) ;
63+ Msg :: Edit ( ( idx, edit_value) ) => {
64+ self . state . complete_edit ( idx, edit_value. trim ( ) . to_string ( ) ) ;
6965 self . state . edit_value = "" . to_string ( ) ;
7066 }
71- Msg :: Update ( val) => {
72- println ! ( "Input: {}" , val) ;
73- self . state . value = val;
74- }
75- Msg :: UpdateEdit ( val) => {
76- println ! ( "Input: {}" , val) ;
77- self . state . edit_value = val;
78- }
7967 Msg :: Remove ( idx) => {
8068 self . state . remove ( idx) ;
8169 }
@@ -180,17 +168,23 @@ impl Model {
180168 }
181169
182170 fn view_input ( & self ) -> Html {
171+ let onkeypress = self . link . batch_callback ( |e : KeyboardEvent | {
172+ if e. key ( ) == "Enter" {
173+ let input: InputElement = e. target_unchecked_into ( ) ;
174+ let value = input. value ( ) ;
175+ input. set_value ( "" ) ;
176+ Some ( Msg :: Add ( value) )
177+ } else {
178+ None
179+ }
180+ } ) ;
183181 html ! {
184182 // You can use standard Rust comments. One line:
185183 // <li></li>
186184 <input
187185 class="new-todo"
188186 placeholder="What needs to be done?"
189- value={ self . state. value. clone( ) }
190- oninput={ self . link. callback( |e: InputData | Msg :: Update ( e. value) ) }
191- onkeypress={ self . link. batch_callback( |e: KeyboardEvent | {
192- if e. key( ) == "Enter" { Some ( Msg :: Add ) } else { None }
193- } ) }
187+ { onkeypress}
194188 />
195189 /* Or multiline:
196190 <ul>
@@ -226,6 +220,20 @@ impl Model {
226220 }
227221
228222 fn view_entry_edit_input ( & self , ( idx, entry) : ( usize , & Entry ) ) -> Html {
223+ let edit = move |input : InputElement | {
224+ let value = input. value ( ) ;
225+ input. set_value ( "" ) ;
226+ Msg :: Edit ( ( idx, value) )
227+ } ;
228+
229+ let onblur = self
230+ . link
231+ . callback ( move |e : FocusEvent | edit ( e. target_unchecked_into ( ) ) ) ;
232+
233+ let onkeypress = self . link . batch_callback ( move |e : KeyboardEvent | {
234+ ( e. key ( ) == "Enter" ) . then ( || edit ( e. target_unchecked_into ( ) ) )
235+ } ) ;
236+
229237 if entry. editing {
230238 html ! {
231239 <input
@@ -234,11 +242,8 @@ impl Model {
234242 ref={ self . focus_ref. clone( ) }
235243 value={ self . state. edit_value. clone( ) }
236244 onmouseover={ self . link. callback( |_| Msg :: Focus ) }
237- oninput={ self . link. callback( |e: InputData | Msg :: UpdateEdit ( e. value) ) }
238- onblur={ self . link. callback( move |_| Msg :: Edit ( idx) ) }
239- onkeypress={ self . link. batch_callback( move |e: KeyboardEvent | {
240- if e. key( ) == "Enter" { Some ( Msg :: Edit ( idx) ) } else { None }
241- } ) }
245+ { onblur}
246+ { onkeypress}
242247 />
243248 }
244249 } else {
0 commit comments