Added: folder with routes to review and add review page, added package RangeSlider; in _layout.js added add review as invisible
This commit is contained in:
		@@ -1 +1 @@
 | 
			
		||||
{"version":"2.0.0","endpoints":{"user":{"signup":{"name":"user","operation":"signup","route":"/api/v1/auth/signup","method":"POST","description":"user signup api","body":{"username":"testuser","email":"text@example.com","password":"Test1234"},"response":"status object"},"signin":{"name":"user","operation":"signin","route":"/api/v1/auth/signin","method":"POST","description":"user signin api","body":{"email":"text@example.com","password":"Test1234"},"response":"status object"},"logout":{"name":"user","operation":"logout","route":"/api/v1/auth/logout","method":"POST","description":"user logout api","body":{},"response":"status object"},"status":{"name":"user","operation":"status","route":"/api/v1/auth/status","method":"GET","description":"user login status api","response":"status code | user object"}},"beer":{"add":{"name":"beer","operation":"add","route":"/api/v1/beer/add","method":"POST","description":"beer add api","body":{"brand":"Pilsner Urqell","name":"Kozel","degree":11,"packaging":"can","photos":"optional field | max 4 images | formData"},"response":"status object | beer object"},"get":{"name":"beer","operation":"get","route":"/api/v1/beer/get","method":"GET","description":"beer get api","response":"status object | array of beer objects"},"del":{"name":"beer","operation":"del","route":"/api/v1/beer/del","method":"POST","description":"beer del api","body":{"_id":"6352b303b71cb62222f39895"},"response":"status object"},"edit":{"name":"beer","operation":"edit","route":"/api/v1/beer/edit","method":"POST","description":"beer edit api","body":{"_id":"6355b95dc03fad77bc380146","brand":"Pilsner Urqell","name":"Radegast","degree":12,"packaging":"bottle","imgs":[],"photos":"optional field | max 4 images | formData"},"response":"status object |  beer data"}},"docs":{"get_all":{"name":"docs","operation":"get_all","route":"/api/v1","method":"GET","description":"Get docs json","response":"docs json"}}}}
 | 
			
		||||
{"version":"2.0.0","endpoints":{"user":{"signup":{"name":"user","operation":"signup","route":"/api/v1/auth/signup","method":"POST","description":"user signup api","body":{"username":"testuser","email":"text@example.com","password":"Test1234"},"response":"status object"},"signin":{"name":"user","operation":"signin","route":"/api/v1/auth/signin","method":"POST","description":"user signin api","body":{"email":"text@example.com","password":"Test1234"},"response":"status object"},"logout":{"name":"user","operation":"logout","route":"/api/v1/auth/logout","method":"POST","description":"user logout api","body":{},"response":"status object"},"status":{"name":"user","operation":"status","route":"/api/v1/auth/status","method":"GET","description":"user login status api","response":"status code | user object"}},"beer":{"add":{"name":"beer","operation":"add","route":"/api/v1/beer/add","method":"POST","description":"beer add api","body":{"brand":"Pilsner Urqell","name":"Kozel","degree":11,"packaging":"can","photos":"optional field | max 4 images | formData"},"response":"status object | beer object"},"get":{"name":"beer","operation":"get","route":"/api/v1/beer/get","method":"GET","description":"beer get api","response":"status object | array of beer objects"},"del":{"name":"beer","operation":"del","route":"/api/v1/beer/del","method":"POST","description":"beer del api","body":{"_id":"6352b303b71cb62222f39895"},"response":"status object"},"edit":{"name":"beer","operation":"edit","route":"/api/v1/beer/edit","method":"POST","description":"beer edit api","body":{"_id":"6355b95dc03fad77bc380146","brand":"Pilsner Urqell","name":"Radegast","degree":12,"packaging":"bottle","imgs":[],"photos":"optional field | max 4 images | formData"},"response":"status object |  beer data"}},"docs":{"get_all":{"name":"docs","operation":"get_all","route":"/api/v1","method":"GET","description":"Get docs json","response":"docs json"}},"review":{"add":{"name":"review","operation":"add","route":"/api/v1/review/add","method":"POST","description":"review add api","body":{"beer_id":"6352b303b71cb62222f39895","foam":3,"bitter_sweetness":2,"taste":5,"packaging":3,"sourness":false,"would_again":true},"response":"status object | review object"},"get":{"name":"review","operation":"get","route":"/api/v1/review/get","method":"GET","description":"review get api","response":"status object | array of review objects"},"del":{"name":"review","operation":"del","route":"/api/v1/review/del","method":"POST","description":"review del api","body":{"_id":"6352b303b71cb62222f39895"},"response":"status object"}}}}
 | 
			
		||||
