react-nativeappcode
react-nativeappcode
import {
View,
Text,
TouchableOpacity,
ScrollView,
Modal,
StyleSheet,
StatusBar,
TextInput,
Alert,
} from "react-native";
import { SafeAreaView } from "react-native-safe-area-context";
import { Ionicons } from "@expo/vector-icons";
useEffect(() => {
setToday(new Date());
}, []);
setPurchaseData((prevData) => ({
...prevData,
[dateString]: [...(prevData[dateString] || []), newPurchase],
}));
setNewDescription("");
setNewAmount("");
};
return totalSpent;
};
return (
<View style={styles.progressContainer}>
<Text style={styles.progressTitle}>Monthly Progress</Text>
<View style={styles.progressBarContainer}>
<View style={styles.progressLabelContainer}>
<Text style={styles.progressLabel}>Total
Spent</Text>
<Text style={styles.progressAmount}>
${totalSpent.toFixed(2)} / $
{monthlyBudget.toFixed(2)}
</Text>
</View>
<View style={styles.progressBarBackground}>
<View
style={[
styles.progressBarFill,
{ width: `${spentPercentage}%`,
backgroundColor: "#ef4444" },
]}
/>
</View>
</View>
<View style={styles.progressBarContainer}>
<View style={styles.progressLabelContainer}>
<Text style={styles.progressLabel}>Total
Saved</Text>
<Text style={styles.progressAmount}>
${totalSaved.toFixed(2)} / $
{monthlyBudget.toFixed(2)}
</Text>
</View>
<View style={styles.progressBarBackground}>
<View
style={[
styles.progressBarFill,
{ width: `${savedPercentage}%`,
backgroundColor: "#22c55e" },
]}
/>
</View>
</View>
</View>
);
};
return (
<SafeAreaView style={styles.container}>
<StatusBar barStyle="light-content" />
<ScrollView contentContainerStyle={styles.scrollContent}>
<Text style={styles.title}>Progress Calendar</Text>
<View style={styles.calendarHeader}>
<TouchableOpacity onPress={handlePrevMonth}>
<Ionicons name="chevron-back" size={24}
color="white" />
</TouchableOpacity>
<Text style={styles.monthYearText}>
{currentDate.toLocaleString("default", {
month: "long",
year: "numeric",
})}
</Text>
<TouchableOpacity onPress={handleNextMonth}>
<Ionicons name="chevron-forward" size={24}
color="white" />
</TouchableOpacity>
</View>
<View style={styles.calendar}>
{weekdaysShort.map((day) => (
<View key={day} style={styles.weekdayLabel}>
<Text
style={styles.weekdayText}>{day}</Text>
</View>
))}
{getPreviousMonthDays(currentDate).map((day) => (
<View key={`prev-${day}`}
style={styles.dayContainer}>
<Text
style={styles.prevMonthDay}>{day}</Text>
</View>
))}
{Array.from(
{ length: getDaysInMonth(currentDate) },
(_, i) => i + 1
).map((day) => (
<TouchableOpacity
key={day}
style={[
styles.dayContainer,
isToday(day) &&
styles.todayHighlight,
]}
onPress={() => handleDayPress(day)}
>
<Text style={styles.dayText}>{day}</Text>
<View
style={[
styles.progressIndicator,
{ backgroundColor:
getProgressColor(day) },
]}
/>
</TouchableOpacity>
))}
</View>
<View style={styles.costBudgetInputContainer}>
<Text style={styles.costBudgetLabel}>Average
cost:</Text>
<TextInput
style={styles.input}
keyboardType="numeric"
onChangeText={(value) =>
setAverageCost(Number(value))}
value={String(averageCost)}
/>
</View>
<View style={styles.costBudgetInputContainer}>
<Text style={styles.costBudgetLabel}>Monthly
budget:</Text>
<TextInput
style={styles.input}
keyboardType="numeric"
onChangeText={(value) =>
setMonthlyBudget(Number(value))}
value={String(monthlyBudget)}
/>
</View>
<MonthlyProgressBars />
<Modal
visible={isModalVisible}
transparent={true}
onRequestClose={() => setIsModalVisible(false)}
animationType="slide"
>
<View style={styles.modalContainer}>
<View style={styles.modalContent}>
<Text style={styles.modalTitle}>
Total Spent on{" "}
{selectedDay?.toLocaleString("default", {
month: "long",
})}
</Text>
<Text style={styles.modalTotalAmount}>
${getDailyTotal(selectedDay || new
Date()).toFixed(2)}
</Text>
<ScrollView style={styles.modalList}>
{(
purchaseData[selectedDay?.toISOString().split("T")[0]] || []
).map((item) => (
<View key={item.id}
style={styles.modalListItem}>
<Text
style={styles.modalListItemText}>
{item.description}:
</Text>
<Text
style={styles.modalListItemAmount}>
$
{item.amount.toFixed(2)}
</Text>
</View>
))}
</ScrollView>
<View style={styles.inputRow}>
<TextInput
style={styles.newInput}
placeholder="Description"
placeholderTextColor="#9ca3af"
value={newDescription}
onChangeText={setNewDescription}
/>
<TextInput
style={styles.newInput}
placeholder="Amount"
placeholderTextColor="#9ca3af"
value={newAmount}
onChangeText={setNewAmount}
keyboardType="numeric"
/>
</View>
<View style={styles.buttonRow}>
<TouchableOpacity
style={styles.addButton}
onPress={handleAddPurchase}
>
<Text
style={styles.addButtonText}>Add</Text>
</TouchableOpacity>
<TouchableOpacity
style={styles.closeButton}
onPress={() =>
setIsModalVisible(false)}
>
<Text
style={styles.closeButtonText}>Close</Text>
</TouchableOpacity>
</View>
</View>
</View>
</Modal>
</ScrollView>
</SafeAreaView>
);
};