feat: Standort hinzugefügt

This commit is contained in:
Ismail Ali
2025-07-15 21:41:23 +02:00
parent 96b635bccb
commit 007dedb09a
3 changed files with 323 additions and 4 deletions

View File

@@ -1,5 +1,6 @@
import AsyncStorage from "@react-native-async-storage/async-storage";
import * as LocalAuthentication from "expo-local-authentication";
import * as Location from "expo-location";
import { useRouter } from "expo-router";
import * as SQLite from "expo-sqlite";
import React, { useEffect, useState } from "react";
@@ -22,6 +23,10 @@ interface User {
email: string;
firstName: string;
lastName: string;
residence: string;
workplace: string;
latitude: string;
longitude: string;
createdAt: string;
}
@@ -37,6 +42,10 @@ export default function AuthScreen() {
const [password, setPassword] = useState("");
const [firstName, setFirstName] = useState("");
const [lastName, setLastName] = useState("");
const [residence, setResidence] = useState("");
const [workplace, setWorkplace] = useState("");
const [latitude, setLatitude] = useState<string | null>(null);
const [longitude, setLongitude] = useState<string | null>(null);
const [biometricSupported, setBiometricSupported] = useState(false);
const [showCalendar, setShowCalendar] = useState(false);
@@ -61,6 +70,10 @@ export default function AuthScreen() {
firstName TEXT NOT NULL,
lastName TEXT NOT NULL,
password TEXT NOT NULL,
residence TEXT,
workplace TEXT,
latitude TEXT,
longitude TEXT,
createdAt TEXT NOT NULL
)
`);
@@ -85,7 +98,14 @@ export default function AuthScreen() {
};
const handleRegister = async () => {
if (!email || !password || !firstName || !lastName) {
if (
!email ||
!password ||
!firstName ||
!lastName ||
!residence ||
!workplace
) {
Alert.alert("Fehler", "Bitte füllen Sie alle Felder aus.");
return;
}
@@ -105,8 +125,18 @@ export default function AuthScreen() {
const createdAt = new Date().toISOString();
const result = await db.runAsync(
"INSERT INTO users (email, firstName, lastName, password, createdAt) VALUES (?, ?, ?, ?, ?)",
[email, firstName, lastName, password, createdAt]
"INSERT INTO users (email, firstName, lastName, password, residence, workplace, latitude, longitude, createdAt) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)",
[
email,
firstName,
lastName,
password,
residence,
workplace,
latitude ?? "",
longitude ?? "",
createdAt,
]
);
const newUser: User = {
@@ -114,6 +144,10 @@ export default function AuthScreen() {
email,
firstName,
lastName,
residence,
workplace,
latitude: latitude ?? "",
longitude: longitude ?? "",
createdAt,
};
@@ -162,6 +196,10 @@ export default function AuthScreen() {
email: result.email,
firstName: result.firstName,
lastName: result.lastName,
residence: result.residence,
workplace: result.workplace,
latitude: result.latitude,
longitude: result.longitude,
createdAt: result.createdAt,
};
@@ -202,6 +240,10 @@ export default function AuthScreen() {
email: user.email,
firstName: user.firstName,
lastName: user.lastName,
residence: user.residence,
workplace: user.workplace,
latitude: user.latitude,
longitude: user.longitude,
createdAt: user.createdAt,
};
@@ -227,11 +269,37 @@ export default function AuthScreen() {
setPassword("");
setFirstName("");
setLastName("");
setResidence("");
setWorkplace("");
setLatitude(null);
setLongitude(null);
} catch (error) {
Alert.alert("Fehler", "Abmeldung fehlgeschlagen.");
}
};
const handleUseLocation = async () => {
try {
const { status } = await Location.requestForegroundPermissionsAsync();
if (status !== "granted") {
Alert.alert("Fehler", "Standortberechtigung nicht erteilt.");
return;
}
const loc = await Location.getCurrentPositionAsync({});
setLatitude(loc.coords.latitude.toString());
setLongitude(loc.coords.longitude.toString());
const addr = await Location.reverseGeocodeAsync({
latitude: loc.coords.latitude,
longitude: loc.coords.longitude,
});
if (addr && addr.length > 0) {
setResidence(addr[0].city || addr[0].region || "");
}
} catch (e) {
Alert.alert("Fehler", "Standort konnte nicht ermittelt werden.");
}
};
if (loading) {
return (
<SafeAreaView style={styles.container}>
@@ -305,6 +373,30 @@ export default function AuthScreen() {
onChangeText={setLastName}
autoCapitalize="words"
/>
<TextInput
style={styles.input}
placeholder="Wohnort"
value={residence}
onChangeText={setResidence}
/>
<TextInput
style={styles.input}
placeholder="Arbeitsplatz / Uni / Schule"
value={workplace}
onChangeText={setWorkplace}
/>
<TouchableOpacity
style={[
styles.submitButton,
{ backgroundColor: "#34C759", marginBottom: 10 },
]}
onPress={handleUseLocation}
>
<Text style={styles.submitButtonText}>
Aktuellen Standort verwenden
</Text>
</TouchableOpacity>
</>
)}