diff --git a/app/(auth)/grocery/index.tsx b/app/(auth)/grocery/index.tsx
index eff5da5..5c9d1e4 100644
--- a/app/(auth)/grocery/index.tsx
+++ b/app/(auth)/grocery/index.tsx
@@ -3,16 +3,12 @@ import GroceryList from "@/components/pages/grocery/GroceryList";
import AddGroceryItem from "@/components/pages/grocery/AddGroceryItem";
import { GroceryProvider } from "@/contexts/GroceryContext";
import React from "react";
-import HeaderTemplate from "@/components/shared/HeaderTemplate";
-import { ScrollView } from "react-native-gesture-handler";
+import GroceryWrapper from "@/components/pages/grocery/GroceryWrapper";
export default function Screen() {
return (
-
-
-
-
+
);
}
diff --git a/app/(auth)/todos/index.tsx b/app/(auth)/todos/index.tsx
index b158e9e..af1215d 100644
--- a/app/(auth)/todos/index.tsx
+++ b/app/(auth)/todos/index.tsx
@@ -1,4 +1,5 @@
import AddChore from "@/components/pages/todos/AddChore";
+import ProgressCard from "@/components/pages/todos/ProgressCard";
import ToDoItem from "@/components/pages/todos/ToDoItem";
import ToDosList from "@/components/pages/todos/ToDosList";
import HeaderTemplate from "@/components/shared/HeaderTemplate";
@@ -13,7 +14,8 @@ export default function Screen() {
-
+
+
diff --git a/components/pages/grocery/CategoryDropdown.tsx b/components/pages/grocery/CategoryDropdown.tsx
index bd1c6c0..7cb787a 100644
--- a/components/pages/grocery/CategoryDropdown.tsx
+++ b/components/pages/grocery/CategoryDropdown.tsx
@@ -1,26 +1,34 @@
import React from "react";
import { View, Text, TouchableOpacity } from "react-native-ui-lib";
-import { GroceryCategory } from "@/contexts/GroceryContext";
+import { GroceryCategory, useGroceryContext } from "@/contexts/GroceryContext";
import { ScrollView } from "react-native-gesture-handler";
-const CategoryDropdown = () => {
+const CategoryDropdown = (props: {
+ setSelectedCategory: (category: GroceryCategory) => void;
+}) => {
const groceryCategories = Object.values(GroceryCategory);
return (
-
- {groceryCategories.map((category) => (
- {}}>
-
+
+ {groceryCategories.map((category) => (
+ {
+ props.setSelectedCategory(category);
}}
>
- {category}
-
-
- ))}
-
+
+ {category}
+
+
+ ))}
+
+
);
};
diff --git a/components/pages/grocery/EditGroceryItem.tsx b/components/pages/grocery/EditGroceryItem.tsx
new file mode 100644
index 0000000..6e4bf68
--- /dev/null
+++ b/components/pages/grocery/EditGroceryItem.tsx
@@ -0,0 +1,28 @@
+import { View, Text } from 'react-native'
+import React from 'react'
+import { TextField } from 'react-native-ui-lib'
+import CategoryDropdown from './CategoryDropdown'
+import { GroceryCategory } from '@/contexts/GroceryContext'
+
+const EditGroceryItem = (props: {title: string, setTitle: (value: string) => void, setCategory: (category: GroceryCategory) => void}) => {
+ return (
+
+ props.setTitle(value)}
+ maxLength={25}
+ />
+
+
+ )
+}
+
+export default EditGroceryItem
\ No newline at end of file
diff --git a/components/pages/grocery/GroceryItem.tsx b/components/pages/grocery/GroceryItem.tsx
index 5395947..ef12135 100644
--- a/components/pages/grocery/GroceryItem.tsx
+++ b/components/pages/grocery/GroceryItem.tsx
@@ -9,9 +9,14 @@ import React, { useEffect, useState } from "react";
import { ProfileType, useAuthContext } from "@/contexts/AuthContext";
import { MaterialCommunityIcons, AntDesign } from "@expo/vector-icons";
import { ListItem } from "react-native-ui-lib";
-import { IGrocery, useGroceryContext } from "@/contexts/GroceryContext";
+import {
+ GroceryCategory,
+ IGrocery,
+ useGroceryContext,
+} from "@/contexts/GroceryContext";
import EditGroceryFrequency from "./EditGroceryFrequency";
import { TextInput } from "react-native";
+import EditGroceryItem from "./EditGroceryItem";
const GroceryItem = ({
item,
@@ -20,8 +25,7 @@ const GroceryItem = ({
item: IGrocery;
handleItemApproved: (id: number, changes: Partial) => void;
}) => {
- const { updateGroceryItem, groceries } =
- useGroceryContext();
+ const { updateGroceryItem, groceries } = useGroceryContext();
const { profileType } = useAuthContext();
const [openFreqEdit, setOpenFreqEdit] = useState(false);
@@ -32,16 +36,20 @@ const GroceryItem = ({
updateGroceryItem(item.id, { title: newTitle });
};
+ const handleCategoryChange = (newCategory: GroceryCategory) => {
+ updateGroceryItem(item.id, { category: newCategory });
+ };
+
useEffect(() => {
setNewTitle(item.title);
}, []);
return (
{
setOpenFreqEdit(true);
}}
@@ -55,7 +63,7 @@ const GroceryItem = ({
}}
/>
- {/*
}
/>*/}
-
- {!isEditingTitle ? (
+ {!isEditingTitle ? (
+
setIsEditingTitle(true)}>
{item.title}
- ) : (
+ { /*
- )}
-
+ */}
+
+ ) : (
+
+ )}
{!item.approved ? (
diff --git a/components/pages/grocery/GroceryList.tsx b/components/pages/grocery/GroceryList.tsx
index e17d5df..e8ba6c9 100644
--- a/components/pages/grocery/GroceryList.tsx
+++ b/components/pages/grocery/GroceryList.tsx
@@ -1,38 +1,69 @@
import { FlatList } from "react-native";
import React, { useEffect, useState } from "react";
-import {
- View,
- Text,
- ListItem,
- Button,
- TextField,
- Picker,
-} from "react-native-ui-lib";
-import MaterialCommunityIcons from "@expo/vector-icons/MaterialCommunityIcons";
-import { useAuthContext } from "@/contexts/AuthContext";
-import AntDesign from "@expo/vector-icons/AntDesign";
-import AddGroceryItem from "./AddGroceryItem";
+import { View, Text, ListItem, Button, TextField } from "react-native-ui-lib";
import GroceryItem from "./GroceryItem";
import {
- GroceryCategory,
IGrocery,
+ GroceryCategory,
+ GroceryFrequency,
useGroceryContext,
} from "@/contexts/GroceryContext";
import HeaderTemplate from "@/components/shared/HeaderTemplate";
import CategoryDropdown from "./CategoryDropdown";
+import { MaterialIcons } from "@expo/vector-icons";
+import EditGroceryItem from "./EditGroceryItem";
const GroceryList = () => {
- const { groceries, updateGroceryItem, isAddingGrocery } = useGroceryContext();
+ const {
+ groceries,
+ updateGroceryItem,
+ isAddingGrocery,
+ setIsAddingGrocery,
+ addGrocery,
+ } = useGroceryContext();
const [approvedGroceries, setapprovedGroceries] = useState(
- groceries.filter((item) => item.approved == true)
+ groceries.filter((item) => item.approved === true)
);
const [pendingGroceries, setPendingGroceries] = useState(
- groceries.filter((item) => item.approved != true)
+ groceries.filter((item) => item.approved !== true)
+ );
+ const [category, setCategory] = useState(
+ GroceryCategory.Bakery
+ );
+ const [title, setTitle] = useState("");
+
+ // Group approved groceries by category
+ const approvedGroceriesByCategory = approvedGroceries.reduce(
+ (groups: any, item: IGrocery) => {
+ const category = item.category || "Uncategorized";
+ if (!groups[category]) {
+ groups[category] = [];
+ }
+ groups[category].push(item);
+ return groups;
+ },
+ {}
);
useEffect(() => {
- setapprovedGroceries(groceries.filter((item) => item.approved == true));
- setPendingGroceries(groceries.filter((item) => item.approved != true));
+ if (title?.length > 2 && title?.length <= 25) {
+ addGrocery({
+ id: 0,
+ title: title,
+ category: category,
+ approved: false,
+ recurring: false,
+ frequency: GroceryFrequency.Never,
+ bought: false,
+ });
+
+ setIsAddingGrocery(false);
+ }
+ }, [category]);
+
+ useEffect(() => {
+ setapprovedGroceries(groceries.filter((item) => item.approved === true));
+ setPendingGroceries(groceries.filter((item) => item.approved !== true));
}, [groceries]);
return (
@@ -49,7 +80,7 @@ const GroceryList = () => {
>
{approvedGroceries.length} list{" "}
- {approvedGroceries.length == 1 ? (
+ {approvedGroceries.length === 1 ? (
item
@@ -69,6 +100,13 @@ const GroceryList = () => {
{pendingGroceries.length} pending
+