import { ActivityIndicator, Dimensions, FlatList, StyleSheet } from "react-native"; import React, { useEffect, useState } from "react"; import { Text, TouchableOpacity, View } from "react-native-ui-lib"; import GroceryItem from "./GroceryItem"; import { useGroceryContext } from "@/contexts/GroceryContext"; import HeaderTemplate from "@/components/shared/HeaderTemplate"; import { AntDesign } from "@expo/vector-icons"; import EditGroceryItem from "./EditGroceryItem"; import { IGrocery } from "@/hooks/firebase/types/groceryData"; import Ionicons from '@expo/vector-icons/Ionicons'; import AddChoreDialog from "@/components/pages/todos/AddChoreDialog"; import { REPEAT_TYPE } from "@/hooks/firebase/types/todoData"; import { ToDosContextProvider } from "@/contexts/ToDosContext"; const shoppingTodo = { id: "", title: "Go shopping", points: 10, date: new Date(), rotate: false, repeatType: REPEAT_TYPE.NONE, assignees: [], repeatDays: [] }; const GroceryList = ({onInputFocus}: {onInputFocus: (y: number) => void}) => { const { groceries, updateGroceryItem, } = useGroceryContext(); const [approvedGroceries, setApprovedGroceries] = useState( groceries?.filter((item) => item.approved) ); const [pendingGroceries, setPendingGroceries] = useState( groceries?.filter((item) => !item.approved) ); const [pendingVisible, setPendingVisible] = useState(true); const [approvedVisible, setApprovedVisible] = useState(true); const [choreDialogVisible, setChoreDialogVisible] = useState(false); // Group approved groceries by category let approvedGroceriesByCategory = approvedGroceries?.reduce( (groups: any, item: IGrocery) => { let category = item.category || "Uncategorized"; if (item.bought) { category = "Done"; } if (!groups[category]) { groups[category] = []; } groups[category].push(item); // Sort items within each category - bought items at bottom groups[category].sort((a: IGrocery, b: IGrocery) => { if (a.bought === b.bought) return 0; return a.bought ? 1 : -1; }); return groups; }, {} ); useEffect(() => { setApprovedGroceries(groceries?.filter((item) => item.approved)); setPendingGroceries(groceries?.filter((item) => !item.approved)); }, [groceries]); return ( <> {!groceries && } {approvedGroceries?.length} list{" "} {approvedGroceries?.length === 1 ? ( item ) : ( items )} {pendingGroceries?.length} pending setChoreDialogVisible(true)}> {choreDialogVisible && } {/* Pending Approval Section */} {setPendingVisible(!pendingVisible)}}> Pending Approval {pendingVisible && ( )} {!pendingVisible && ( )} {pendingGroceries?.length.toString()} {pendingGroceries?.length > 0 ? pendingVisible && ( ( updateGroceryItem({...changes, id: id}) } onInputFocus={onInputFocus} /> )} keyExtractor={(item) => item.id.toString()} /> ) : pendingVisible && ( No items pending approval. )} {/* Approved Section */} {setApprovedVisible(!approvedVisible)}}> Shopping List {approvedVisible && ( )} {!approvedVisible && ( )} {approvedGroceries?.length.toString()} {/* Render Approved Groceries Grouped by Category */} {approvedGroceries?.length > 0 ? approvedVisible && ( { if (a !== "Done") return -1; if (b === "Done") return 1; return 0; })} renderItem={({item: category}) => ( {/* Render Category Header */} {category} {/* Render Grocery Items for this Category */} {approvedGroceriesByCategory[category].map( (grocery: IGrocery) => ( updateGroceryItem({...changes, id: id}) } onInputFocus={onInputFocus} approvedGroceries={approvedGroceries} setApprovedGroceries={setApprovedGroceries} /> ) )} )} keyExtractor={(category) => category} /> ) : approvedVisible && ( No approved items. )} ); }; const styles = StyleSheet.create({ dropIcon: { marginHorizontal: 10, }, noItemTxt: { fontFamily: "Manrope_400Regular", fontSize: 14, }, counterText: { fontSize: 14, fontFamily: "PlusJakartaSans_600SemiBold", }, subHeader: { fontSize: 15, fontFamily: "Manrope_700Bold", }, counterNr: { fontFamily: "PlusJakartaSans_600SemiBold", fontSize: 14 }, loaderContainer: { ...StyleSheet.absoluteFillObject, justifyContent: 'center', alignItems: 'center', height: Dimensions.get("window").height, width: Dimensions.get("window").width, backgroundColor: 'rgba(218,217,217,0.6)', zIndex: 999, }, }); export default GroceryList;