import React from 'react';
import { View, Text, FlatList, Switch, StyleSheet } from 'react-native';
import { useSelector, useDispatch } from 'react-redux';
// Selector to get all todos
const selectTodos = (state) => state.todos;
// Selector to get completed todos
const selectCompletedTodos = (state) => state.todos.filter(todo => todo.completed);
export default function TodoListScreen() {
const dispatch = useDispatch();
const todos = useSelector(selectTodos);
const completedTodos = useSelector(selectCompletedTodos);
const toggleTodo = (id) => {
dispatch({ type: 'TOGGLE_TODO', payload: id });
};
return (
<View style={styles.container}>
<Text style={styles.title}>Todo List</Text>
<FlatList
data={todos}
keyExtractor={(item) => item.id.toString()}
renderItem={({ item }) => (
<View style={styles.todoItem}>
<Switch
value={item.completed}
onValueChange={() => toggleTodo(item.id)}
accessibilityLabel={`Toggle todo ${item.text}`}
/>
<Text style={styles.todoText}>{item.text}</Text>
</View>
)}
/>
<Text style={styles.completedCount}>Completed: {completedTodos.length}</Text>
</View>
);
}
const styles = StyleSheet.create({
container: { flex: 1, padding: 20, backgroundColor: '#fff' },
title: { fontSize: 24, fontWeight: 'bold', marginBottom: 10 },
todoItem: { flexDirection: 'row', alignItems: 'center', marginBottom: 10 },
todoText: { marginLeft: 10, fontSize: 18 },
completedCount: { marginTop: 20, fontSize: 18, fontWeight: 'bold' },
});We created two selectors: one to get all todos, and one to get only completed todos. This keeps our component clean and focused on UI.
We use useSelector to get the todos and completed todos count from Redux state.
The FlatList shows all todos with a switch to toggle completion. When toggled, it dispatches an action to update the store.
This approach separates data selection logic from UI, making code easier to maintain and test.