1- import { useReducer , useState } from 'react'
1+ import { useEffect , useReducer , useState } from 'react'
22import './App.css'
3+
4+ const TODOS_STORAGE_KEY = 'todos'
35interface Task {
46 id ?: number ;
57 text : string ;
@@ -12,9 +14,22 @@ const App = () => {
1214 const [ text , setText ] = useState ( '' ) ;
1315 const [ todos , dispatch ] = useReducer ( reducer , initialState )
1416
17+ useEffect ( ( ) => {
18+ const loadedTasks = loadTasks ( ) ;
19+ if ( loadedTasks . length > 0 ) {
20+ loadedTasks . forEach ( task => {
21+ dispatch ( { type : "ADD_TASK" , text : task . text , done : task . done , id : task . id } )
22+ } )
23+ }
24+ } , [ ] )
25+
26+ useEffect ( ( ) => {
27+ localStorage . setItem ( TODOS_STORAGE_KEY , JSON . stringify ( todos ) )
28+ } , [ todos ] )
29+
1530 const handleAddTask = ( ) => {
1631 if ( ! text ) return
17- dispatch ( { type : 'ADD_TASK' , value : text } )
32+ dispatch ( { type : 'ADD_TASK' , text : text } )
1833 setText ( '' ) ;
1934 }
2035
@@ -63,23 +78,36 @@ const App = () => {
6378export default App
6479
6580type Action =
66- | { type : 'ADD_TASK' , value : string }
81+ | { type : 'ADD_TASK' , text : string , done ?: boolean , id ?: number }
6782 | { type : 'DELETE_TASK' , id : number }
6883 | { type : 'TOGGLE_TASK' , id : number }
6984
7085const reducer = ( state : Task [ ] , action : Action ) => {
7186 switch ( action . type ) {
7287
7388 case 'ADD_TASK' :
74- return [ ...state , { id : Date . now ( ) , text : action . value , done : false } ]
89+ return [ ...state , {
90+ id : action . id ?? Date . now ( ) ,
91+ text : action . text ,
92+ done : action . done ?? false
93+ } ]
7594
7695 case 'DELETE_TASK' :
7796 return state . filter ( task => task . id !== action . id )
7897
7998 case 'TOGGLE_TASK' :
80- return state . map ( task => ( task . id === action . id ) ? { ...task , done : ! task . done } : task )
99+ return state . map ( task => (
100+ task . id === action . id ) ? { ...task , done : ! task . done } : task )
81101
82102 default :
83103 return state
84104 }
85105}
106+
107+ const loadTasks = ( ) : Task [ ] => {
108+ const savedTasks = localStorage . getItem ( TODOS_STORAGE_KEY )
109+ if ( savedTasks ) {
110+ return JSON . parse ( savedTasks )
111+ }
112+ return [ ]
113+ }
0 commit comments