managarten/apps/context/apps/mobile/app/_layout.tsx
Till JS 5bd967900f refactor(context-mobile): migrate from Supabase to backend API + mana-core-auth
Complete migration of Context mobile app from direct Supabase access
to NestJS backend API with mana-core-auth authentication.

New files:
- context/AuthProvider.tsx: mana-core-auth integration via @manacore/shared-auth
- services/backendApi.ts: Backend API client for spaces, documents, AI, tokens

Rewritten services (same exports, backend implementation):
- supabaseService.ts: Now thin wrapper around backendApi
- aiService.ts: Uses backendApi for auth token
- tokenCountingService.ts: Model prices from backend API
- tokenTransactionService.ts: All token ops via backend API
- revenueCatService.ts: Token balance via backend API

Updated 16 consumer files (auth forms, token components, AI toolbars)

Deleted:
- utils/supabase.ts, context/AuthContext.tsx
- services/spaceService.ts, services/spaceServiceDirect.ts

Dependencies:
- Added: @manacore/shared-auth, expo-secure-store
- Removed: @supabase/supabase-js, @google/generative-ai, openai, @azure/openai

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 12:01:58 +01:00

74 lines
2.2 KiB
TypeScript

import '../global.css';
import { useEffect } from 'react';
import { Slot, Stack, useRouter, useSegments } from 'expo-router';
import { useFonts } from 'expo-font';
import { SplashScreen } from 'expo-router';
import { AuthProvider, useAuth } from '../context/AuthProvider';
import { ThemeProvider } from '../components/theme';
import { DebugProvider } from '../context/DebugContext';
import { I18nProvider } from '../context/I18nContext';
import { initializeRevenueCat } from '../services/revenueCatService';
import '../utils/i18n'; // Initialize i18n
// Prevent the splash screen from auto-hiding before asset loading is complete
SplashScreen.preventAutoHideAsync();
// Komponente zur Überprüfung der Authentifizierung und Weiterleitung
function RootLayoutNav() {
const { user, loading } = useAuth();
const segments = useSegments();
const router = useRouter();
const [fontsLoaded, fontError] = useFonts({
// You can add custom fonts here if needed
});
useEffect(() => {
if (fontsLoaded || fontError) {
// Hide the splash screen after the fonts have loaded (or an error was reported)
SplashScreen.hideAsync();
}
}, [fontsLoaded, fontError]);
// Prevent rendering until the fonts have loaded or an error was encountered
if (!fontsLoaded && !fontError) {
return null;
}
// Authentifizierungslogik
useEffect(() => {
if (loading) return;
const isAuthRoute = segments[0] === 'login' || segments[0] === 'register';
if (!user && !isAuthRoute) {
// Wenn der Benutzer nicht angemeldet ist und nicht auf einer Auth-Seite ist, leite zur Login-Seite weiter
router.replace('/login');
} else if (user && isAuthRoute) {
// Wenn der Benutzer angemeldet ist und auf einer Auth-Seite ist, leite zur Startseite weiter
router.replace('/');
}
// Initialisiere RevenueCat, wenn der Benutzer angemeldet ist
if (user) {
initializeRevenueCat(user.userId);
}
}, [user, loading, segments, router]);
return <Slot />;
}
// Root-Layout mit AuthProvider, ThemeProvider, I18nProvider und DebugProvider
export default function RootLayout() {
return (
<I18nProvider>
<AuthProvider>
<ThemeProvider>
<DebugProvider>
<RootLayoutNav />
</DebugProvider>
</ThemeProvider>
</AuthProvider>
</I18nProvider>
);
}