From ef03804e246fd07a3903d0a3cd3c0cb8d1ac1ec0 Mon Sep 17 00:00:00 2001 From: = Date: Sun, 3 Nov 2024 16:11:42 -0300 Subject: [PATCH] Subindo redux para armazenamento do estado de datas --- frontend/App.tsx | 7 +- frontend/package-lock.json | 89 ++++++++++++++++++- frontend/package.json | 4 +- frontend/src/context/dateContext.tsx | 24 ----- frontend/src/dateSlice.ts | 17 ++++ frontend/src/routes/index.tsx | 1 - frontend/src/routes/stack.routes.tsx | 64 +++++-------- frontend/src/screens/AguaScreen/index.tsx | 11 +-- .../AlimentosConsumidosScreen/index.tsx | 44 ++++----- .../src/screens/FavoritesScreen/index.tsx | 41 --------- frontend/src/screens/HomeScreen/index.tsx | 51 +++++------ frontend/src/screens/ProductPG/index.tsx | 11 +-- frontend/src/screens/SelectAlimento/index.tsx | 1 + frontend/src/store/store.ts | 11 +++ frontend/src/types/index.ts | 3 + frontend/types/index.ts | 5 +- 16 files changed, 206 insertions(+), 178 deletions(-) delete mode 100644 frontend/src/context/dateContext.tsx create mode 100644 frontend/src/dateSlice.ts delete mode 100644 frontend/src/screens/FavoritesScreen/index.tsx create mode 100644 frontend/src/store/store.ts diff --git a/frontend/App.tsx b/frontend/App.tsx index 759f750..e1b852e 100644 --- a/frontend/App.tsx +++ b/frontend/App.tsx @@ -3,8 +3,9 @@ import React, { useEffect } from "react"; import * as SplashScreen from "expo-splash-screen"; import { useFonts, Signika_400Regular } from "@expo-google-fonts/signika"; import { UserProvider } from "./src/context/userContext"; -import { DateProvider } from "./src/context/dateContext"; import { PaperProvider } from "react-native-paper"; +import {Provider} from 'react-redux' +import { store } from "./src/store/store"; SplashScreen.preventAutoHideAsync(); // Manter a splash screen até as fontes serem carregadas export default function App() { @@ -25,11 +26,11 @@ export default function App() { } return ( + - - + ) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index a7fae6f..fd0eb26 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -19,6 +19,7 @@ "@react-navigation/native": "^6.1.18", "@react-navigation/native-stack": "^6.11.0", "@react-navigation/stack": "^6.4.1", + "@reduxjs/toolkit": "^2.3.0", "@types/react-native": "^0.73.0", "axios": "^1.7.7", "cors": "^2.8.5", @@ -44,7 +45,8 @@ "react-native-svg": "^15.7.1", "react-native-svg-circular-progress": "^1.0.4", "react-native-vector-icons": "^10.2.0", - "react-native-web": "~0.19.10" + "react-native-web": "~0.19.10", + "react-redux": "^9.1.2" }, "devDependencies": { "@babel/core": "^7.20.0", @@ -5791,6 +5793,29 @@ "react-native-screens": ">= 3.0.0" } }, + "node_modules/@reduxjs/toolkit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.3.0.tgz", + "integrity": "sha512-WC7Yd6cNGfHx8zf+iu+Q1UPTfEcXhQ+ATi7CV1hlrSAaQBdlPzg7Ww/wJHNQem7qG9rxmWoFCDCPubSvFObGzA==", + "dependencies": { + "immer": "^10.0.3", + "redux": "^5.0.1", + "redux-thunk": "^3.1.0", + "reselect": "^5.1.0" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18", + "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, "node_modules/@remix-run/node": { "version": "2.12.1", "resolved": "https://registry.npmjs.org/@remix-run/node/-/node-2.12.1.tgz", @@ -6077,6 +6102,11 @@ "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==" }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", + "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==" + }, "node_modules/@types/yargs": { "version": "17.0.33", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", @@ -9200,6 +9230,15 @@ "node": ">=16.x" } }, + "node_modules/immer": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.1.1.tgz", + "integrity": "sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, "node_modules/import-fresh": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", @@ -13028,6 +13067,28 @@ "async-limiter": "~1.0.0" } }, + "node_modules/react-redux": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.1.2.tgz", + "integrity": "sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w==", + "dependencies": { + "@types/use-sync-external-store": "^0.0.3", + "use-sync-external-store": "^1.0.0" + }, + "peerDependencies": { + "@types/react": "^18.2.25", + "react": "^18.0", + "redux": "^5.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "redux": { + "optional": true + } + } + }, "node_modules/react-refresh": { "version": "0.14.2", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", @@ -13089,6 +13150,19 @@ "node": ">=0.10.0" } }, + "node_modules/redux": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", + "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==" + }, + "node_modules/redux-thunk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", + "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", + "peerDependencies": { + "redux": "^5.0.0" + } + }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -13218,6 +13292,11 @@ "path-parse": "^1.0.5" } }, + "node_modules/reselect": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz", + "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==" + }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -14795,6 +14874,14 @@ "react": ">=16.8" } }, + "node_modules/use-sync-external-store": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", + "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/util": { "version": "0.12.5", "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", diff --git a/frontend/package.json b/frontend/package.json index d041e3e..bcbfbd5 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -20,6 +20,7 @@ "@react-navigation/native": "^6.1.18", "@react-navigation/native-stack": "^6.11.0", "@react-navigation/stack": "^6.4.1", + "@reduxjs/toolkit": "^2.3.0", "@types/react-native": "^0.73.0", "axios": "^1.7.7", "cors": "^2.8.5", @@ -45,7 +46,8 @@ "react-native-svg": "^15.7.1", "react-native-svg-circular-progress": "^1.0.4", "react-native-vector-icons": "^10.2.0", - "react-native-web": "~0.19.10" + "react-native-web": "~0.19.10", + "react-redux": "^9.1.2" }, "devDependencies": { "@babel/core": "^7.20.0", diff --git a/frontend/src/context/dateContext.tsx b/frontend/src/context/dateContext.tsx deleted file mode 100644 index 3f3faf0..0000000 --- a/frontend/src/context/dateContext.tsx +++ /dev/null @@ -1,24 +0,0 @@ -// src/context/DateContext.tsx -import React, { createContext, useState, ReactNode } from 'react'; -import moment from 'moment'; - -interface DateContextData { - date: string; - setDate: React.Dispatch>; -} - -export const DateContext = createContext(undefined); - -interface DateProviderProps { - children: ReactNode; -} - -export const DateProvider = ({ children }: DateProviderProps) => { - const [date, setDate] = useState(moment.utc().format("YYYY-MM-DD")); - - return ( - - {children} - - ); -}; diff --git a/frontend/src/dateSlice.ts b/frontend/src/dateSlice.ts new file mode 100644 index 0000000..f77ed1b --- /dev/null +++ b/frontend/src/dateSlice.ts @@ -0,0 +1,17 @@ +import { createSlice } from '@reduxjs/toolkit'; +import moment from 'moment'; + +export const dateSlice = createSlice({ + name: 'date', + initialState: { + value: moment.utc().format("YYYY-MM-DD"), + }, + reducers: { + setNewDate: (state, action) => { state.value = action.payload } + }, +}); + +export const { setNewDate } = dateSlice.actions; +export const selectDate = (state: any) => state.date.value; + +export default dateSlice.reducer; \ No newline at end of file diff --git a/frontend/src/routes/index.tsx b/frontend/src/routes/index.tsx index 7862976..e28ac82 100644 --- a/frontend/src/routes/index.tsx +++ b/frontend/src/routes/index.tsx @@ -1,6 +1,5 @@ import StackRoutes from "./stack.routes"; import { NavigationContainer } from "@react-navigation/native"; -import TabRoutes from "./tab.routes"; import { UserContext } from "../context/userContext"; import { useContext } from "react"; import AuthRoutes from "./auth.routes"; diff --git a/frontend/src/routes/stack.routes.tsx b/frontend/src/routes/stack.routes.tsx index ebe2e0c..ad98243 100644 --- a/frontend/src/routes/stack.routes.tsx +++ b/frontend/src/routes/stack.routes.tsx @@ -18,7 +18,6 @@ import React from "react"; import ProductDetailsScreenPG from "../screens/ProductPG"; import AlimentosConsumidosScreen from "../screens/AlimentosConsumidosScreen"; import SelectRefeicao from "../screens/SelectRefeicao"; -import Main from "../screens/HomeScreen"; import { IuserLogin } from "../types/user"; const Stack = createStackNavigator(); @@ -27,14 +26,14 @@ export default function StackRoutes() { const [isOnboardingCompleted, setIsOnboardingCompleted] = useState< null | boolean >(null); - const [user,setUser] = useState(); + const [user, setUser] = useState(); useEffect(() => { const checkOnboardingStatus = async () => { const completed = await AsyncStorage.getItem("onboardingCompleted"); setIsOnboardingCompleted(completed === "true"); - const userData = await AsyncStorage.getItem("user"); + const userData = await AsyncStorage.getItem("user"); setUser(userData ? JSON.parse(userData) : null); }; @@ -46,40 +45,17 @@ export default function StackRoutes() { } return ( - ({ - headerShown: !(route.name === "Onboarding"), - headerLeft: - route.name === "Main" - ? () => ( - navigation.goBack()} - style={{ - flexDirection: "row", - alignItems: "center", - marginLeft: 10, - }} - > - - Voltar - - ) - : undefined, - })} - > - {!isOnboardingCompleted && ( - - )} - - - - - + + + + + + - + /> - + }} /> diff --git a/frontend/src/screens/AguaScreen/index.tsx b/frontend/src/screens/AguaScreen/index.tsx index 8dd7988..533e224 100644 --- a/frontend/src/screens/AguaScreen/index.tsx +++ b/frontend/src/screens/AguaScreen/index.tsx @@ -2,18 +2,19 @@ import React, { useState, useEffect, useContext } from "react"; import { View, Text, StyleSheet, TouchableOpacity, Image, Alert } from "react-native"; import { Ionicons } from "@expo/vector-icons"; import styles from "./styles"; -import AsyncStorage from "@react-native-async-storage/async-storage"; import axios from "axios"; import { BACKEND_API_URL } from "@env"; import { useNavigation } from '@react-navigation/native'; // Importa o hook de navegação -import { DateContext } from "../../context/dateContext"; import { UserContext } from "../../context/userContext"; +import { useSelector } from "react-redux"; +import { selectDate } from "../../dateSlice"; export default function Agua() { const [quantity, setQuantity] = useState(150); const [savedQuantity, setSavedQuantity] = useState(null); - const { date } = useContext(DateContext)!; const { user } = useContext(UserContext)!; + // REDUX LOGIC + const dataSelecionada = useSelector(selectDate); const MAX_QUANTITY = 1000; @@ -24,11 +25,11 @@ export default function Agua() { const handleSave = async () => { // Check if userId and date are provided - if (user?.id && date) { + if (user?.id && dataSelecionada) { try { // Make PUT request to update the water quantity for the user const response = await axios.post(`${BACKEND_API_URL}/agua/${user.id}`, { - date: date, + date: dataSelecionada, quantify: quantity }); // Update the saved quantity state diff --git a/frontend/src/screens/AlimentosConsumidosScreen/index.tsx b/frontend/src/screens/AlimentosConsumidosScreen/index.tsx index 0c7fcfc..5cb2d3e 100644 --- a/frontend/src/screens/AlimentosConsumidosScreen/index.tsx +++ b/frontend/src/screens/AlimentosConsumidosScreen/index.tsx @@ -1,4 +1,4 @@ -import React, { useState, useEffect } from "react"; +import React, { useState, useEffect, useContext, useCallback } from "react"; import { View, Text, @@ -14,15 +14,22 @@ import styles from "./styles"; import { IAlimentos } from "../../types/AlimentosPG"; import AsyncStorage from "@react-native-async-storage/async-storage"; import { IuserLogin } from "../../types/user"; -import { useNavigation } from '@react-navigation/native'; // Importação da navegação +import { useFocusEffect, useNavigation } from '@react-navigation/native'; // Importação da navegação import { RootStackParamList } from "../../../types"; import { StackNavigationProp } from "@react-navigation/stack"; +import { useSelector } from "react-redux"; +import { selectDate } from "../../dateSlice"; +import { UserContext } from "../../context/userContext"; type ConsumidosNavigationProp = StackNavigationProp; type Props = { navigation: ConsumidosNavigationProp; }; export default function AlimentosConsumidosScreen({ navigation }: Props) { + const dates = useSelector(selectDate); + const { user } = useContext(UserContext)!; + + const [alimentosConsumidos, setAlimentosConsumidos] = useState([]); const [totals, setTotals] = useState({ @@ -34,26 +41,12 @@ export default function AlimentosConsumidosScreen({ navigation }: Props) { sodio: 0, }); - const loadUserFromStorage = async () => { - try { - const storedUser = await AsyncStorage.getItem("user"); - const storedDate = await AsyncStorage.getItem("date"); - - if (storedUser && storedDate) { - const user: IuserLogin = JSON.parse(storedUser) - const date = JSON.parse(storedDate); - await fetchAlimentos(user.id, date); - } - } catch (error) { - console.error("Erro ao obter dados do AsyncStorage:", error); - } - }; - const fetchAlimentos = async (id: string, date: string) => { + const fetchAlimentos = async () => { try { const response = await axios.post(`${BACKEND_API_URL}/consumidos`, { - idUser: id, - date: date + idUser: user?.id, + date: dates }); const alimentos = response.data @@ -89,12 +82,13 @@ export default function AlimentosConsumidosScreen({ navigation }: Props) { } }; - useEffect(() => { - navigation.addListener('focus', async () => { + useFocusEffect( + useCallback(() => { + fetchAlimentos(); + }, + [dates]) + ); - await loadUserFromStorage(); - }) - }, [navigation]); return ( @@ -129,7 +123,7 @@ export default function AlimentosConsumidosScreen({ navigation }: Props) { - + } diff --git a/frontend/src/screens/FavoritesScreen/index.tsx b/frontend/src/screens/FavoritesScreen/index.tsx deleted file mode 100644 index 4dfd5a3..0000000 --- a/frontend/src/screens/FavoritesScreen/index.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import React from "react"; -import { View, Text, FlatList, StyleSheet } from "react-native"; - -const favoriteItems = [ - { id: "1", name: "Banana" }, - { id: "2", name: "Salada de Frutas" }, - { id: "3", name: "Frango Grelhado" }, - // Adicione mais itens favoritos conforme necessário -]; - -export default function FavoritesScreen() { - return ( - - Meus Favoritos - item.id} - renderItem={({ item }) => {item.name}} - /> - - ); -} - -const styles = StyleSheet.create({ - container: { - flex: 1, - padding: 16, - justifyContent: "center", - }, - title: { - fontSize: 24, - marginBottom: 16, - textAlign: "center", - }, - item: { - fontSize: 18, - padding: 10, - borderBottomWidth: 1, - borderBottomColor: "#C0C0C0", - }, -}); diff --git a/frontend/src/screens/HomeScreen/index.tsx b/frontend/src/screens/HomeScreen/index.tsx index 20c52e3..f922ee4 100644 --- a/frontend/src/screens/HomeScreen/index.tsx +++ b/frontend/src/screens/HomeScreen/index.tsx @@ -18,20 +18,21 @@ import AguaConsumo from "../../components/AguaConsumo"; import AlimentacaoConsumo from "../../components/AlimentacaoConsumo"; import { StackNavigationProp } from "@react-navigation/stack"; import { RootStackParamList } from "../../../types"; -import AsyncStorage from "@react-native-async-storage/async-storage"; -import { IuserLogin } from "../../types/user"; -import { useNavigation, useRoute } from '@react-navigation/native'; // Importação da navegação +import { useFocusEffect, useNavigation, useRoute } from '@react-navigation/native'; // Importação da navegação import { Alert } from 'react-native'; import { UserContext } from "../../context/userContext"; -import { DateContext } from "../../context/dateContext"; import { styles } from "./styles"; import MetricasConsumo from "../../components/MetricasConsumo"; +import { useDispatch, useSelector } from "react-redux"; +import { selectDate, setNewDate } from "../../dateSlice"; type MainNavigationProp = StackNavigationProp; + type ItemData = { id: number; title: string; date: string; }; + type Props = { navigation: MainNavigationProp; }; @@ -44,11 +45,12 @@ const Main = ({ navigation }: Props) => { const [userMG, setUserMG] = useState() || null; const [userPG, setUserPG] = useState(); const userContexto = useContext(UserContext); - const dateContexto = useContext(DateContext); const user = userContexto?.user - const dates = dateContexto?.date const setUser = userContexto?.setUser; - const setDate = dateContexto?.setDate; + + // REDUX LOGIC + const dataSelecionada = useSelector(selectDate); + const dispatch = useDispatch(); type AguaComponentNavigationProp = StackNavigationProp< RootStackParamList, @@ -112,29 +114,29 @@ const Main = ({ navigation }: Props) => { }; - useEffect(() => { - navigation.addListener('focus', async () => { + useFocusEffect( + useCallback(() => { const initialData: ItemData[] = []; for (let i = -2; i <= 1; i++) { const date = moment().add(i, "days"); + let id = Math.random(); initialData.push({ - id: Math.random(), + id, title: formatDateTitle(date), date: date.format("YYYY-MM-DD"), }); + if (moment(date).format("YYYY-MM-DD") === dataSelecionada) { + setSelectedId(id); + } } setDataList(initialData); - setSelectedId(initialData[2].id); - - await loadDashboard(user?.id, initialData[2].date) + if (selectedId === null) setSelectedId(initialData[2].id); + loadDashboard(user?.id, dataSelecionada); + }, [dataSelecionada]) + ); - } - ) - - }, [navigation]) - // Gera mais 2 datas @@ -177,12 +179,9 @@ const Main = ({ navigation }: Props) => { const response = await axios.post(`${BACKEND_API_URL}/dashboard/${myUser}`, { data: date, }); - await AsyncStorage.setItem(`dashboard-${myUser}-${date}`, JSON.stringify(response.data)); - setUserMG(response.data.userMG); setUserPG(response.data.userPG); - if (setDate) - setDate(date) + } catch (error) { console.log("ERRO ao buscar dados dashboard, criando nova data..."); if (user) { @@ -196,9 +195,7 @@ const Main = ({ navigation }: Props) => { const handleDatePress = async (item: ItemData) => { setLoading(true); setSelectedId(item.id); - - if (setDate) - setDate(item.date); + dispatch(setNewDate(item.date)) if (user) { try { @@ -226,8 +223,8 @@ const Main = ({ navigation }: Props) => { const renderHeader = () => (loadingPast ? : null); const renderItem = ({ item }: { item: ItemData }) => { - const backgroundColor = item.id === selectedId ? "#91C788" : "#FF9385"; - const color = item.id === selectedId ? "#fff" : "#ffffff9e"; + const backgroundColor = item.date === dataSelecionada ? "#91C788" : "#FF9385"; + const color = item.date === dataSelecionada ? "#fff" : "#ffffff9e"; diff --git a/frontend/src/screens/ProductPG/index.tsx b/frontend/src/screens/ProductPG/index.tsx index dac474c..3644681 100644 --- a/frontend/src/screens/ProductPG/index.tsx +++ b/frontend/src/screens/ProductPG/index.tsx @@ -7,12 +7,13 @@ import Ionicons from "react-native-vector-icons/Ionicons"; import { IAlimentos } from "../../types/AlimentosPG"; import { StackNavigationProp } from "@react-navigation/stack"; import { RootStackParamList } from "../../types"; -import { DateContext } from "../../context/dateContext"; import { UserContext } from "../../context/userContext"; import styles from "./style"; +import { useSelector } from "react-redux"; +import { selectDate } from "../../dateSlice"; type ProductScreenNavigationProp = StackNavigationProp< RootStackParamList, - "Profile" + "ProductDetailsScreenPG" >; export default function ProductDetailsScreenPG() { @@ -23,9 +24,9 @@ export default function ProductDetailsScreenPG() { const [weight, setWeight] = useState(100); const navigation = useNavigation(); const userContexto = useContext(UserContext); - const dateContexto = useContext(DateContext); + const dates = useSelector(selectDate); + const user = userContexto?.user - const dates = dateContexto?.date const handleIncreaseQuantity = () => setQuantity((prev) => prev + 1); const handleDecreaseQuantity = () => @@ -90,7 +91,7 @@ export default function ProductDetailsScreenPG() { if (barcode) { fetchProductFromBackend(); } - }, [barcode]); + }, [barcode,dates]); const calculateNutrients = (nutrientPer100g: number | undefined) => { if (nutrientPer100g === undefined) return "0.00"; diff --git a/frontend/src/screens/SelectAlimento/index.tsx b/frontend/src/screens/SelectAlimento/index.tsx index c695116..d7803f3 100644 --- a/frontend/src/screens/SelectAlimento/index.tsx +++ b/frontend/src/screens/SelectAlimento/index.tsx @@ -146,6 +146,7 @@ export default function SelectAlimento() { const fetchAndCombineAlimentos = async () => { try { setLoading(true); + setIsSearching(true) const databaseProducts = await buscarAlimentoCadastrado(); const externalProducts = await searchExternalProducts(); diff --git a/frontend/src/store/store.ts b/frontend/src/store/store.ts new file mode 100644 index 0000000..f7c2724 --- /dev/null +++ b/frontend/src/store/store.ts @@ -0,0 +1,11 @@ +import { configureStore } from '@reduxjs/toolkit' +import dateSlice from '../dateSlice' + +export const store = configureStore({ + reducer: { + date: dateSlice, + } +}) + +export type RootState = ReturnType +export type AppDispatch = typeof store.dispatch diff --git a/frontend/src/types/index.ts b/frontend/src/types/index.ts index 7e04d4d..277aa11 100644 --- a/frontend/src/types/index.ts +++ b/frontend/src/types/index.ts @@ -17,4 +17,7 @@ export interface RootStackParamList extends ParamListBase { TabelaNutricional: { alimento: string }; scanner: undefined; ProductDetails: { barcode: string }; + SelectRefeicao:{ barcode: string}; + ProductDetailsScreenPG: { barcode: string ,meal:string}; + } diff --git a/frontend/types/index.ts b/frontend/types/index.ts index 49169e9..9791eff 100644 --- a/frontend/types/index.ts +++ b/frontend/types/index.ts @@ -16,5 +16,8 @@ export interface RootStackParamList extends ParamListBase { AguaComponent: undefined; AlimentacaoComponent: undefined; scanner: undefined; - ProductDetails: { barcode: string }; + ProductDetails: { barcode: string ,meal:string}; + ProductDetailsScreenPG: { barcode: string ,meal:string}; + SelectRefeicao:{ barcode: string }; + }