"use client" import "react-native-gesture-handler" import React, { useEffect, useState } from "react" import { NavigationContainer } from "@react-navigation/native" import { StatusBar } from "expo-status-bar" import { SafeAreaProvider, SafeAreaView } from "react-native-safe-area-context" import * as SplashScreen from "expo-splash-screen" import NetInfo from "@react-native-community/netinfo" import { AuthProvider } from "./src/contexts/AuthContext" import { SyncProvider } from "./src/contexts/SyncContext" import { DeliveriesProvider } from "./src/contexts/DeliveriesContext" import { OfflineProvider } from "./src/contexts/OfflineContext" import { OfflineModeProvider } from "./src/contexts/OfflineModeContext" import Navigation, { navigationRef } from "./src/navigation" import { registerForPushNotificationsAsync } from "./src/services/notifications" import { setupDatabase, storageInfo } from "./src/services/database" import { I18nManager, Text, View, Platform } from "react-native" import { COLORS } from "./src/constants/theme" import FloatingPanicButton from './components/FloatingPanicButton' import { GestureHandlerRootView } from 'react-native-gesture-handler' // Forçar LTR (Left-to-Right) para evitar problemas com idiomas RTL if (I18nManager.isRTL) { I18nManager.allowRTL(false) I18nManager.forceRTL(false) } // Garantir que o Text padrão não use fontes estranhas (Text as any).defaultProps = (Text as any).defaultProps || {}; (Text as any).defaultProps.allowFontScaling = false; // Keep the splash screen visible while we fetch resources SplashScreen.preventAutoHideAsync() export default function App() { const [appIsReady, setAppIsReady] = useState(false) const [isConnected, setIsConnected] = useState(true) const [dbInitError, setDbInitError] = useState(null) useEffect(() => { async function prepare() { try { // Inicializar banco de dados await setupDatabase() console.log(`Banco de dados inicializado com sucesso usando ${storageInfo.type}`) // Registrar para notificações push await registerForPushNotificationsAsync() // Atraso artificial para uma tela de splash mais suave await new Promise((resolve) => setTimeout(resolve, 1000)) } catch (e) { console.warn("Erro ao carregar recursos:", e) let msg = 'Erro desconhecido' if (e instanceof Error) msg = e.message setDbInitError(`Erro ao inicializar: ${msg}`) } finally { setAppIsReady(true) } } prepare() }, []) useEffect(() => { // Inscrever-se para atualizações de estado da rede const unsubscribe = NetInfo.addEventListener((state) => { setIsConnected(state.isConnected !== null ? state.isConnected : false) }) return () => unsubscribe() }, []) const onLayoutRootView = React.useCallback(async () => { if (appIsReady) { await SplashScreen.hideAsync() } }, [appIsReady]) const handlePanic = (location?: { latitude: number; longitude: number } | null) => { if (location && location.latitude && location.longitude) { alert(`Pânico acionado! Sua localização foi enviada para a central:\nLat: ${location.latitude}\nLng: ${location.longitude}`); } else { alert('Pânico acionado! Não foi possível obter sua localização.'); } } if (!appIsReady) { return null } // Se houver um erro na inicialização do banco de dados, mostrar uma tela de erro if (dbInitError) { return ( Erro na inicialização do aplicativo {dbInitError} Usando: {storageInfo.type} ) } return ( {Platform.OS === 'android' ? ( ) : ( )} {/* */} ) }