store park variable in user context

This commit is contained in:
whysman 2025-04-28 00:05:33 -04:00
parent c1f7bfb805
commit f711c9d610
3 changed files with 47 additions and 16 deletions

View File

@ -32,6 +32,8 @@ const Index = () => {
setUserName, setUserName,
userImage, userImage,
setUserImage, setUserImage,
park,
setPark,
userStatus, userStatus,
setUserStatus, setUserStatus,
setUserDataChanged, setUserDataChanged,
@ -96,6 +98,8 @@ const Index = () => {
<LocationScreen <LocationScreen
visible={isLocationActive} visible={isLocationActive}
currentTheme={currentTheme} currentTheme={currentTheme}
park={park}
setPark={setPark}
setChanged={setUserDataChanged} setChanged={setUserDataChanged}
onClose={() => setLocationActive(false)} onClose={() => setLocationActive(false)}
/> />

View File

@ -1,4 +1,4 @@
import React, { useState } from "react"; import React, {useEffect, useState} from "react";
import { Dialog, TextInput, useTheme, Button, Text, List, Portal } from "react-native-paper"; import { Dialog, TextInput, useTheme, Button, Text, List, Portal } from "react-native-paper";
import { View, FlatList } from "react-native"; import { View, FlatList } from "react-native";
import Slider from "@react-native-community/slider"; import Slider from "@react-native-community/slider";
@ -10,13 +10,12 @@ interface LocationScreenProps {
visible: boolean; visible: boolean;
setChanged: (dataChanged: boolean) => void; setChanged: (dataChanged: boolean) => void;
currentTheme: string; currentTheme: string;
park: string;
setPark: (data: string) => void;
onClose: () => void; onClose: () => void;
} }
export const API_URL = process.env.EXPO_PUBLIC_API_URL; interface Park {
const BUTTON_WIDTH = 260;
type Park = {
Id: string; Id: string;
name: string; name: string;
address: string; address: string;
@ -26,9 +25,12 @@ type Park = {
location: { location: {
coordinates: [number, number]; coordinates: [number, number];
}; };
}; }
const LocationScreen: React.FC<LocationScreenProps> = ({ visible, currentTheme, setChanged, onClose }) => { export const API_URL = process.env.EXPO_PUBLIC_API_URL;
const BUTTON_WIDTH = 260;
const LocationScreen: React.FC<LocationScreenProps> = ({ visible, park, setPark, setChanged, onClose }) => {
const theme = useTheme(); const theme = useTheme();
const [zip, setZip] = useState(""); const [zip, setZip] = useState("");
const [distance, setDistance] = useState(25); const [distance, setDistance] = useState(25);
@ -38,11 +40,19 @@ const LocationScreen: React.FC<LocationScreenProps> = ({ visible, currentTheme,
const [hasSearched, setHasSearched] = useState(false); const [hasSearched, setHasSearched] = useState(false);
const [selectedPark, setSelectedPark] = useState<Park | null>(null); const [selectedPark, setSelectedPark] = useState<Park | null>(null);
useEffect(() => {
if (visible) {
if (park) {
setSelectedPark(JSON.parse(park) as Park | null);
}
}
}, [visible]);
// Call the parks endpoint with coordinates // Call the parks endpoint with coordinates
const fetchNearbyParks = async (longitude: number, latitude: number) => { const fetchNearbyParks = async (longitude: number, latitude: number) => {
try { try {
const response = await axios.post(API_URL + "/parkLookup", { "Lon": longitude, "Lat": latitude, "Dist": distance }); const response = await axios.post(API_URL + "/parkLookup", { "Lon": longitude, "Lat": latitude, "Dist": distance });
log.error("Nearby Parks:", response.data); log.debug("Nearby Parks:", response.data);
setParks(response.data); setParks(response.data);
} catch (err) { } catch (err) {
log.error("Nearby Parks Error:", err); log.error("Nearby Parks Error:", err);
@ -58,7 +68,7 @@ const LocationScreen: React.FC<LocationScreenProps> = ({ visible, currentTheme,
setLoading(true); setLoading(true);
try { try {
const response = await axios.post(API_URL + "/zipLookup", { zip }); const response = await axios.post(API_URL + "/zipLookup", { zip });
log.error("Zip Lookup Response:", response.data); log.debug("Zip Lookup Response:", response.data);
const longitude = response.data[0]; const longitude = response.data[0];
const latitude = response.data[1]; const latitude = response.data[1];
await fetchNearbyParks(longitude, latitude); await fetchNearbyParks(longitude, latitude);
@ -80,7 +90,7 @@ const LocationScreen: React.FC<LocationScreenProps> = ({ visible, currentTheme,
} }
let location = await Location.getCurrentPositionAsync({}); let location = await Location.getCurrentPositionAsync({});
const { longitude, latitude } = location.coords; const { longitude, latitude } = location.coords;
log.error([longitude, latitude]); log.debug([longitude, latitude]);
await fetchNearbyParks(longitude, latitude); await fetchNearbyParks(longitude, latitude);
} catch (err) { } catch (err) {
log.error("Location Error:", err); log.error("Location Error:", err);
@ -106,6 +116,11 @@ const LocationScreen: React.FC<LocationScreenProps> = ({ visible, currentTheme,
descriptionNumberOfLines={2} descriptionNumberOfLines={2}
onPress={() => { onPress={() => {
setSelectedPark(item); setSelectedPark(item);
const parkString = JSON.stringify(item)
if ( park !== parkString ) {
setChanged(true);
}
setPark(parkString);
setParks([]); setParks([]);
setHasSearched(false); setHasSearched(false);
}} }}
@ -114,11 +129,9 @@ const LocationScreen: React.FC<LocationScreenProps> = ({ visible, currentTheme,
return ( return (
<Portal> <Portal>
<Dialog <Dialog visible={visible}
visible={visible}
onDismiss={onClose} onDismiss={onClose}
style={{ backgroundColor: theme.colors.background }} style={{ backgroundColor: theme.colors.background }} >
>
<Dialog.Title style={{ color: theme.colors.primary, textAlign: 'center' }}>Location</Dialog.Title> <Dialog.Title style={{ color: theme.colors.primary, textAlign: 'center' }}>Location</Dialog.Title>
<Dialog.Content style={{ maxHeight: 500, justifyContent: "center", alignItems: "center" }}> <Dialog.Content style={{ maxHeight: 500, justifyContent: "center", alignItems: "center" }}>
<View style={{ alignItems: "center", width: "100%" }}> <View style={{ alignItems: "center", width: "100%" }}>

View File

@ -26,6 +26,8 @@ interface UserContextType {
setUserName: (name: string) => void; setUserName: (name: string) => void;
userImage: string; userImage: string;
setUserImage: (image: string) => void; setUserImage: (image: string) => void;
park: string;
setPark: (park: string) => void;
userStatus: string; userStatus: string;
setUserStatus: (status: string) => void; setUserStatus: (status: string) => void;
setUserDataChanged: (changed: boolean) => void; setUserDataChanged: (changed: boolean) => void;
@ -52,6 +54,7 @@ export const UserProvider: React.FC<UserProviderProps> = ({ children }) => {
const [userId, setUserId] = useState(""); const [userId, setUserId] = useState("");
const [userName, setUserName] = useState(""); const [userName, setUserName] = useState("");
const [userImage, setUserImage] = useState(""); const [userImage, setUserImage] = useState("");
const [park, setPark] = useState("");
const [userStatus, setUserStatus] = useState("none"); const [userStatus, setUserStatus] = useState("none");
const [userDataChanged, setUserDataChanged] = useState(false); const [userDataChanged, setUserDataChanged] = useState(false);
const [isLoading, setIsLoading] = useState(true); const [isLoading, setIsLoading] = useState(true);
@ -65,7 +68,8 @@ export const UserProvider: React.FC<UserProviderProps> = ({ children }) => {
const storedUserName = await AsyncStorage.getItem("userName"); const storedUserName = await AsyncStorage.getItem("userName");
const storedUserImage = await AsyncStorage.getItem("userImage"); const storedUserImage = await AsyncStorage.getItem("userImage");
const storedUserTheme = await AsyncStorage.getItem("theme"); const storedUserTheme = await AsyncStorage.getItem("theme");
log.debug("Stored theme: ", storedUserTheme); const storedPark = await AsyncStorage.getItem("park");
log.debug("Stored park: ", storedPark);
if (storedUserId) { if (storedUserId) {
setUserId(storedUserId); setUserId(storedUserId);
setUserName(storedUserName || ""); setUserName(storedUserName || "");
@ -79,6 +83,13 @@ export const UserProvider: React.FC<UserProviderProps> = ({ children }) => {
setTheme("blue") setTheme("blue")
setProfileActive(true); setProfileActive(true);
} }
if(storedPark) {
setPark(storedPark);
setLocationActive(false);
} else {
setPark("");
setLocationActive(true);
}
} catch (error) { } catch (error) {
log.error("Error loading user data:", error); log.error("Error loading user data:", error);
} finally { } finally {
@ -98,7 +109,8 @@ export const UserProvider: React.FC<UserProviderProps> = ({ children }) => {
await AsyncStorage.setItem("userName", userName); await AsyncStorage.setItem("userName", userName);
await AsyncStorage.setItem("userImage", userImage); await AsyncStorage.setItem("userImage", userImage);
await AsyncStorage.setItem("theme", currentTheme); await AsyncStorage.setItem("theme", currentTheme);
log.debug("Current theme: ", currentTheme); await AsyncStorage.setItem("park", park);
log.debug("Current park: ", park);
setUserDataChanged(false); setUserDataChanged(false);
} catch (error) { } catch (error) {
log.error("Error saving user data:", error); log.error("Error saving user data:", error);
@ -160,6 +172,8 @@ export const UserProvider: React.FC<UserProviderProps> = ({ children }) => {
setUserName, setUserName,
userImage, userImage,
setUserImage, setUserImage,
park,
setPark,
userStatus, userStatus,
setUserStatus, setUserStatus,
setUserDataChanged, setUserDataChanged,