@@ -4,64 +4,83 @@ import StoragePlugin from './StoragePlugin'
44import Todo from './Todo'
55import TodoStorage from './TodoStorage'
66
7+ const createQuery = ( todos : Todo [ ] ) => todos . map ( todo => Object . freeze ( Object . assign ( { } , todo ) ) )
8+ const findById = ( todos : Todo [ ] , id : number ) => todos . find ( todo => todo . id === id )
9+
710export default function TodoStore ( ) {
811 return new Vuex . Store ( {
912 plugins : [ StoragePlugin ( ) ] ,
1013
1114 state : {
1215 uid : 1 ,
13- todos : [ ]
16+ todos : < Todo [ ] > [ ] ,
17+ query : < Todo [ ] > [ ] ,
1418 } ,
1519
1620 mutations : {
1721 add ( state , title : string ) {
1822 state . todos . push ( {
1923 id : state . uid ++ ,
2024 title : title ,
21- completed : false
25+ completed : false ,
2226 } )
27+
28+ state . query = createQuery ( state . todos )
2329 } ,
2430
2531 remove ( state , todo : Todo ) {
2632 state . todos . splice ( state . todos . indexOf ( todo ) , 1 )
33+
34+ state . query = createQuery ( state . todos )
2735 } ,
2836
2937 replace ( state , todos : Todo [ ] ) {
30- state . todos = todos ;
38+ state . todos = todos
3139 state . uid = state . todos . length
40+
41+ state . query = createQuery ( state . todos )
3242 } ,
3343
34- update ( state , todo : Todo ) {
35- // Objects are references, so this is noop.
36- // However it will trigger any plugin attached.
44+ update ( state , payload : { todo : Todo , title : string } ) {
45+ const entry = findById ( state . todos , payload . todo . id )
46+
47+ entry . title = payload . title
48+
49+ state . query = createQuery ( state . todos )
3750 } ,
3851
3952 toggle ( state , todo : Todo ) {
40- todo . completed = ! todo . completed
53+ const entry = findById ( state . todos , todo . id )
54+
55+ entry . completed = ! todo . completed
56+
57+ state . query = createQuery ( state . todos )
4158 } ,
4259
4360 toggleAll ( state , value : boolean ) {
44- state . todos . forEach ( ( todo : Todo ) => {
45- todo . completed = value
46- } )
61+ state . todos . forEach ( todo => todo . completed = value )
62+
63+ state . query = createQuery ( state . todos )
4764 } ,
4865
4966 removeCompleted ( state ) {
50- state . todos = this . getters . active
67+ state . todos = state . todos . filter ( todo => ! todo . completed )
68+
69+ state . query = createQuery ( state . todos )
5170 }
5271 } ,
5372
5473 getters : {
5574 all ( state ) : Todo [ ] {
56- return state . todos ;
75+ return state . query
5776 } ,
5877
59- active ( state ) : Todo [ ] {
60- return state . todos . filter ( todo => ! todo . completed )
78+ active ( state , getters ) : Todo [ ] {
79+ return getters . all . filter ( todo => ! todo . completed )
6180 } ,
6281
63- completed ( state ) : Todo [ ] {
64- return state . todos . filter ( todo => todo . completed )
82+ completed ( state , getters ) : Todo [ ] {
83+ return getters . all . filter ( todo => todo . completed )
6584 } ,
6685
6786 remaining ( state , getters ) : number {
0 commit comments