@@ -10,16 +10,66 @@ const totalTaskEl = document.getElementById("totalTask");
1010const CompletedTaskEl = document . getElementById ( "CompletedTask" ) ;
1111const inCompletedTaskEl = document . getElementById ( "inCompletedTask" ) ;
1212const userNameEl = document . getElementById ( "userName" ) ;
13+ const statUserNameEl = document . getElementById ( "statUserName" ) ;
1314
1415let isEditMode = false ;
1516let editEl = null ;
1617let TODO_LOCALSTORAGE_KEY = `Todo` ;
1718let userName = getUserName ( ) ;
18-
1919userNameEl . innerHTML = userName ;
2020
2121formEl . addEventListener ( "submit" , addTodo ) ;
2222
23+ class LocalStorage {
24+ constructor ( localStorageKey ) {
25+ this . localStorageKey = localStorageKey ;
26+ this . local = localStorage . getItem ( this . localStorageKey )
27+ ? JSON . parse ( localStorage . getItem ( this . localStorageKey ) )
28+ : [ ] ;
29+ }
30+
31+ save ( newData ) {
32+ this . local . push ( newData ) ;
33+ this . stringifyLocal ( ) ;
34+ }
35+
36+ delete ( id ) {
37+ this . local = this . local . filter ( ( item ) => item . id !== id ) ;
38+ this . stringifyLocal ( ) ;
39+ }
40+
41+ update ( id , task , description ) {
42+ this . local = this . local . map ( ( item ) => {
43+ if ( item . id === id ) {
44+ item . task = task ;
45+ item . description = description ;
46+ }
47+ return item ;
48+ } ) ;
49+ this . stringifyLocal ( ) ;
50+ }
51+
52+ updateIsCompleted ( id , value ) {
53+ this . local = this . local . map ( ( item ) => {
54+ if ( item . id === id ) {
55+ item . isCompleted = value ;
56+ }
57+ return item ;
58+ } ) ;
59+
60+ this . stringifyLocal ( ) ;
61+ }
62+
63+ stringifyLocal ( ) {
64+ return localStorage . setItem (
65+ this . localStorageKey ,
66+ JSON . stringify ( this . local )
67+ ) ;
68+ }
69+ }
70+
71+ let todoLocal = new LocalStorage ( TODO_LOCALSTORAGE_KEY ) ;
72+
2373function addTodo ( e ) {
2474 e . preventDefault ( ) ;
2575 let inputEl = this . querySelector ( "#userInput" ) ;
@@ -55,7 +105,7 @@ function createNewTodo(inputEl) {
55105 description : description ,
56106 } ;
57107 createTodoEl ( todoData ) ;
58- addTodoToLocal ( todoData ) ;
108+ todoLocal . save ( todoData ) ;
59109 inputEl . value = null ;
60110}
61111
@@ -147,7 +197,7 @@ function createTodoEl(todo) {
147197
148198 delBtn . addEventListener ( "click" , ( e ) => {
149199 liEl . remove ( ) ;
150- deleteLocal ( liEl . dataset . id ) ;
200+ todoLocal . delete ( liEl . dataset . id ) ;
151201 } ) ;
152202
153203 // Checkbox Event
@@ -167,7 +217,7 @@ function createTodoEl(todo) {
167217 checkEl . innerHTML = `<span class="material-icons"> done </span>` ;
168218 isCompValue = true ;
169219 }
170- updateIsCompletedLocal ( liEl . dataset . id , isCompValue ) ;
220+ todoLocal . updateIsCompleted ( liEl . dataset . id , isCompValue ) ;
171221 } ) ;
172222}
173223
@@ -231,7 +281,7 @@ function editMyTodo(inputEl) {
231281 isEditMode = false ;
232282 editEl = null ;
233283 AddTodoBtnEl . innerHTML = `Add Todo` ;
234- editLocalTodo ( id , task , description ) ;
284+ todoLocal . update ( id , task , description ) ;
235285}
236286
237287function updateEditView ( liEl ) {
@@ -251,53 +301,6 @@ function getTodoId() {
251301 return Math . floor ( Math . random ( ) * 10000000 ) . toString ( 16 ) ;
252302}
253303
254- function getLocal ( ) {
255- return localStorage . getItem ( TODO_LOCALSTORAGE_KEY )
256- ? JSON . parse ( localStorage . getItem ( TODO_LOCALSTORAGE_KEY ) )
257- : [ ] ;
258- }
259-
260- function addTodoToLocal ( newTodo ) {
261- let local = getLocal ( ) ;
262- local . push ( newTodo ) ;
263- return localStorage . setItem ( TODO_LOCALSTORAGE_KEY , JSON . stringify ( local ) ) ;
264- }
265-
266- function editLocalTodo ( id , task , description ) {
267- let local = getLocal ( ) ;
268- local = local . map ( ( item ) => {
269- if ( item . id === id ) {
270- item . task = task ;
271- item . description = description ;
272- }
273- return item ;
274- } ) ;
275- return localStorage . setItem ( TODO_LOCALSTORAGE_KEY , JSON . stringify ( local ) ) ;
276- }
277-
278- function deleteLocal ( id ) {
279- let local = getLocal ( ) ;
280- local = local . filter ( ( item ) => item . id !== id ) ;
281- return localStorage . setItem ( TODO_LOCALSTORAGE_KEY , JSON . stringify ( local ) ) ;
282- }
283-
284- function updateIsCompletedLocal ( id , value ) {
285- let local = getLocal ( ) ;
286- local = local . map ( ( item ) => {
287- if ( item . id === id ) item . isCompleted = value ;
288- return item ;
289- } ) ;
290- return localStorage . setItem ( TODO_LOCALSTORAGE_KEY , JSON . stringify ( local ) ) ;
291- }
292-
293- ( function upadateTodoList ( ) {
294- listsEl . innerHTML = null ;
295- let local = getLocal ( ) ;
296- if ( local . length ) {
297- return local . forEach ( ( todo ) => createTodoEl ( todo ) ) ;
298- }
299- } ) ( ) ;
300-
301304// Button Ripple Effect
302305
303306ctaBtnsEl . forEach ( ( button ) => {
@@ -368,12 +371,13 @@ window.addEventListener("click", (e) => {
368371} ) ;
369372
370373function showStats ( ) {
371- let local = getLocal ( ) ;
374+ let local = todoLocal . local ;
372375 let totalTaskLength = local . length ;
373376 const completedTaskLength = local . filter ( ( item ) => item . isCompleted ) . length ;
374377 const inCompletedTaskLength = totalTaskLength - completedTaskLength ;
375378 const percentage =
376- Math . floor ( ( completedTaskLength / totalTaskLength ) * 100 ) . toString ( ) === `NaN`
379+ Math . floor ( ( completedTaskLength / totalTaskLength ) * 100 ) . toString ( ) ===
380+ `NaN`
377381 ? 0
378382 : Math . floor ( ( completedTaskLength / totalTaskLength ) * 100 ) ;
379383
@@ -436,6 +440,7 @@ function NameModalInput() {
436440 if ( inputEl . value . trim ( ) ) {
437441 userName = inputEl . value ;
438442 userNameEl . innerHTML = userName ;
443+ statUserNameEl . innerHTML = userName ;
439444 localStorage . setItem ( "userName" , userName ) ;
440445 }
441446 modalCont . remove ( ) ;
@@ -458,7 +463,10 @@ function getUserName() {
458463
459464( function setUserName ( ) {
460465 let user = localStorage . getItem ( "userName" ) ;
461- if ( ! user ) {
462- return NameModalInput ( ) ;
463- }
466+ if ( ! user ) return NameModalInput ( ) ;
467+ } ) ( ) ;
468+
469+ ( function ( ) {
470+ let local = todoLocal . local ;
471+ if ( local . length ) local . forEach ( ( item ) => createTodoEl ( item ) ) ;
464472} ) ( ) ;
0 commit comments