90 lines
2.1 KiB
TypeScript
90 lines
2.1 KiB
TypeScript
import { HashRouter as Router, Routes, Route, useNavigate } from 'react-router-dom'
|
|
import { useEffect, useState } from 'react'
|
|
import { useAuthStore } from '@/stores/state'
|
|
import { navigationService } from '@/services/navigation'
|
|
import { Toaster } from 'sonner'
|
|
import App from './App'
|
|
import LoginPage from '@/features/LoginPage'
|
|
import ThemeProvider from '@/components/ThemeProvider'
|
|
|
|
const AppContent = () => {
|
|
const [initializing, setInitializing] = useState(true)
|
|
const { isAuthenticated } = useAuthStore()
|
|
const navigate = useNavigate()
|
|
|
|
// Set navigate function for navigation service
|
|
useEffect(() => {
|
|
navigationService.setNavigate(navigate)
|
|
}, [navigate])
|
|
|
|
// Token validity check
|
|
useEffect(() => {
|
|
|
|
const checkAuth = async () => {
|
|
try {
|
|
const token = localStorage.getItem('LIGHTRAG-API-TOKEN')
|
|
|
|
if (token && isAuthenticated) {
|
|
setInitializing(false);
|
|
return;
|
|
}
|
|
|
|
if (!token) {
|
|
useAuthStore.getState().logout()
|
|
}
|
|
} catch (error) {
|
|
console.error('Auth initialization error:', error)
|
|
if (!isAuthenticated) {
|
|
useAuthStore.getState().logout()
|
|
}
|
|
} finally {
|
|
setInitializing(false)
|
|
}
|
|
}
|
|
|
|
checkAuth()
|
|
|
|
return () => {
|
|
}
|
|
}, [isAuthenticated])
|
|
|
|
// Redirect effect for protected routes
|
|
useEffect(() => {
|
|
if (!initializing && !isAuthenticated) {
|
|
const currentPath = window.location.hash.slice(1);
|
|
if (currentPath !== '/login') {
|
|
console.log('Not authenticated, redirecting to login');
|
|
navigate('/login');
|
|
}
|
|
}
|
|
}, [initializing, isAuthenticated, navigate]);
|
|
|
|
// Show nothing while initializing
|
|
if (initializing) {
|
|
return null
|
|
}
|
|
|
|
return (
|
|
<Routes>
|
|
<Route path="/login" element={<LoginPage />} />
|
|
<Route
|
|
path="/*"
|
|
element={isAuthenticated ? <App /> : null}
|
|
/>
|
|
</Routes>
|
|
)
|
|
}
|
|
|
|
const AppRouter = () => {
|
|
return (
|
|
<ThemeProvider>
|
|
<Router>
|
|
<AppContent />
|
|
<Toaster position="bottom-center" />
|
|
</Router>
|
|
</ThemeProvider>
|
|
)
|
|
}
|
|
|
|
export default AppRouter
|