// src/modules/core/main-navigator/index.tsx
import React, { useState, useEffect } from 'react';
import { View, Text, StyleSheet } from 'react-native';
import { moduleLoader } from '../../../config/moduleLoader';
import { ModuleState } from '../../../config/modules';
// Import the theme hook
import { useTheme } from '../../../theme/ThemeProvider';
// Types for different app states
type AppState = 'splash' | 'auth' | 'accountOverview';
const MainNavigator: React.FC = () => {
// Get theme from context
const { theme, isLoading } = useTheme();
// Show loading state while theme is loading
if (isLoading || !theme) {
return (
Loading theme...
);
}
// Track the current screen to display
const [currentScreen, setCurrentScreen] = useState('splash');
// Track if modules are loaded
const [modulesReady, setModulesReady] = useState(false);
// Create dynamic styles based on theme
const dynamicStyles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: theme.colors.background,
},
loadingContainer: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: theme.colors.surface,
padding: theme.spacing.lg,
},
loadingText: {
fontSize: theme.fontSize.base,
color: theme.colors.textSecondary,
},
errorContainer: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: theme.colors.semantic.error,
padding: theme.spacing.lg,
},
errorText: {
color: theme.colors.neutral[50],
fontSize: theme.fontSize.lg,
fontWeight: '600',
}
});
// ... rest of your existing useEffect code stays the same ...
// Wait for modules to be loaded
useEffect(() => {
const checkModules = async () => {
// Wait for module loader to be initialized
await moduleLoader.initialize();
// Check if required modules are loaded
const requiredModules = ['splash', 'authentication', 'account-overview'];
const allLoaded = requiredModules.every(moduleId =>
moduleLoader.isModuleLoaded(moduleId)
);
if (allLoaded) {
setModulesReady(true);
} else {
// If some modules aren't loaded, try again after a short delay
setTimeout(checkModules, 500);
}
};
checkModules();
}, []);
// Set up navigation flow
useEffect(() => {
// Only start navigation flow when modules are ready
if (!modulesReady) return;
// Simulate navigation flow - in a real app this would be based on authentication state
// Example: After 3 seconds, move from splash to auth
const splashTimer = setTimeout(() => {
setCurrentScreen('auth');
// Example: After 2 more seconds, move to account overview
// In a real app, this would happen after successful authentication
const authTimer = setTimeout(() => {
setCurrentScreen('accountOverview');
}, 2000);
return () => clearTimeout(authTimer);
}, 3000);
return () => clearTimeout(splashTimer);
}, [modulesReady]);
// Get components from module loader
const getScreenComponent = (moduleId: string) => {
if (!modulesReady) return null;
const module = moduleLoader.getModule(moduleId);
if (module?.state === ModuleState.LOADED) {
return module.component;
}
return null;
};
// Render the appropriate screen based on current state
const renderScreen = () => {
if (!modulesReady) {
return (
Loading modules...
);
}
switch (currentScreen) {
case 'splash': {
const SplashComponent = getScreenComponent('splash');
return SplashComponent ? : (
Splash module not loaded
);
}
case 'auth': {
const AuthComponent = getScreenComponent('authentication');
return AuthComponent ? : (
Authentication module not loaded
);
}
case 'accountOverview': {
const AccountOverviewComponent = getScreenComponent('account-overview');
return AccountOverviewComponent ? : (
Account Overview module not loaded
);
}
default:
return (
Unknown screen state
);
}
};
return (
{renderScreen()}
);
};
// ... rest of your existing code (metadata, export) stays the same ...
// Module metadata
export const metadata = {
version: '1.0.0',
features: ['navigation', 'routing'],
api: {
// navigateTo: setCurrentScreen,
// getCurrentScreen: () => currentScreen
}
};
// Export default component
export default MainNavigator;