import React, { useState, useCallback, useEffect } from "react"; import { View, StyleSheet, Image, ScrollView } from "react-native"; import { Title } from "react-native-paper"; import { Ionicons } from "@expo/vector-icons"; import { permissionsActions, usePermissionsState, permissionWizardActions, } from "~/stores"; import { useTheme } from "~/theme"; import openSettings from "~/lib/native/openSettings"; import requestPermissionPhoneCall from "~/permissions/requestPermissionPhoneCall"; import requestPermissionFcm from "~/permissions/requestPermissionFcm"; import requestPermissionLocationForeground from "~/permissions/requestPermissionLocationForeground"; import CustomButton from "~/components/CustomButton"; import Text from "~/components/Text"; const Welcome = () => { const [requesting, setRequesting] = useState(false); const [hasAttempted, setHasAttempted] = useState(false); const [hasRetried, setHasRetried] = useState(false); const permissions = usePermissionsState([ "phoneCall", "fcm", "locationForeground", ]); const theme = useTheme(); const handleNext = useCallback(() => { permissionWizardActions.setCurrentStep("hero"); }, []); const handleRequestPermissions = useCallback(async () => { setRequesting(true); try { const phoneCall = await requestPermissionPhoneCall(); const fcm = await requestPermissionFcm(); const location = await requestPermissionLocationForeground(); permissionsActions.setPhoneCall(phoneCall); permissionsActions.setFcm(fcm); permissionsActions.setLocationForeground(location); if (phoneCall && fcm && location) { permissionWizardActions.setBasicPermissionsGranted(true); permissionWizardActions.setCurrentStep("hero"); } } catch (error) { console.error("Error requesting permissions:", error); } setRequesting(false); setHasAttempted(true); }, []); const handleRetry = useCallback(async () => { await handleRequestPermissions(); setHasRetried(true); }, [handleRequestPermissions]); const allGranted = permissions.phoneCall && permissions.fcm && permissions.locationForeground; useEffect(() => { if (hasAttempted && allGranted) { handleNext(); } }, [hasAttempted, allGranted, handleNext]); const renderWarnings = () => { const warnings = []; if (!permissions.phoneCall) { warnings.push( "Sans la permission d'appel téléphonique, vous ne pourrez pas contacter rapidement les secours en cas de besoin.", ); } if (!permissions.fcm) { warnings.push( "Sans les notifications, vous ne serez pas alerté en temps réel des situations d'urgence à proximité ou si vos proches ont besoin d'aide.", ); } if (!permissions.locationForeground) { warnings.push( "Sans la localisation, vous ne pourrez pas être guidé vers les personnes ayant besoin d'aide.", ); } return warnings.map((warning, index) => ( {warning} )); }; const renderButton = () => { if (!hasAttempted) { return ( J'accorde les permissions ); } if (allGranted) { return ( Suivant ); } return ( <> Ignorer Réessayer d'accorder les permissions {hasRetried && ( <> Si les permissions ne sont pas accordées, vous devez les activer manuellement dans les paramètres de votre téléphone. Paramètres )} ); }; return ( <Text>Alerte-Secours</Text> {"\n"} <Text style={styles.subtitle}>Toujours prêts !</Text> Pour être en mesure de vous aider, l'application nécessite les permissions suivantes : Appels téléphoniques : pour contacter rapidement les secours en cas d'urgence Notifications : pour être alerté des situations d'urgence et être informé si vos proches ont besoin d'aide Localisation : pour pouvoir transmettre efficacement votre position aux secours, à vos proches, et aux personnes autour de vous en cas d'urgence {!allGranted && hasAttempted && renderWarnings()} {renderButton()} ); }; const styles = StyleSheet.create({ container: { flex: 1, }, scrollView: { flex: 1, }, content: { padding: 20, }, titleImage: { width: 120, height: 120, alignSelf: "center", marginBottom: 20, resizeMode: "contain", }, title: { fontSize: 28, fontWeight: "bold", textAlign: "center", marginBottom: 20, }, subtitle: { fontSize: 22, }, description: { fontSize: 16, marginBottom: 20, lineHeight: 24, textAlign: "left", }, permissionList: { marginBottom: 20, }, permissionItem: { flexDirection: "row", alignItems: "flex-start", marginBottom: 15, }, icon: { marginRight: 10, marginTop: 2, }, permissionText: { fontSize: 16, flex: 1, lineHeight: 22, textAlign: "left", }, warning: { marginBottom: 10, fontSize: 14, lineHeight: 20, textAlign: "left", }, settingsHint: { fontSize: 14, lineHeight: 20, textAlign: "center", marginBottom: 10, fontStyle: "italic", }, buttonContainer: { marginTop: 20, }, }); export default Welcome;