Files
resolutionflow/frontend/src/App.tsx
Michael Chihlas 5a0dff1da9 Add dark mode, export preview, and keyboard navigation
- Add theme store with light/dark/system modes and ThemeToggle component
- Prevent flash of wrong theme on initial load via inline script
- Add ExportPreviewModal for previewing session exports before download
- Add copy-to-clipboard functionality to session export
- Implement keyboard shortcuts for tree navigation (1-9 options, Esc back, Enter continue)
- Display keyboard hints in tree navigation UI
- Fix findNode to safely handle undefined structure parameter
- Update page title to "Apoklisis"

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 21:19:57 -05:00

40 lines
1.1 KiB
TypeScript

import { useEffect } from 'react'
import { RouterProvider } from 'react-router-dom'
import { router } from '@/router'
import { useAuthStore } from '@/store/authStore'
import { useThemeStore } from '@/store/themeStore'
function App() {
const { isAuthenticated, fetchUser, setLoading } = useAuthStore()
const { theme, setTheme } = useThemeStore()
useEffect(() => {
// On app load, check if we have a token and fetch user data
const token = localStorage.getItem('access_token')
if (token && isAuthenticated) {
fetchUser().catch(() => {
// Token is invalid, will be handled by interceptor
})
} else {
setLoading(false)
}
}, [])
// Listen for system theme changes
useEffect(() => {
const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')
const handleChange = () => {
if (theme === 'system') {
setTheme('system') // Re-apply to update resolvedTheme
}
}
mediaQuery.addEventListener('change', handleChange)
return () => mediaQuery.removeEventListener('change', handleChange)
}, [theme, setTheme])
return <RouterProvider router={router} />
}
export default App