freshyo/apps/user-ui/app/_layout.tsx
2026-09-16 21:48:06 +05:30

102 lines
4 KiB
TypeScript
Executable file

import {
DarkTheme,
DefaultTheme,
ThemeProvider,
} from "@react-navigation/native";
import { useFonts } from "expo-font";
import { Stack } from "expo-router";
import "react-native-reanimated";
import { useColorScheme } from "@/hooks/useColorScheme";
import { Appearance, StatusBar, View, LogBox } from "react-native";
import { QueryClientProvider } from "@tanstack/react-query";
import { theme , MyStatusBar } from "common-ui";
import queryClient from "@/utils/queryClient";
import Toast from "react-native-toast-message";
import { NotificationProvider } from "@/services/notif-service/notif-context";
import { Provider as PaperProvider } from "react-native-paper";
import { AuthProvider } from "@/src/contexts/AuthContext";
import { trpc, trpcClient } from "@/src/trpc-client";
import { SafeAreaView, SafeAreaProvider } from "react-native-safe-area-context";
import LocationTestWrapper from "@/components/LocationTestWrapper";
import HealthTestWrapper from "@/components/HealthTestWrapper";
import FirstUserWrapper from "@/components/FirstUserWrapper";
import UpdateChecker from "@/components/UpdateChecker";
import CentralStoreInitializer from "@/src/components/CentralStoreInitializer";
import { RefreshProvider } from "../../../packages/ui/src/lib/refresh-context";
import WebViewWrapper from "@/components/WebViewWrapper";
import BackHandlerWrapper from "@/components/BackHandler";
import AddToCartDialog from "@/src/components/AddToCartDialog";
import React from "react";
import { GestureHandlerRootView } from "react-native-gesture-handler";
import NotifChecker from "@/services/notif-service/notif-checker";
// Silence dev warnings/errors in LogBox. The "Open debugger to view warnings"
// toast overlays the bottom of the UI and intercepts taps (e.g. tab bar /
// bottom-sheet buttons), which breaks E2E flows.
if (__DEV__) {
LogBox.ignoreAllLogs(true);
}
export default function RootLayout() {
const colorScheme = useColorScheme();
const [loaded] = useFonts({
SpaceMono: require("../assets/fonts/SpaceMono-Regular.ttf"),
});
React.useEffect(() => {
Appearance.setColorScheme('light')
}, []);
if (!loaded) {
return null;
}
return (
<GestureHandlerRootView style={{ flex: 1 }}>
<ThemeProvider value={colorScheme === "dark" ? DarkTheme : DefaultTheme}>
<MyStatusBar />
<SafeAreaProvider>
<SafeAreaView
edges={['bottom', 'left', 'right']}
style={{ flex: 1, paddingTop: 0 }}
testID="app-root"
>
<View style={{ flex: 1, backgroundColor: theme.colors.gray1 }}>
<QueryClientProvider client={queryClient}>
<trpc.Provider client={trpcClient} queryClient={queryClient}>
<UpdateChecker>
<HealthTestWrapper>
<WebViewWrapper>
<FirstUserWrapper>
<AuthProvider>
<NotificationProvider>
<NotifChecker />
<PaperProvider>
<LocationTestWrapper>
<RefreshProvider queryClient={queryClient}>
<CentralStoreInitializer>
<BackHandlerWrapper />
<Stack screenOptions={{ headerShown: false }} />
<AddToCartDialog />
</CentralStoreInitializer>
</RefreshProvider>
</LocationTestWrapper>
</PaperProvider>
</NotificationProvider>
</AuthProvider>
</FirstUserWrapper>
</WebViewWrapper>
</HealthTestWrapper>
</UpdateChecker>
</trpc.Provider>
</QueryClientProvider>
</View>
</SafeAreaView>
</SafeAreaProvider>
<Toast />
</ThemeProvider>
</GestureHandlerRootView>
);
}