@@ -43,7 +43,7 @@ export default function TabLayout() {
 | 
			
		||||
					}}
 | 
			
		||||
				/>
 | 
			
		||||
				<Tabs.Screen
 | 
			
		||||
					name="review"
 | 
			
		||||
					name="review/index"
 | 
			
		||||
					options={{
 | 
			
		||||
						title: "Reviews",
 | 
			
		||||
						tabBarIcon: ({ color }) => (
 | 
			
		||||
@@ -66,6 +66,10 @@ export default function TabLayout() {
 | 
			
		||||
					name="beer/add"
 | 
			
		||||
					options={{ href: null, title: "Add beer" }}
 | 
			
		||||
				/>
 | 
			
		||||
				<Tabs.Screen
 | 
			
		||||
					name="review/add"
 | 
			
		||||
					options={{ href: null, title: "Add review" }}
 | 
			
		||||
				/>
 | 
			
		||||
			</Tabs>
 | 
			
		||||
		</View>
 | 
			
		||||
	);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +0,0 @@
 | 
			
		||||
import { View } from "react-native";
 | 
			
		||||
import Text from "@components/Text";
 | 
			
		||||
 | 
			
		||||
export default function Tab() {
 | 
			
		||||
	return (
 | 
			
		||||
		<View style={{ justifyContent: "center", alignItems: "center", flex: 1 }}>
 | 
			
		||||
			<Text>Tab REVIEW</Text>
 | 
			
		||||
		</View>
 | 
			
		||||
	);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								frontend/app/(app)/(tabs)/review/.index.js.swp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								frontend/app/(app)/(tabs)/review/.index.js.swp
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										233
									
								
								frontend/app/(app)/(tabs)/review/add.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										233
									
								
								frontend/app/(app)/(tabs)/review/add.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,233 @@
 | 
			
		||||
import { StyleSheet, TextInput, View, Image } from "react-native";
 | 
			
		||||
import { useState } from "react";
 | 
			
		||||
import Button from "@components/Button";
 | 
			
		||||
import Text from "@components/Text";
 | 
			
		||||
import { colors } from "@components/style";
 | 
			
		||||
import * as ImagePicker from "expo-image-picker";
 | 
			
		||||
import DropDownPicker from "react-native-dropdown-picker";
 | 
			
		||||
const DropdownTheme = require("@components/DropdownTheme");
 | 
			
		||||
import { Platform } from "react-native";
 | 
			
		||||
import RangeSlider, { Slider } from "react-native-range-slider-expo";
 | 
			
		||||
 | 
			
		||||
export default function reviewAdd() {
 | 
			
		||||
	const [b_name, setBName] = useState("");
 | 
			
		||||
	const [b_degree, setBDegree] = useState("");
 | 
			
		||||
	const [b_packaging, setBPackaging] = useState(null);
 | 
			
		||||
	const [b_brand, setBBrand] = useState("");
 | 
			
		||||
	const [image, setImage] = useState(null);
 | 
			
		||||
 | 
			
		||||
	const [open, setOpen] = useState(false);
 | 
			
		||||
	const [items, setItems] = useState([
 | 
			
		||||
		{ label: "Tank beer", value: "tank" },
 | 
			
		||||
		{ label: "Cask beer", value: "cask" },
 | 
			
		||||
		{ label: "Glass bottle", value: "glass" },
 | 
			
		||||
		{ label: "Can", value: "can" },
 | 
			
		||||
		{ label: "PET bottle", value: "pet" },
 | 
			
		||||
	]);
 | 
			
		||||
 | 
			
		||||
	DropDownPicker.addTheme("DropdownTheme", DropdownTheme);
 | 
			
		||||
	DropDownPicker.setTheme("DropdownTheme");
 | 
			
		||||
 | 
			
		||||
	ImagePicker.getCameraPermissionsAsync(); //check if the user has granted permission to access the camera
 | 
			
		||||
	const pickImage = async () => {
 | 
			
		||||
		const permissionResult =
 | 
			
		||||
			await ImagePicker.requestMediaLibraryPermissionsAsync();
 | 
			
		||||
 | 
			
		||||
		if (permissionResult.granted === false) {
 | 
			
		||||
			alert("You've refused to allow this appp to access your photos!");
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// No permissions request is necessary for launching the image library
 | 
			
		||||
		const result = await ImagePicker.launchImageLibraryAsync({
 | 
			
		||||
			mediaTypes: ImagePicker.MediaTypeOptions.Images,
 | 
			
		||||
			allowsEditing: true,
 | 
			
		||||
			aspect: [3, 4],
 | 
			
		||||
			// quality: 1,
 | 
			
		||||
		});
 | 
			
		||||
 | 
			
		||||
		// Explore the result
 | 
			
		||||
		console.log(result);
 | 
			
		||||
 | 
			
		||||
		if (!result.canceled) {
 | 
			
		||||
			setImage(result.assets[0].uri);
 | 
			
		||||
		}
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	const openCamera = async () => {
 | 
			
		||||
		// Ask the user for the permission to access the camera
 | 
			
		||||
		const permissionResult = await ImagePicker.requestCameraPermissionsAsync();
 | 
			
		||||
 | 
			
		||||
		if (permissionResult.granted === false) {
 | 
			
		||||
			alert("You've refused to allow this app to access your camera!");
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		const result = await ImagePicker.launchCameraAsync();
 | 
			
		||||
 | 
			
		||||
		// Explore the result
 | 
			
		||||
		console.log(result);
 | 
			
		||||
 | 
			
		||||
		if (!result.canceled) {
 | 
			
		||||
			setImage(result.assets[0].uri);
 | 
			
		||||
		}
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	function validateDegreeInput(text) {
 | 
			
		||||
		let newText = "";
 | 
			
		||||
		let numbers = "0123456789.";
 | 
			
		||||
 | 
			
		||||
		for (var i = 0; i < text.length; i++) {
 | 
			
		||||
			if (numbers.indexOf(text[i]) > -1) {
 | 
			
		||||
				newText = newText + text[i];
 | 
			
		||||
				setBDegree(newText);
 | 
			
		||||
			} else {
 | 
			
		||||
				// your call back function
 | 
			
		||||
				alert("Please enter numbers only.");
 | 
			
		||||
				setBDegree("");
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	async function addBeer() {
 | 
			
		||||
		// TODO: after the request - redirect to /beer/{new_beer_id}?; plus some modal about successful state
 | 
			
		||||
		const req = await fetch(`${process.env.EXPO_PUBLIC_API_URL}/beer/add`, {
 | 
			
		||||
			method: "POST",
 | 
			
		||||
			credentials: "include",
 | 
			
		||||
			headers: { "Content-Type": "application/json" },
 | 
			
		||||
			body: JSON.stringify({
 | 
			
		||||
				brand: b_brand,
 | 
			
		||||
				name: b_name,
 | 
			
		||||
				degree: b_degree,
 | 
			
		||||
				packaging: b_packaging,
 | 
			
		||||
				photos: null,
 | 
			
		||||
			}),
 | 
			
		||||
		});
 | 
			
		||||
		const res = await req.json();
 | 
			
		||||
 | 
			
		||||
		if (res.code == 201 && res.data._id) {
 | 
			
		||||
			window.location.href = `/beer/${res.data._id}`;
 | 
			
		||||
		} else {
 | 
			
		||||
			alert(
 | 
			
		||||
				"Beer was not added successfully. Please check your data and try again.",
 | 
			
		||||
			);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return (
 | 
			
		||||
		<View style={styles.container}>
 | 
			
		||||
			<View style={styles.form}>
 | 
			
		||||
				<Text style={styles.text}>
 | 
			
		||||
					Spill your thoughts about the beer you just sipped!
 | 
			
		||||
				</Text>
 | 
			
		||||
				<TextInput
 | 
			
		||||
					style={styles.input}
 | 
			
		||||
					placeholder="Name"
 | 
			
		||||
					value={b_name}
 | 
			
		||||
					onChangeText={(text) => setBName(text)}
 | 
			
		||||
					placeholderTextColor="#aaaaaa"
 | 
			
		||||
				/>
 | 
			
		||||
				<TextInput
 | 
			
		||||
					style={styles.input}
 | 
			
		||||
					placeholder="Brand"
 | 
			
		||||
					value={b_brand}
 | 
			
		||||
					onChangeText={(text) => setBBrand(text)}
 | 
			
		||||
					placeholderTextColor="#aaaaaa"
 | 
			
		||||
				/>
 | 
			
		||||
				<TextInput
 | 
			
		||||
					style={styles.input}
 | 
			
		||||
					placeholder="Degree"
 | 
			
		||||
					value={b_degree}
 | 
			
		||||
					onChangeText={(text) => validateDegreeInput(text)}
 | 
			
		||||
					placeholderTextColor="#aaaaaa"
 | 
			
		||||
					keyboardType="numeric"
 | 
			
		||||
					maxLength={3}
 | 
			
		||||
				/>
 | 
			
		||||
 | 
			
		||||
				<DropDownPicker
 | 
			
		||||
					open={open}
 | 
			
		||||
					value={b_packaging}
 | 
			
		||||
					items={items}
 | 
			
		||||
					setOpen={setOpen}
 | 
			
		||||
					setValue={setBPackaging}
 | 
			
		||||
					setItems={setItems}
 | 
			
		||||
					placeholder={"What are you drinking from?"}
 | 
			
		||||
					theme="DropdownTheme"
 | 
			
		||||
					//searchable={true} //maybe we can use it later...
 | 
			
		||||
				/>
 | 
			
		||||
				{/* 				<View style={styles.imageContainer}>
 | 
			
		||||
					<Button
 | 
			
		||||
						title="Open gallery"
 | 
			
		||||
						onPress={pickImage}
 | 
			
		||||
						buttonStyle={styles.imageButton}
 | 
			
		||||
						textStyle={styles.imageTextButton}
 | 
			
		||||
					/>
 | 
			
		||||
 | 
			
		||||
					{Platform.OS != "web" ? (
 | 
			
		||||
						<Button
 | 
			
		||||
							onPress={openCamera}
 | 
			
		||||
							title={"Open camera"}
 | 
			
		||||
							buttonStyle={styles.imageButton}
 | 
			
		||||
							textStyle={styles.imageTextButton}
 | 
			
		||||
						/>
 | 
			
		||||
					) : (
 | 
			
		||||
						false
 | 
			
		||||
					)}
 | 
			
		||||
 | 
			
		||||
					{image && <Image source={{ uri: image }} style={styles.image} />}
 | 
			
		||||
				</View> */}
 | 
			
		||||
				<Button title="Add beer" color={colors.gold} onPress={addBeer} />
 | 
			
		||||
			</View>
 | 
			
		||||
		</View>
 | 
			
		||||
	);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const styles = StyleSheet.create({
 | 
			
		||||
	container: {
 | 
			
		||||
		width: "100%",
 | 
			
		||||
		height: "100%",
 | 
			
		||||
		alignItems: "center",
 | 
			
		||||
		display: "flex",
 | 
			
		||||
	},
 | 
			
		||||
	form: {
 | 
			
		||||
		alignItems: "center",
 | 
			
		||||
		gap: 15,
 | 
			
		||||
		width: "80%",
 | 
			
		||||
	},
 | 
			
		||||
	input: {
 | 
			
		||||
		height: "auto",
 | 
			
		||||
		width: "100%",
 | 
			
		||||
		borderColor: "gray",
 | 
			
		||||
		borderWidth: 1,
 | 
			
		||||
		borderRadius: 10,
 | 
			
		||||
		padding: 13,
 | 
			
		||||
		color: "#fff",
 | 
			
		||||
	},
 | 
			
		||||
	imageContainer: {
 | 
			
		||||
		alignItems: "center",
 | 
			
		||||
		justifyContent: "center",
 | 
			
		||||
		display: "flex",
 | 
			
		||||
		flexDirection: "row",
 | 
			
		||||
		gap: 10,
 | 
			
		||||
	},
 | 
			
		||||
	imageButton: {
 | 
			
		||||
		backgroundColor: colors.dark,
 | 
			
		||||
		borderColor: "gray",
 | 
			
		||||
		borderWidth: 1,
 | 
			
		||||
		borderRadius: 10,
 | 
			
		||||
	},
 | 
			
		||||
	imageTextButton: {
 | 
			
		||||
		color: colors.white,
 | 
			
		||||
	},
 | 
			
		||||
	image: {
 | 
			
		||||
		width: 150,
 | 
			
		||||
		height: 150,
 | 
			
		||||
	},
 | 
			
		||||
	text: {
 | 
			
		||||
		color: colors.white,
 | 
			
		||||
		fontSize: 24,
 | 
			
		||||
		textAlign: "center",
 | 
			
		||||
		paddingBottom: "3%",
 | 
			
		||||
		paddingTop: "10%",
 | 
			
		||||
	},
 | 
			
		||||
});
 | 
			
		||||
							
								
								
									
										74
									
								
								frontend/app/(app)/(tabs)/review/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								frontend/app/(app)/(tabs)/review/index.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,74 @@
 | 
			
		||||
import { View, StyleSheet, FlatList } from "react-native";
 | 
			
		||||
import Text from "@components/Text";
 | 
			
		||||
import Button from "@components/Button";
 | 
			
		||||
import { colors } from "@components/style";
 | 
			
		||||
import { router } from "expo-router";
 | 
			
		||||
import { useEffect, useState } from "react";
 | 
			
		||||
 | 
			
		||||
export default function Tab() {
 | 
			
		||||
	const [data, setData] = useState([]);
 | 
			
		||||
	useEffect(() => {
 | 
			
		||||
		fetchData();
 | 
			
		||||
	}, []);
 | 
			
		||||
 | 
			
		||||
	async function fetchData() {
 | 
			
		||||
		try {
 | 
			
		||||
			const res = await fetch(`${process.env.EXPO_PUBLIC_API_URL}/review/get`, {
 | 
			
		||||
				method: "GET",
 | 
			
		||||
				credentials: "include",
 | 
			
		||||
			});
 | 
			
		||||
			const data = await res.json();
 | 
			
		||||
			setData(data.data);
 | 
			
		||||
		} catch (err) {
 | 
			
		||||
			console.error(err);
 | 
			
		||||
			alert("Something went wrong");
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return (
 | 
			
		||||
		<View style={styles.container}>
 | 
			
		||||
			<Button
 | 
			
		||||
				title="Add Review"
 | 
			
		||||
				color={colors.gold}
 | 
			
		||||
				onPress={() => {
 | 
			
		||||
					router.replace("/review/add");
 | 
			
		||||
				}}
 | 
			
		||||
			/>
 | 
			
		||||
 | 
			
		||||
			<FlatList
 | 
			
		||||
				data={data}
 | 
			
		||||
				style={styles.reviewList}
 | 
			
		||||
				keyExtractor={(item) => String(item._id)}
 | 
			
		||||
				renderItem={({ item }) => (
 | 
			
		||||
					<View style={styles.item}>
 | 
			
		||||
						<Text>Name: {item.name}</Text>
 | 
			
		||||
						<Text>Brand: {item.brand}</Text>
 | 
			
		||||
						<Text>Degree: {item.degree}</Text>
 | 
			
		||||
						<Text>Packaging: {item.packaging}</Text>
 | 
			
		||||
					</View>
 | 
			
		||||
				)}
 | 
			
		||||
			/>
 | 
			
		||||
		</View>
 | 
			
		||||
	);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export const styles = StyleSheet.create({
 | 
			
		||||
	container: {
 | 
			
		||||
		flex: 1,
 | 
			
		||||
		justifyContent: "center",
 | 
			
		||||
		alignItems: "center",
 | 
			
		||||
		marginTop: "5%",
 | 
			
		||||
	},
 | 
			
		||||
	reviewList: {
 | 
			
		||||
		width: "100%",
 | 
			
		||||
		paddingHorizontal: "15%",
 | 
			
		||||
		marginTop: "5%",
 | 
			
		||||
	},
 | 
			
		||||
	item: {
 | 
			
		||||
		borderColor: "gray",
 | 
			
		||||
		borderWidth: 1,
 | 
			
		||||
		borderRadius: 10,
 | 
			
		||||
		padding: 13,
 | 
			
		||||
		marginBottom: "5%",
 | 
			
		||||
	},
 | 
			
		||||
});
 | 
			
		||||
							
								
								
									
										205
									
								
								frontend/package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										205
									
								
								frontend/package-lock.json
									
									
									
										generated
									
									
									
								
							@@ -26,6 +26,7 @@
 | 
			
		||||
        "react-dom": "18.2.0",
 | 
			
		||||
        "react-native": "0.74.1",
 | 
			
		||||
        "react-native-dropdown-picker": "^5.4.6",
 | 
			
		||||
        "react-native-range-slider-expo": "^1.4.3",
 | 
			
		||||
        "react-native-safe-area-context": "4.10.1",
 | 
			
		||||
        "react-native-screens": "3.31.1",
 | 
			
		||||
        "react-native-web": "~0.19.6"
 | 
			
		||||
@@ -2257,6 +2258,18 @@
 | 
			
		||||
        "node": ">=14.21.3"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@egjs/hammerjs": {
 | 
			
		||||
      "version": "2.0.17",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@egjs/hammerjs/-/hammerjs-2.0.17.tgz",
 | 
			
		||||
      "integrity": "sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A==",
 | 
			
		||||
      "peer": true,
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "@types/hammerjs": "^2.0.36"
 | 
			
		||||
      },
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=0.8.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@expo/bunyan": {
 | 
			
		||||
      "version": "4.0.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@expo/bunyan/-/bunyan-4.0.0.tgz",
 | 
			
		||||
@@ -6367,6 +6380,12 @@
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz",
 | 
			
		||||
      "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA=="
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@types/hammerjs": {
 | 
			
		||||
      "version": "2.0.45",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.45.tgz",
 | 
			
		||||
      "integrity": "sha512-qkcUlZmX6c4J8q45taBKTL3p+LbITgyx7qhlPYOdOHZB7B31K0mXbP5YA7i7SgDeEGuI9MnumiKPEMrxg8j3KQ==",
 | 
			
		||||
      "peer": true
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@types/istanbul-lib-coverage": {
 | 
			
		||||
      "version": "2.0.6",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz",
 | 
			
		||||
@@ -7008,6 +7027,12 @@
 | 
			
		||||
        "node": ">= 6"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/boolbase": {
 | 
			
		||||
      "version": "1.0.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
 | 
			
		||||
      "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
 | 
			
		||||
      "peer": true
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/bplist-creator": {
 | 
			
		||||
      "version": "0.1.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz",
 | 
			
		||||
@@ -7711,6 +7736,56 @@
 | 
			
		||||
        "hyphenate-style-name": "^1.0.3"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/css-select": {
 | 
			
		||||
      "version": "5.1.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz",
 | 
			
		||||
      "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==",
 | 
			
		||||
      "peer": true,
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "boolbase": "^1.0.0",
 | 
			
		||||
        "css-what": "^6.1.0",
 | 
			
		||||
        "domhandler": "^5.0.2",
 | 
			
		||||
        "domutils": "^3.0.1",
 | 
			
		||||
        "nth-check": "^2.0.1"
 | 
			
		||||
      },
 | 
			
		||||
      "funding": {
 | 
			
		||||
        "url": "https://github.com/sponsors/fb55"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/css-tree": {
 | 
			
		||||
      "version": "1.1.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
 | 
			
		||||
      "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
 | 
			
		||||
      "peer": true,
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "mdn-data": "2.0.14",
 | 
			
		||||
        "source-map": "^0.6.1"
 | 
			
		||||
      },
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=8.0.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/css-tree/node_modules/source-map": {
 | 
			
		||||
      "version": "0.6.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
 | 
			
		||||
      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
 | 
			
		||||
      "peer": true,
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=0.10.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/css-what": {
 | 
			
		||||
      "version": "6.1.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
 | 
			
		||||
      "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
 | 
			
		||||
      "peer": true,
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">= 6"
 | 
			
		||||
      },
 | 
			
		||||
      "funding": {
 | 
			
		||||
        "url": "https://github.com/sponsors/fb55"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/csstype": {
 | 
			
		||||
      "version": "3.1.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
 | 
			
		||||
@@ -7988,6 +8063,61 @@
 | 
			
		||||
        "node": ">=8"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/dom-serializer": {
 | 
			
		||||
      "version": "2.0.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
 | 
			
		||||
      "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
 | 
			
		||||
      "peer": true,
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "domelementtype": "^2.3.0",
 | 
			
		||||
        "domhandler": "^5.0.2",
 | 
			
		||||
        "entities": "^4.2.0"
 | 
			
		||||
      },
 | 
			
		||||
      "funding": {
 | 
			
		||||
        "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/domelementtype": {
 | 
			
		||||
      "version": "2.3.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
 | 
			
		||||
      "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
 | 
			
		||||
      "funding": [
 | 
			
		||||
        {
 | 
			
		||||
          "type": "github",
 | 
			
		||||
          "url": "https://github.com/sponsors/fb55"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
      "peer": true
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/domhandler": {
 | 
			
		||||
      "version": "5.0.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
 | 
			
		||||
      "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
 | 
			
		||||
      "peer": true,
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "domelementtype": "^2.3.0"
 | 
			
		||||
      },
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">= 4"
 | 
			
		||||
      },
 | 
			
		||||
      "funding": {
 | 
			
		||||
        "url": "https://github.com/fb55/domhandler?sponsor=1"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/domutils": {
 | 
			
		||||
      "version": "3.1.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz",
 | 
			
		||||
      "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==",
 | 
			
		||||
      "peer": true,
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "dom-serializer": "^2.0.0",
 | 
			
		||||
        "domelementtype": "^2.3.0",
 | 
			
		||||
        "domhandler": "^5.0.3"
 | 
			
		||||
      },
 | 
			
		||||
      "funding": {
 | 
			
		||||
        "url": "https://github.com/fb55/domutils?sponsor=1"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/dotenv": {
 | 
			
		||||
      "version": "16.4.5",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz",
 | 
			
		||||
@@ -8044,6 +8174,18 @@
 | 
			
		||||
        "once": "^1.4.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/entities": {
 | 
			
		||||
      "version": "4.5.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
 | 
			
		||||
      "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
 | 
			
		||||
      "peer": true,
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=0.12"
 | 
			
		||||
      },
 | 
			
		||||
      "funding": {
 | 
			
		||||
        "url": "https://github.com/fb55/entities?sponsor=1"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/env-editor": {
 | 
			
		||||
      "version": "0.4.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/env-editor/-/env-editor-0.4.2.tgz",
 | 
			
		||||
@@ -9223,6 +9365,15 @@
 | 
			
		||||
        "node": ">=8"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/hoist-non-react-statics": {
 | 
			
		||||
      "version": "3.3.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
 | 
			
		||||
      "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
 | 
			
		||||
      "peer": true,
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "react-is": "^16.7.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/hosted-git-info": {
 | 
			
		||||
      "version": "3.0.8",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz",
 | 
			
		||||
@@ -11001,6 +11152,12 @@
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/md5hex/-/md5hex-1.0.0.tgz",
 | 
			
		||||
      "integrity": "sha512-c2YOUbp33+6thdCUi34xIyOU/a7bvGKj/3DB1iaPMTuPHf/Q2d5s4sn1FaCOO43XkXggnb08y5W2PU8UNYNLKQ=="
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/mdn-data": {
 | 
			
		||||
      "version": "2.0.14",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
 | 
			
		||||
      "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
 | 
			
		||||
      "peer": true
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/memoize-one": {
 | 
			
		||||
      "version": "5.2.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz",
 | 
			
		||||
@@ -11866,6 +12023,18 @@
 | 
			
		||||
        "node": ">=4"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/nth-check": {
 | 
			
		||||
      "version": "2.1.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
 | 
			
		||||
      "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
 | 
			
		||||
      "peer": true,
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "boolbase": "^1.0.0"
 | 
			
		||||
      },
 | 
			
		||||
      "funding": {
 | 
			
		||||
        "url": "https://github.com/fb55/nth-check?sponsor=1"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/nullthrows": {
 | 
			
		||||
      "version": "1.1.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz",
 | 
			
		||||
@@ -12906,6 +13075,19 @@
 | 
			
		||||
        "react-native": "*"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/react-native-gesture-handler": {
 | 
			
		||||
      "version": "1.10.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/react-native-gesture-handler/-/react-native-gesture-handler-1.10.3.tgz",
 | 
			
		||||
      "integrity": "sha512-cBGMi1IEsIVMgoox4RvMx7V2r6bNKw0uR1Mu1o7NbuHS6BRSVLq0dP34l2ecnPlC+jpWd3le6Yg1nrdCjby2Mw==",
 | 
			
		||||
      "peer": true,
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "@egjs/hammerjs": "^2.0.17",
 | 
			
		||||
        "fbjs": "^3.0.0",
 | 
			
		||||
        "hoist-non-react-statics": "^3.3.0",
 | 
			
		||||
        "invariant": "^2.2.4",
 | 
			
		||||
        "prop-types": "^15.7.2"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/react-native-helmet-async": {
 | 
			
		||||
      "version": "2.0.4",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/react-native-helmet-async/-/react-native-helmet-async-2.0.4.tgz",
 | 
			
		||||
@@ -12919,6 +13101,15 @@
 | 
			
		||||
        "react": "^16.6.0 || ^17.0.0 || ^18.0.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/react-native-range-slider-expo": {
 | 
			
		||||
      "version": "1.4.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/react-native-range-slider-expo/-/react-native-range-slider-expo-1.4.3.tgz",
 | 
			
		||||
      "integrity": "sha512-EAIXfuCxJYffi6yqOcmCMWzvPNRSJ7zgDhQtVXXe2fokYaXVLG1uq2jM+cpTStMusIIGIo9HGZAja94N+rnNyg==",
 | 
			
		||||
      "peerDependencies": {
 | 
			
		||||
        "react-native-gesture-handler": "^1.6.1",
 | 
			
		||||
        "react-native-svg": "^12.1.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/react-native-safe-area-context": {
 | 
			
		||||
      "version": "4.10.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-4.10.1.tgz",
 | 
			
		||||
@@ -12941,6 +13132,20 @@
 | 
			
		||||
        "react-native": "*"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/react-native-svg": {
 | 
			
		||||
      "version": "12.5.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/react-native-svg/-/react-native-svg-12.5.1.tgz",
 | 
			
		||||
      "integrity": "sha512-c374ENsq2MWCfr+7jC7TGwSeOAuC1Dp0osh2pw8PjpYFxmmB/toFIwcnCLz+SgBd6iLJClRhbATealqM05HOGg==",
 | 
			
		||||
      "peer": true,
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "css-select": "^5.1.0",
 | 
			
		||||
        "css-tree": "^1.1.3"
 | 
			
		||||
      },
 | 
			
		||||
      "peerDependencies": {
 | 
			
		||||
        "react": "*",
 | 
			
		||||
        "react-native": ">=0.50.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/react-native-web": {
 | 
			
		||||
      "version": "0.19.11",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/react-native-web/-/react-native-web-0.19.11.tgz",
 | 
			
		||||
 
 | 
			
		||||
@@ -26,6 +26,7 @@
 | 
			
		||||
    "react-dom": "18.2.0",
 | 
			
		||||
    "react-native": "0.74.1",
 | 
			
		||||
    "react-native-dropdown-picker": "^5.4.6",
 | 
			
		||||
    "react-native-range-slider-expo": "^1.4.3",
 | 
			
		||||
    "react-native-safe-area-context": "4.10.1",
 | 
			
		||||
    "react-native-screens": "3.31.1",
 | 
			
		||||
    "react-native-web": "~0.19.6",
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user