finished assignment 3 - 100%

This commit is contained in:
Christopher Sanden
2026-03-16 17:42:22 +01:00
parent a4c2d55aea
commit ca915ec8e8
33 changed files with 2869 additions and 711 deletions

View File

@@ -3,8 +3,11 @@ import AuthProvider from '@/providers/auth-provider'
import { NotesProvider } from "@/src/notes/NotesContext"
import { AppThemeProvider, useAppTheme } from '@/src/theme/AppThemeProvider'
import { DarkTheme, DefaultTheme, ThemeProvider } from '@react-navigation/native'
import Constants from "expo-constants"
import { Stack } from 'expo-router'
import { StatusBar } from 'expo-status-bar'
import { ComponentType, PropsWithChildren, useEffect, useState } from "react"
import { Platform } from "react-native"
import 'react-native-reanimated'
import { SafeAreaProvider } from 'react-native-safe-area-context'
@@ -71,9 +74,11 @@ function ThemedRootLayout() {
<SafeAreaProvider>
<ThemeProvider value={navigationTheme}>
<AuthProvider>
<NotesProvider>
<RootNavigator />
</NotesProvider>
<NotificationProviderGate>
<NotesProvider>
<RootNavigator />
</NotesProvider>
</NotificationProviderGate>
</AuthProvider>
<StatusBar
style={colorScheme === "dark" ? "light" : "dark"}
@@ -84,6 +89,44 @@ function ThemedRootLayout() {
)
}
function NotificationProviderGate({ children }: PropsWithChildren) {
const isAndroidExpoGo = Platform.OS === "android" && Constants.executionEnvironment === "storeClient"
const [provider, setProvider] = useState<ComponentType<PropsWithChildren> | null>(null)
useEffect(() => {
if (isAndroidExpoGo) {
return
}
let isMounted = true
const loadProvider = async () => {
try {
const module = await import("@/src/notifications/PushNotificationsProvider")
if (isMounted) {
setProvider(() => module.default)
}
} catch (error) {
console.error("Failed to load push notifications provider:", error)
}
}
void loadProvider()
return () => {
isMounted = false
}
}, [isAndroidExpoGo])
if (isAndroidExpoGo || !provider) {
return children
}
const PushNotificationsProvider = provider
return <PushNotificationsProvider>{children}</PushNotificationsProvider>
}
export default function RootLayout() {
return (
<AppThemeProvider>