Auto fill amount category edit Empty list component calendar filtering in category screen, expenses can be added directly
112 lines
No EOL
4.2 KiB
TypeScript
112 lines
No EOL
4.2 KiB
TypeScript
import AsyncStorage from '@react-native-async-storage/async-storage';
|
|
import { router, useNavigation } from 'expo-router';
|
|
import React, { useEffect, useMemo, useState } from 'react';
|
|
import { StyleSheet, View } from 'react-native';
|
|
import { FlatList } from 'react-native-gesture-handler';
|
|
import { SafeAreaView } from 'react-native-safe-area-context';
|
|
import { BudgetHeader, CategoryItem, EmptyListCompenent, LoadingSymbol, Plus, TextInputBar } from '../../../components';
|
|
import useFetch from '../../../hooks/useFetch';
|
|
import { useTheme } from '../../contexts/ThemeContext';
|
|
import { useFocusEffect } from 'expo-router/src/useFocusEffect';
|
|
|
|
export default function Page() {
|
|
const {colors} = useTheme()
|
|
const containerColor = colors.containerColor;
|
|
const navigation = useNavigation();
|
|
const [selectedPage, setSelectedPage] = useState<"expense"|"saving">("expense");
|
|
const [searchString, setSearchString] = useState("");
|
|
|
|
|
|
|
|
// useEffect(() => {
|
|
// console.log("initial effect called")
|
|
// AsyncStorage.getItem("currentBudgetPage").then((page) => {
|
|
// if(page === "expenses" || page === "savings") {
|
|
// setSelectedPage(page);
|
|
// }
|
|
// }).catch((error) => {
|
|
// console.log("Error fetching previous page from Async Storage:", error);
|
|
// })
|
|
// }, []);
|
|
|
|
const {data, isLoading, reFetch} = useFetch({sql: "SELECT c.guid AS category_guid, c.name AS category_name, c.color AS category_color, c.type AS category_type, SUM(e.amount) as total_expenses, c.allocated_amount as allocated_amount FROM category c LEFT JOIN expense e ON e.category_guid = c.guid GROUP BY c.guid", args: []});
|
|
|
|
useEffect(() => {
|
|
reFetch()
|
|
}, [selectedPage]);
|
|
|
|
|
|
useEffect(() => {
|
|
const unsubscribe = navigation.addListener("focus", () => {
|
|
|
|
reFetch();
|
|
})
|
|
|
|
const t = () => {
|
|
console.log("unsubscribed")
|
|
unsubscribe();
|
|
}
|
|
return t;
|
|
}, [navigation])
|
|
|
|
|
|
const handlePageSelection = (page: "expense" | "saving") => {
|
|
setSelectedPage(page);
|
|
};
|
|
|
|
const handleCategoryPress = (item: {[column: string]: any;}) => {
|
|
router.push({pathname: "/category", params: {category_guid: item.category_guid, category_name: item.category_name}})
|
|
}
|
|
|
|
const filteredData = useMemo(() => {
|
|
return data.filter((item) => {
|
|
if(item.category_type !== selectedPage) {
|
|
return false
|
|
}
|
|
return item.category_name.toLowerCase().includes(searchString.toLowerCase());
|
|
})
|
|
}, [data, searchString, selectedPage]);
|
|
|
|
console.log(selectedPage)
|
|
return (
|
|
<SafeAreaView style={[styles.safeAreaViewStyle, {backgroundColor: containerColor}]}>
|
|
<View style={{flex: 1, marginHorizontal: 10}}>
|
|
<BudgetHeader selectedPage={selectedPage} handlePageSelection={handlePageSelection}/>
|
|
<TextInputBar style={{marginBottom: 20}} value={searchString} onChangeText={setSearchString} placeholder='Search...'></TextInputBar>
|
|
|
|
<Plus onPress={() => {
|
|
router.push({pathname: '/addCategory'});
|
|
}}/>
|
|
|
|
{isLoading ? (<LoadingSymbol/>) : (
|
|
<FlatList
|
|
data={filteredData}
|
|
renderItem = {({item}) => <CategoryItem
|
|
category={item.category_name}
|
|
allocated_amount={item.allocated_amount ?? 0}
|
|
color={item.category_color}
|
|
category_guid={item.category_guid}
|
|
total_expenses={item.total_expenses ?? 0}
|
|
onPress={() => {
|
|
handleCategoryPress(item);
|
|
}}/>}
|
|
keyExtractor={item => item.category_guid}
|
|
ItemSeparatorComponent={() => {
|
|
return (<View style={styles.itemSeperatorStyle}/>);
|
|
}}
|
|
ListEmptyComponent={EmptyListCompenent}
|
|
/>
|
|
)}
|
|
</View>
|
|
</SafeAreaView>
|
|
);
|
|
}
|
|
|
|
const styles = StyleSheet.create({
|
|
safeAreaViewStyle: {
|
|
flex: 1,
|
|
},
|
|
itemSeperatorStyle: {
|
|
marginVertical: 5,
|
|
},
|
|
}); |