- Add register screen with onboarding redirect to address validation - Add waste separation guide screen with 4 categories and offline tips (organicos, reciclables, sanitarios, especiales) plus preventive messaging banner - Add feedback submission screen with 4 types and 1-5 star rating - Add address screen: list colonias, pick one, validate against backend - Switch from pull-to-refresh GPS hack to periodic polling of /tracking/status (30s) — backend now drives the simulation - Filter notifications by logged-in user.id (tunnel-view on client side) - Add register/logout/address actions to profile screen - Hide login/register/feedback/addresses from tab bar (href: null) - Set API_URL to LAN IP for physical phone testing over hotspot
105 lines
2.9 KiB
TypeScript
105 lines
2.9 KiB
TypeScript
import { View, Text, StyleSheet, Alert } from "react-native";
|
|
import { SafeAreaView } from "react-native-safe-area-context";
|
|
import { useRouter } from "expo-router";
|
|
|
|
import { COLORS } from "../constants/colors";
|
|
import PrimaryButton from "../components/PrimaryButton";
|
|
|
|
import { useApp } from "../context/AppContext";
|
|
import { resetDemo } from "../services/tracking.service";
|
|
|
|
export default function ProfileScreen() {
|
|
const { user, logout, refreshStatus } = useApp();
|
|
const router = useRouter();
|
|
|
|
const handleResetDemo = async () => {
|
|
try {
|
|
await resetDemo();
|
|
await refreshStatus();
|
|
Alert.alert("Demo reiniciado", "Estado y notificaciones borradas.");
|
|
} catch (err) {
|
|
Alert.alert(
|
|
"Error",
|
|
err instanceof Error ? err.message : "No se pudo reiniciar",
|
|
);
|
|
}
|
|
};
|
|
|
|
if (!user) {
|
|
return (
|
|
<SafeAreaView style={styles.container}>
|
|
<View style={styles.content}>
|
|
<Text style={styles.title}>No has iniciado sesión</Text>
|
|
<PrimaryButton
|
|
title="Iniciar sesión"
|
|
onPress={() => router.push("/login")}
|
|
/>
|
|
</View>
|
|
</SafeAreaView>
|
|
);
|
|
}
|
|
|
|
const handleLogout = () => {
|
|
logout();
|
|
router.replace("/login");
|
|
};
|
|
|
|
return (
|
|
<SafeAreaView style={styles.container}>
|
|
<View style={styles.content}>
|
|
<Text style={styles.title}>Hola, {user.name}</Text>
|
|
<Text style={styles.email}>{user.email}</Text>
|
|
|
|
<View style={{ height: 24 }} />
|
|
|
|
<PrimaryButton
|
|
title="Mi domicilio"
|
|
onPress={() => router.push("/addresses")}
|
|
/>
|
|
|
|
<View style={{ height: 12 }} />
|
|
|
|
<PrimaryButton
|
|
title="Buzón de retroalimentación"
|
|
onPress={() => router.push("/feedback")}
|
|
/>
|
|
|
|
<View style={{ height: 12 }} />
|
|
|
|
<PrimaryButton
|
|
title="Reiniciar demo"
|
|
onPress={handleResetDemo}
|
|
/>
|
|
|
|
<View style={{ height: 12 }} />
|
|
|
|
<PrimaryButton title="Cerrar sesión" onPress={handleLogout} />
|
|
</View>
|
|
</SafeAreaView>
|
|
);
|
|
}
|
|
|
|
const styles = StyleSheet.create({
|
|
container: {
|
|
flex: 1,
|
|
backgroundColor: COLORS.background,
|
|
},
|
|
content: {
|
|
flex: 1,
|
|
padding: 24,
|
|
justifyContent: "center",
|
|
},
|
|
title: {
|
|
fontSize: 22,
|
|
fontWeight: "bold",
|
|
textAlign: "center",
|
|
marginBottom: 6,
|
|
},
|
|
email: {
|
|
fontSize: 14,
|
|
color: "#6B7280",
|
|
textAlign: "center",
|
|
marginBottom: 16,
|
|
},
|
|
});
|