File tree 5 files changed +80
-22
lines changed
5 files changed +80
-22
lines changed Original file line number Diff line number Diff line change @@ -3,6 +3,7 @@ import DarkModeToggler from "@/components/DarkModeToggler"
3
3
import Form from "@/components/Form"
4
4
import TodosContents from "@/components/TodosContents"
5
5
import AnimationProvider from "@/provider/AnimationProvider"
6
+ import FilterProvider from "@/provider/FilterProvider"
6
7
import ThemeProvider from "@/provider/ThemeProvider"
7
8
import TodoProvider from "@/provider/TodoProvider"
8
9
@@ -11,34 +12,36 @@ const Home = () => {
11
12
return (
12
13
< ThemeProvider >
13
14
< TodoProvider >
14
- < AnimationProvider >
15
- < main className = "bg-bg h-screen" >
15
+ < FilterProvider >
16
+ < AnimationProvider >
17
+ < main className = "bg-bg h-screen" >
16
18
17
- < BackgroundImage />
19
+ < BackgroundImage />
18
20
19
- < section className = "container relative max-w-2xl mx-auto p-5" >
21
+ < section className = "container relative max-w-2xl mx-auto p-5" >
20
22
21
- < div className = "flex items-center justify-between sm:pt-16 pt-8" >
22
- < h1 className = "uppercase tracking-widest md:text-4xl text-2xl font-bold text-white" >
23
- Todo
24
- </ h1 >
23
+ < div className = "flex items-center justify-between sm:pt-16 pt-8" >
24
+ < h1 className = "uppercase tracking-widest md:text-4xl text-2xl font-bold text-white" >
25
+ Todo
26
+ </ h1 >
25
27
26
- < DarkModeToggler />
28
+ < DarkModeToggler />
27
29
28
- </ div >
30
+ </ div >
29
31
30
- < div className = "bg-card-bg rounded-md shadow-lg px-5 py-2 mt-8" >
31
- < Form />
32
- </ div >
32
+ < div className = "bg-card-bg rounded-md shadow-lg px-5 py-2 mt-8" >
33
+ < Form />
34
+ </ div >
33
35
34
- < TodosContents />
36
+ < TodosContents />
35
37
36
- </ section >
38
+ </ section >
37
39
38
- < p className = "text-grayish-text text-center md:mt-0 pb-10 mt-20" > Drag and drop yo reorder list</ p >
40
+ < p className = "text-grayish-text text-center md:mt-0 pb-10 mt-20" > Drag and drop yo reorder list</ p >
39
41
40
- </ main >
41
- </ AnimationProvider >
42
+ </ main >
43
+ </ AnimationProvider >
44
+ </ FilterProvider >
42
45
</ TodoProvider >
43
46
</ ThemeProvider >
44
47
)
Original file line number Diff line number Diff line change 1
1
import React from 'react'
2
2
import ClearAllCompletedBtn from './ClearAllCompletedBtn'
3
+ import { FilterContext } from '@/context/FilterContext'
3
4
4
5
const ListControls = ( { len, todos } : ListControlProps ) => {
5
6
7
+ const { filter, setFilter } = React . useContext ( FilterContext )
8
+
6
9
return (
7
10
< div className = 'flex px-5 py-2 justify-between items-center text-sm text-grayish-text' >
8
11
@@ -11,9 +14,26 @@ const ListControls = ({ len, todos }: ListControlProps) => {
11
14
</ div >
12
15
13
16
< div className = 'flex md:w-fit gap-3 font-bold md:mt-0 md:static absolute mt-36 md:shadow-none shadow-md w-[calc(100%-40px)] left-5 right-5 rounded-md bg-card-bg md:py-0 py-4 px-5 justify-center' >
14
- < button className = 'text-bright-blue hover:text-text-hovered' > All</ button >
15
- < button className = 'hover:text-text-hovered' > Active</ button >
16
- < button className = 'hover:text-text-hovered' > Completed</ button >
17
+ < button
18
+ onClick = { ( ) => setFilter ( 'all' ) }
19
+ className = { `${ filter === 'all' ? 'text-bright-blue' : '' } sm:hover:text-text-hovered` }
20
+ >
21
+ All
22
+ </ button >
23
+
24
+ < button
25
+ onClick = { ( ) => setFilter ( 'active' ) }
26
+ className = { `${ filter === 'active' ? 'text-bright-blue' : '' } sm:hover:text-text-hovered` }
27
+ >
28
+ Active
29
+ </ button >
30
+
31
+ < button
32
+ onClick = { ( ) => setFilter ( 'completed' ) }
33
+ className = { `${ filter === 'completed' ? 'text-bright-blue' : '' } sm:hover:text-text-hovered` }
34
+ >
35
+ Completed
36
+ </ button >
17
37
</ div >
18
38
19
39
< ClearAllCompletedBtn todos = { todos } />
Original file line number Diff line number Diff line change @@ -3,28 +3,40 @@ import React from 'react'
3
3
import ListItem from './ListItem'
4
4
import ListControls from './ListControls'
5
5
import { TodoContext } from '@/context/TodoContext'
6
+ import { FilterContext } from '@/context/FilterContext'
6
7
7
8
const TodosContainer = ( ) => {
8
9
9
10
const [ todos , setTodos ] = React . useState < TodoType [ ] > ( [ ] )
10
11
const [ loading , setLoading ] = React . useState ( true )
12
+ const [ filteredTodos , setFilteredTodos ] = React . useState < TodoType [ ] > ( [ ] )
11
13
12
14
const { isManipulated, setIsManipulated } = React . useContext ( TodoContext )
15
+ const { filter, setFilter } = React . useContext ( FilterContext )
13
16
14
17
React . useEffect ( ( ) => {
18
+ setFilter ( 'all' )
15
19
setIsManipulated ( false )
16
20
const todos = JSON . parse ( localStorage . getItem ( 'todos' ) || '[]' )
17
21
setTodos ( todos )
18
22
setLoading ( false )
19
23
} , [ isManipulated ] )
20
24
25
+ React . useEffect ( ( ) => {
26
+ if ( filter === 'active' ) setFilteredTodos ( todos . filter ( todo => ! todo . completed ) )
27
+ else if ( filter === 'completed' ) setFilteredTodos ( todos . filter ( todo => todo . completed ) )
28
+ else setFilteredTodos ( todos )
29
+ } , [ filter , todos ] )
30
+
21
31
const renderTodos = ( ) => {
22
32
23
33
if ( todos . length <= 0 ) {
24
34
return < p className = "text-center text-grayish-text my-10" > Nothing to do for now.</ p >
25
35
}
26
36
27
- return todos . map ( todo => {
37
+ let todosWithContent = filteredTodos . length > 0 ? filteredTodos : todos as TodoType [ ]
38
+
39
+ return todosWithContent . map ( todo => {
28
40
return (
29
41
< ListItem
30
42
key = { todo . id }
Original file line number Diff line number Diff line change
1
+ 'use client'
2
+ import React from 'react'
3
+
4
+ export const FilterContext = React . createContext ( {
5
+ filter : 'all' ,
6
+ setFilter : ( filter : string ) => { } ,
7
+ } )
Original file line number Diff line number Diff line change
1
+ 'use client'
2
+ import React from 'react'
3
+ import { FilterContext } from '@/context/FilterContext'
4
+
5
+ const FilterProvider = ( { children } : ChildrenProps ) => {
6
+
7
+ const [ filter , setFilter ] = React . useState ( 'all' )
8
+
9
+ return (
10
+ < FilterContext . Provider value = { { filter, setFilter } } >
11
+ { children }
12
+ </ FilterContext . Provider >
13
+ )
14
+ }
15
+
16
+ export default FilterProvider
You can’t perform that action at this time.
0 commit comments