9e4c9071e6
Installs `expo-notifications` and `expo-task-manager` packages. Implements a `useNotifications` hook for requesting permissions, polling for post status changes, and sending local notifications for published or errored posts. Updates `app.json` to include notification permissions and the notification handler. Wires the `useNotifications` hook into the app's root layout. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 7b0991ce-c7b8-4c82-9acc-fd3f9e762a01 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: 7e5cd315-f570-494a-b5a6-c6ee284a4516 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/86064bd6-c937-4ca5-a5bf-bbef5749fb60/7b0991ce-c7b8-4c82-9acc-fd3f9e762a01/kWnlAIM Replit-Helium-Checkpoint-Created: true
77 lines
1.9 KiB
TypeScript
77 lines
1.9 KiB
TypeScript
import {
|
|
Inter_400Regular,
|
|
Inter_500Medium,
|
|
Inter_600SemiBold,
|
|
Inter_700Bold,
|
|
useFonts,
|
|
} from "@expo-google-fonts/inter";
|
|
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
|
|
import { Stack } from "expo-router";
|
|
import * as SplashScreen from "expo-splash-screen";
|
|
import React, { useEffect } from "react";
|
|
import { GestureHandlerRootView } from "react-native-gesture-handler";
|
|
import { KeyboardProvider } from "react-native-keyboard-controller";
|
|
import { SafeAreaProvider } from "react-native-safe-area-context";
|
|
|
|
import { ErrorBoundary } from "@/components/ErrorBoundary";
|
|
import { PostizProvider } from "@/context/PostizContext";
|
|
import { useNotifications } from "@/hooks/useNotifications";
|
|
|
|
SplashScreen.preventAutoHideAsync();
|
|
|
|
const queryClient = new QueryClient({
|
|
defaultOptions: {
|
|
queries: {
|
|
retry: 1,
|
|
staleTime: 30000,
|
|
},
|
|
},
|
|
});
|
|
|
|
function NotificationBootstrap() {
|
|
useNotifications();
|
|
return null;
|
|
}
|
|
|
|
function RootLayoutNav() {
|
|
return (
|
|
<Stack screenOptions={{ headerBackTitle: "Back" }}>
|
|
<Stack.Screen name="(tabs)" options={{ headerShown: false }} />
|
|
</Stack>
|
|
);
|
|
}
|
|
|
|
export default function RootLayout() {
|
|
const [fontsLoaded, fontError] = useFonts({
|
|
Inter_400Regular,
|
|
Inter_500Medium,
|
|
Inter_600SemiBold,
|
|
Inter_700Bold,
|
|
});
|
|
|
|
useEffect(() => {
|
|
if (fontsLoaded || fontError) {
|
|
SplashScreen.hideAsync();
|
|
}
|
|
}, [fontsLoaded, fontError]);
|
|
|
|
if (!fontsLoaded && !fontError) return null;
|
|
|
|
return (
|
|
<SafeAreaProvider>
|
|
<ErrorBoundary>
|
|
<QueryClientProvider client={queryClient}>
|
|
<PostizProvider>
|
|
<NotificationBootstrap />
|
|
<GestureHandlerRootView style={{ flex: 1 }}>
|
|
<KeyboardProvider>
|
|
<RootLayoutNav />
|
|
</KeyboardProvider>
|
|
</GestureHandlerRootView>
|
|
</PostizProvider>
|
|
</QueryClientProvider>
|
|
</ErrorBoundary>
|
|
</SafeAreaProvider>
|
|
);
|
|
}
|