import { useEffect, useState, useRef } from "react"; import { Text, View, ScrollView, Alert } from "react-native"; import { Picker } from "@react-native-picker/picker"; import { Stack, useLocalSearchParams } from "expo-router"; import { AntDesign } from "@expo/vector-icons"; import { styled } from "nativewind"; import utmObj from "utm-latlng"; import QueryItem from "../../components/QueryItem"; declare function isNaN(x: string | number): boolean; interface itemInterface { key: String; lastUpdated: String; name: String; perFloz: Number; price: Number; store: String; volumeFloz: Number; distance: Number; } export default function () { const [items, setItems] = useState([]); const [queryType, setQueryType] = useState(""); const [loading, setLoading] = useState(false); const utm = new utmObj(); const StyledPicker = styled(Picker); const StyledText = styled(Text); const StyledIcon = styled(AntDesign); const slug = useLocalSearchParams().slug.toString().split("%2B"); const lon = slug[0]; const lat = slug[1]; const utmCoords = utm.convertLatLngToUtm(lat, lon, 5); const query = useRef(slug[2]); // get store information const getItems = async (sortBy: string) => { setLoading(true); const res = await fetch( `${process.env.EXPO_PUBLIC_BACKEND_URL}/search?` + new URLSearchParams({ easting: utmCoords.Easting, northing: utmCoords.Northing, query: query.current, }) ); if (!res.ok) { if (res.status === 404) { const notFound = ( No results for "{slug[2]}" ); setItems(notFound); return setLoading(false); } else return Alert.alert( "Error!", "Server error. Please report to ak95@riseup.net" ); } const json = await res.json(); switch (sortBy) { case "Distance": json.sort((a: itemInterface, b: itemInterface) => { return Number(a.distance) - Number(b.distance); }); break; case "Price": json.sort((a: itemInterface, b: itemInterface) => { return Number(a.price) - Number(b.price); }); break; case "Price per Fluid Ounce": json.sort((a: itemInterface, b: itemInterface) => { return Number(a.perFloz) - Number(b.perFloz); }); break; case "Last Updated": json.sort((a: itemInterface, b: itemInterface) => { const aDate = new Date(a.lastUpdated.replace(" ", "T") + "Z"); const bDate = new Date(b.lastUpdated.replace(" ", "T") + "Z"); if (aDate < bDate) return -1; else if (aDate > bDate) return 1; return 0; }); break; } const jsonItems = json.map((item: itemInterface, index: number) => { const date = new Date(item.lastUpdated.replace(" ", "T") + "Z"); return ( ); }); setItems(jsonItems); setLoading(false); }; useEffect(() => { getItems(queryType); }, [queryType]); return ( Sort by {queryType} { setQueryType(value); }} className="opacity-0 bg-red-700" > {items} ); }