11import { Tabs , TabsContent , TabsList , TabsTrigger } from '@/components/ui/tabs' ;
2+ import { type TabValue , getTodosByTab } from '@/lib/todo-filter' ;
23import { useTodoStore } from '@/store/todo-store' ;
34import { ButtonLink , Header , SearchBar , TodoList } from '@/ui' ;
45import { createFileRoute } from '@tanstack/react-router' ;
@@ -10,12 +11,11 @@ export const Route = createFileRoute('/')({
1011} ) ;
1112
1213function App ( ) {
14+ const { t } = useTranslation ( ) ;
1315 const navigate = Route . useNavigate ( ) ;
1416 const [ searchQuery , setSearchQuery ] = useState ( '' ) ;
17+ const [ tab , setTab ] = useState < TabValue > ( 'all' ) ;
1518 const todos = useTodoStore ( ( state ) => state . todos ) ;
16- const deleteTodos = useTodoStore ( ( state ) => state . delete ) ;
17-
18- const { t } = useTranslation ( ) ;
1919
2020 const onSearchChange = ( e : ChangeEvent < HTMLInputElement > ) => {
2121 setSearchQuery ( e . target . value ) ;
@@ -27,12 +27,13 @@ function App() {
2727
2828 const lowerSearchQuery = searchQuery . toLowerCase ( ) ;
2929 const filteredTodos = useMemo ( ( ) => {
30- return todos . filter (
30+ const matchingTodos = todos . filter (
3131 ( todo ) =>
3232 todo . title . toLowerCase ( ) . includes ( lowerSearchQuery ) ||
3333 todo . description ?. toLowerCase ( ) . includes ( lowerSearchQuery ) ,
3434 ) ;
35- } , [ todos , lowerSearchQuery ] ) ;
35+ return getTodosByTab ( matchingTodos , tab ) ;
36+ } , [ todos , lowerSearchQuery , tab ] ) ;
3637
3738 return (
3839 < div className = "min-h-screen bg-gray-50 pt-16 space-y-8" >
@@ -64,40 +65,18 @@ function App() {
6465 </ div >
6566 < Tabs defaultValue = "all" className = "mt-4" >
6667 < TabsList className = "grid grid-cols-3 w-full max-w-md" >
67- < TabsTrigger value = "all" > All</ TabsTrigger >
68- < TabsTrigger
69- value = "active"
70- onClick = { ( ) => filteredTodos . filter ( ( todo ) => ! todo . completed ) }
71- >
72- Active
68+ < TabsTrigger value = "all" onClick = { ( ) => setTab ( 'all' ) } >
69+ { t ( 'allTab' ) }
7370 </ TabsTrigger >
74- < TabsTrigger
75- value = "completed"
76- onClick = { ( ) => filteredTodos . filter ( ( todo ) => todo . completed ) }
77- >
78- Completed
71+ < TabsTrigger value = "active" onClick = { ( ) => setTab ( 'active' ) } >
72+ { t ( 'activeTab' ) }
73+ </ TabsTrigger >
74+ < TabsTrigger value = "completed" onClick = { ( ) => setTab ( 'completed' ) } >
75+ { t ( 'completedTab' ) }
7976 </ TabsTrigger >
8077 </ TabsList >
81- < TabsContent value = "all" >
82- < TodoList
83- todos = { filteredTodos }
84- onDelete = { deleteTodos }
85- onEdit = { onEdit }
86- />
87- </ TabsContent >
88- < TabsContent value = "active" >
89- < TodoList
90- todos = { filteredTodos . filter ( ( todo ) => ! todo . completed ) }
91- onDelete = { deleteTodos }
92- onEdit = { onEdit }
93- />
94- </ TabsContent >
95- < TabsContent value = "completed" >
96- < TodoList
97- todos = { filteredTodos . filter ( ( todo ) => todo . completed ) }
98- onDelete = { deleteTodos }
99- onEdit = { onEdit }
100- />
78+ < TabsContent value = { tab } >
79+ < TodoList todos = { filteredTodos } onEdit = { onEdit } />
10180 </ TabsContent >
10281 </ Tabs >
10382 </ div >
0 commit comments