@@ -22,52 +22,26 @@ fn app() -> Html {
22
22
} ) ;
23
23
24
24
// Effect
25
- use_effect_with ( state. clone ( ) , move |state| {
25
+ use_effect_with ( state. clone ( ) , |state| {
26
26
LocalStorage :: set ( KEY , & state. clone ( ) . entries ) . expect ( "failed to set" ) ;
27
- || ( )
28
27
} ) ;
29
28
30
29
// Callbacks
31
- let onremove = {
30
+ fn make_callback < E , F > ( state : & UseReducerHandle < State > , f : F ) -> Callback < E >
31
+ where
32
+ F : Fn ( E ) -> Action + ' static ,
33
+ {
32
34
let state = state. clone ( ) ;
33
- Callback :: from ( move |id : usize | state. dispatch ( Action :: Remove ( id) ) )
34
- } ;
35
-
36
- let ontoggle = {
37
- let state = state. clone ( ) ;
38
- Callback :: from ( move |id : usize | state. dispatch ( Action :: Toggle ( id) ) )
39
- } ;
40
-
41
- let ontoggle_all = {
42
- let state = state. clone ( ) ;
43
- Callback :: from ( move |_| state. dispatch ( Action :: ToggleAll ) )
44
- } ;
45
-
46
- let onclear_completed = {
47
- let state = state. clone ( ) ;
48
- Callback :: from ( move |_| state. dispatch ( Action :: ClearCompleted ) )
49
- } ;
50
-
51
- let onedit = {
52
- let state = state. clone ( ) ;
53
- Callback :: from ( move |( id, value) : ( usize , String ) | {
54
- state. dispatch ( Action :: Edit ( ( id, value) ) ) ;
55
- } )
56
- } ;
57
-
58
- let onadd = {
59
- let state = state. clone ( ) ;
60
- Callback :: from ( move |value : String | {
61
- state. dispatch ( Action :: Add ( value) ) ;
62
- } )
63
- } ;
35
+ Callback :: from ( move |e : E | state. dispatch ( f ( e) ) )
36
+ }
64
37
65
- let onset_filter = {
66
- let state = state. clone ( ) ;
67
- Callback :: from ( move |filter : Filter | {
68
- state. dispatch ( Action :: SetFilter ( filter) ) ;
69
- } )
70
- } ;
38
+ let onremove = make_callback ( & state, Action :: Remove ) ;
39
+ let ontoggle = make_callback ( & state, Action :: Toggle ) ;
40
+ let ontoggle_all = make_callback ( & state, |_| Action :: ToggleAll ) ;
41
+ let onclear_completed = make_callback ( & state, |_| Action :: ClearCompleted ) ;
42
+ let onedit = make_callback ( & state, Action :: Edit ) ;
43
+ let onadd = make_callback ( & state, Action :: Add ) ;
44
+ let onset_filter = make_callback ( & state, Action :: SetFilter ) ;
71
45
72
46
// Helpers
73
47
let completed = state
@@ -109,9 +83,9 @@ fn app() -> Html {
109
83
{ for state. entries. iter( ) . filter( |e| state. filter. fits( e) ) . cloned( ) . map( |entry|
110
84
html! {
111
85
<EntryItem { entry}
112
- ontoggle={ ontoggle. clone ( ) }
113
- onremove={ onremove. clone ( ) }
114
- onedit={ onedit. clone ( ) }
86
+ ontoggle={ & ontoggle}
87
+ onremove={ & onremove}
88
+ onedit={ & onedit}
115
89
/>
116
90
} ) }
117
91
</ul>
@@ -126,7 +100,7 @@ fn app() -> Html {
126
100
html! {
127
101
<FilterItem { filter}
128
102
selected={ state. filter == filter}
129
- onset_filter={ onset_filter. clone ( ) }
103
+ onset_filter={ & onset_filter}
130
104
/>
131
105
}
132
106
} ) }
0 commit comments