File size: 1,766 Bytes
964d38b e179c31 7cf51ae e0405f2 20a9726 e0405f2 964d38b 20a9726 e0405f2 20a9726 e0405f2 20a9726 3fdd49b 20a9726 964d38b 7cf51ae 964d38b 20a9726 e179c31 20a9726 964d38b | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | import { Stack } from 'expo-router';
import { GestureHandlerRootView } from 'react-native-gesture-handler';
import { SafeAreaProvider } from 'react-native-safe-area-context';
import * as BackgroundFetch from 'expo-background-fetch';
import { useEffect } from 'react';
import { View, ActivityIndicator } from 'react-native';
import LoginScreen from '../components/LoginScreen';
import { AuthProvider, useAuth } from '../components/AuthContext';
// Import syncManager to ensure TaskManager.defineTask is called in the global scope
import { BACKGROUND_SYNC_TASK } from './utils/syncManager';
function AppContent() {
const { isAuthenticated, login } = useAuth();
useEffect(() => {
const registerTask = async () => {
try {
await BackgroundFetch.registerTaskAsync(BACKGROUND_SYNC_TASK, {
minimumInterval: 60 * 15,
stopOnTerminate: false,
startOnBoot: true,
});
} catch (err) {
console.warn('Background fetch failed to register:', err);
}
};
registerTask();
}, []);
if (isAuthenticated === null) {
return (
<View style={{ flex: 1, justifyContent: 'center', alignItems: 'center', backgroundColor: '#F6EAE1' }}>
<ActivityIndicator size="large" color="#1a73e8" />
</View>
);
}
if (!isAuthenticated) {
return <LoginScreen onLoginSuccess={(token: string) => login(token)} />;
}
return (
<SafeAreaProvider>
<Stack>
<Stack.Screen name="(tabs)" options={{ headerShown: false }} />
</Stack>
</SafeAreaProvider>
);
}
export default function Layout() {
return (
<GestureHandlerRootView style={{ flex: 1 }}>
<AuthProvider>
<AppContent />
</AuthProvider>
</GestureHandlerRootView>
);
} |