import {useState} from "react"; import { StyleSheet, Platform, KeyboardAvoidingView, ScrollView, Image, View, Alert, } from "react-native"; import {TextInput, Button, Snackbar, Text, useTheme} from "react-native-paper"; import {requestCameraPermissionsAsync, launchCameraAsync} from 'expo-image-picker'; import * as Location from 'expo-location'; import useLocationStore from "@/locationStore"; export default function FormScreen() { const [formData, setFormData] = useState({ name: "", description: "", image: "", area: 0, population: 0, latitude: 0, longitude: 0, }); const [message, setMessage] = useState(""); const [visible, setVisible] = useState(false); const [picture, setPicture] = useState(null); const [imageMethod, setImageMethod] = useState(null); const [location, setLocation] = useState < Location.LocationObject | null > (null); const theme = useTheme(); const addLocation = useLocationStore((state) => state.addLocation); const handleAddLocation = async () => { if ( formData.name && formData.description && formData.image && formData.area && formData.population && formData.latitude && formData.longitude ) { const newLocation = { id: Date.now(), name: formData.name, description: formData.description, image: formData.image, area: parseFloat(formData.area), population: parseInt(formData.population), latitude: parseFloat(formData.latitude), longitude: parseFloat(formData.longitude), }; const added = await addLocation(newLocation); setFormData({ name: "", description: "", image: "", area: 0, population: 0, latitude: 0, longitude: 0 }); setPicture(null); setImageMethod(null); if (added != null) { setMessage("Lokalizacja została dodana!"); setVisible(true); } else { setMessage("Wystąpił błąd podczas dodawania lokalizacji!"); setVisible(true); } } else { setMessage("Wypełnij wszystkie pola!"); console.log(formData); setVisible(true); } }; const takePicture = async () => { const {status} = await requestCameraPermissionsAsync(); if (status !== 'granted') { setMessage("Brak uprawnień do kamery!"); setVisible(true); return; } const result = await launchCameraAsync({ allowsEditing: false, base64: true, }); if (!result.canceled && result.assets && result.assets.length > 0) { const image = result.assets[0]; setPicture(image.uri); setFormData({...formData, image: image.base64}); } } async function getCurrentLocation() { let {status} = await Location.requestForegroundPermissionsAsync(); if (status !== 'granted') { console.log('Permission to access location was denied'); Alert.alert("Błąd", "Nie udało się uzyskać dostępu do pobierania lokalizacji"); return; } try { let location = await Location.getCurrentPositionAsync({}); setLocation(location); setFormData({ ...formData, latitude: location.coords.latitude, longitude: location.coords.longitude }); Alert.alert("Sukces!", "Pobrano lokalizację\n" + "Szerokość geograficzna: " + location.coords.latitude + "\n" + "Długość geograficzna: " + location.coords.longitude); } catch (error) { Alert.alert("Błąd", "Nie udało się pobrać lokalizacji"); console.error(error); } } const selectImageMethod = (method) => { setImageMethod(method); if (method === 'camera') { takePicture() } else { setFormData({...formData, image: ""}); setPicture(null); } } return ( setVisible(false)} duration={3000} > {message} Jak chcesz dodać zdjęcie? {imageMethod === 'link' && ( setFormData({...formData, image: e})} /> )} {picture && ( )} setFormData({...formData, name: e})} /> setFormData({...formData, description: e})} /> setFormData({...formData, area: e})} /> setFormData({...formData, population: e})} /> ); } const styles = StyleSheet.create({ container: { // backgroundColor: "#25292e", alignItems: "center", padding: 10, flexGrow: 1, }, imageContainer: { width: "100%", alignItems: "flex-start", marginVertical: 10, }, image: { width: 150, height: 150, borderStyle: "solid", borderWidth: 1, borderRadius: 5, }, imageMethodButtons: { flexDirection: 'row', justifyContent: 'space-between', width: '100%', marginVertical: 10, }, methodButton: { flex: 1, marginHorizontal: 5, }, label: { marginTop: 10, marginBottom: 10, verticalAlign: "middle", textAlign: "center", } });