import React, { useState, useEffect } from 'react';
import { Toaster } from 'react-hot-toast';
// Components
import LoadingSpinner from './components/ui/LoadingSpinner';
import ErrorBoundary from './components/ErrorBoundary';
import LandingPage from './pages/landing/LandingPage';
import LoginPage from './pages/auth/LoginPage';
import RegisterPage from './pages/auth/RegisterPage';
import OnboardingPage from './pages/onboarding/OnboardingPage';
import DashboardPage from './pages/dashboard/DashboardPage';
import ForecastPage from './pages/forecast/ForecastPage';
import OrdersPage from './pages/orders/OrdersPage';
import SettingsPage from './pages/settings/SettingsPage';
import Layout from './components/layout/Layout';
// Store and types
import { store } from './store';
import { Provider } from 'react-redux';
// i18n
import './i18n';
// Global styles
import './styles/globals.css';
type CurrentPage = 'landing' | 'login' | 'register' | 'onboarding' | 'dashboard' | 'forecast' | 'orders' | 'settings';
interface User {
id: string;
email: string;
fullName: string;
role: string;
isOnboardingComplete: boolean;
}
interface AppState {
isAuthenticated: boolean;
isLoading: boolean;
user: User | null;
currentPage: CurrentPage;
}
const LoadingFallback = () => (
);
const App: React.FC = () => {
const [appState, setAppState] = useState({
isAuthenticated: false,
isLoading: true,
user: null,
currentPage: 'landing' // 👈 Start with landing page
});
// Initialize app and check authentication
useEffect(() => {
const initializeApp = async () => {
try {
// Check for stored auth token
const token = localStorage.getItem('auth_token');
const userData = localStorage.getItem('user_data');
if (token && userData) {
const user = JSON.parse(userData);
setAppState({
isAuthenticated: true,
isLoading: false,
user,
currentPage: user.isOnboardingComplete ? 'dashboard' : 'onboarding'
});
} else {
setAppState(prev => ({
...prev,
isLoading: false,
currentPage: 'landing' // 👈 Show landing page for non-authenticated users
}));
}
} catch (error) {
console.error('App initialization error:', error);
setAppState(prev => ({
...prev,
isLoading: false,
currentPage: 'landing' // 👈 Fallback to landing page
}));
}
};
initializeApp();
}, []);
const handleLogin = (user: User, token: string) => {
localStorage.setItem('auth_token', token);
localStorage.setItem('user_data', JSON.stringify(user));
setAppState({
isAuthenticated: true,
isLoading: false,
user,
currentPage: user.isOnboardingComplete ? 'dashboard' : 'onboarding'
});
};
const handleLogout = () => {
localStorage.removeItem('auth_token');
localStorage.removeItem('user_data');
setAppState({
isAuthenticated: false,
isLoading: false,
user: null,
currentPage: 'landing' // 👈 Return to landing page after logout
});
};
const handleOnboardingComplete = () => {
const updatedUser = { ...appState.user!, isOnboardingComplete: true };
localStorage.setItem('user_data', JSON.stringify(updatedUser));
setAppState(prev => ({
...prev,
user: updatedUser,
currentPage: 'dashboard'
}));
};
const navigateTo = (page: CurrentPage) => {
setAppState(prev => ({ ...prev, currentPage: page }));
};
if (appState.isLoading) {
return ;
}
const renderCurrentPage = () => {
// Public pages (non-authenticated)
if (!appState.isAuthenticated) {
switch (appState.currentPage) {
case 'login':
return (
navigateTo('register')}
/>
);
case 'register':
return (
navigateTo('login')}
/>
);
default:
return (
navigateTo('login')}
onNavigateToRegister={() => navigateTo('register')}
/>
);
}
}
// Authenticated pages
if (!appState.user?.isOnboardingComplete && appState.currentPage !== 'settings') {
return (
);
}
// Main app pages with layout
const pageComponent = () => {
switch (appState.currentPage) {
case 'forecast':
return ;
case 'orders':
return ;
case 'settings':
return ;
default:
return ;
}
};
return (
{pageComponent()}
);
};
return (
{renderCurrentPage()}
{/* Global Toast Notifications */}
);
};
export default App;