ExpoIntermediate
TaskTrack — Today screen ও TaskItem component
Storage-এর tasks UI-তে — FlatList, empty state, toggle।
4টি অংশবাংলা ভাষায়
app/(tabs)/index.tsxtsx
tsx
import { useEffect } from "react";
import { View, FlatList, Text } from "react-native";
import { loadTasks } from "../../lib/storage";
import TaskItem from "../../components/TaskItem";
export default function TodayScreen() {
const [tasks, setTasks] = useState<Array<Task>>([]);
const [loading, setLoading] = useState(true);
useEffect(() => {
loadTasks().then((list) => {
setTasks(list);
setLoading(false);
});
}, []);
if (loading) {
return <Text>Loading…</Text>;
}
return (
<FlatList
data={tasks}
keyExtractor={(task) => task.id}
renderItem={({ item }) => <TaskItem task={item} />}
ListEmptyComponent={
<View style={{ padding: 24 }}>
<Text>আজ কিছু নেই — নিজের জন্য কাজ যোগ করুন</Text>
</View>
}
/>
);
}components/TaskItem.tsxtsx
tsx
import { View, Text, Pressable, StyleSheet } from "react-native";
export default function TaskItem({ task }) {
return (
<View style={styles.row}>
<Pressable style={styles.title}>
<Text style={[styles.text, task.done && styles.done]}>
{task.done ? "✓ " : ""}{task.title}
</Text>
</Pressable>
</View>
);
}
const styles = StyleSheet.create({
row: { padding: 16, borderBottomWidth: 1 },
text: { fontSize: 16 },
done: { textDecorationLine: "line-through", color: "#94a3b8" },
});একই pattern-এ all screen (filter: active/completed) ও progress bar — সবগুলিই tasks state-এর derived।
state কম রাখুন
প্রতিটি screen-এ data force না করে বরং এক জায়গায় (page-level) রাখা — পরে global store-এ move করা সহজ।
শেষ প্যারায় নিজে practice করুন — কোড কপি করে নিজের এডিটরে চালিয়ে দেখুন।