mirror of
https://github.com/Dictionarry-Hub/profilarr.git
synced 2026-01-23 19:21:12 +01:00
180 lines
5.4 KiB
JavaScript
180 lines
5.4 KiB
JavaScript
import {
|
|
BrowserRouter as Router,
|
|
Routes,
|
|
Route,
|
|
Navigate
|
|
} from 'react-router-dom';
|
|
import {useState, useEffect} from 'react';
|
|
import RegexPage from './components/regex/RegexPage';
|
|
import FormatPage from './components/format/FormatPage';
|
|
import ProfilePage from './components/profile/ProfilePage';
|
|
import SettingsPage from './components/settings/SettingsPage';
|
|
import SetupPage from './components/auth/SetupPage';
|
|
import LoginPage from './components/auth/LoginPage';
|
|
import Navbar from '@ui/Navbar';
|
|
import Footer from '@ui/Footer';
|
|
import {ToastContainer} from 'react-toastify';
|
|
import {checkSetupStatus} from '@api/auth';
|
|
import 'react-toastify/dist/ReactToastify.css';
|
|
|
|
function App() {
|
|
const [darkMode, setDarkMode] = useState(true);
|
|
const [authState, setAuthState] = useState({
|
|
checking: true,
|
|
needsSetup: false,
|
|
needsLogin: false,
|
|
error: null
|
|
});
|
|
|
|
// Prevent layout shifts from scrollbar
|
|
useEffect(() => {
|
|
document.body.style.overflowY = 'scroll';
|
|
return () => {
|
|
document.body.style.overflowY = '';
|
|
};
|
|
}, []);
|
|
|
|
useEffect(() => {
|
|
if (darkMode) {
|
|
document.documentElement.classList.add('dark');
|
|
} else {
|
|
document.documentElement.classList.remove('dark');
|
|
}
|
|
}, [darkMode]);
|
|
|
|
useEffect(() => {
|
|
const checkAuth = async () => {
|
|
try {
|
|
const status = await checkSetupStatus();
|
|
setAuthState({
|
|
checking: false,
|
|
needsSetup: status.needsSetup,
|
|
needsLogin: status.needsLogin,
|
|
error: status.error
|
|
});
|
|
} catch (error) {
|
|
setAuthState({
|
|
checking: false,
|
|
needsSetup: false,
|
|
needsLogin: false,
|
|
error: 'Unable to connect to server'
|
|
});
|
|
}
|
|
};
|
|
|
|
checkAuth();
|
|
}, []);
|
|
|
|
if (authState.checking) {
|
|
return (
|
|
<>
|
|
<div>Loading...</div>
|
|
<ToastContainer
|
|
position='top-right'
|
|
autoClose={5000}
|
|
hideProgressBar={false}
|
|
newestOnTop={false}
|
|
closeOnClick
|
|
rtl={false}
|
|
pauseOnFocusLoss
|
|
draggable
|
|
pauseOnHover
|
|
theme='dark'
|
|
/>
|
|
</>
|
|
);
|
|
}
|
|
|
|
if (authState.needsSetup) {
|
|
return (
|
|
<>
|
|
<SetupPage
|
|
onSetupComplete={() =>
|
|
setAuthState({
|
|
...authState,
|
|
needsSetup: false,
|
|
needsLogin: false
|
|
})
|
|
}
|
|
/>
|
|
<ToastContainer
|
|
position='top-right'
|
|
autoClose={5000}
|
|
hideProgressBar={false}
|
|
newestOnTop={false}
|
|
closeOnClick
|
|
rtl={false}
|
|
pauseOnFocusLoss
|
|
draggable
|
|
pauseOnHover
|
|
theme='dark'
|
|
/>
|
|
</>
|
|
);
|
|
}
|
|
|
|
if (authState.needsLogin) {
|
|
return (
|
|
<>
|
|
<LoginPage
|
|
onLoginComplete={() =>
|
|
setAuthState({...authState, needsLogin: false})
|
|
}
|
|
/>
|
|
<ToastContainer
|
|
position='top-right'
|
|
autoClose={5000}
|
|
hideProgressBar={false}
|
|
newestOnTop={false}
|
|
closeOnClick
|
|
rtl={false}
|
|
pauseOnFocusLoss
|
|
draggable
|
|
pauseOnHover
|
|
theme='dark'
|
|
/>
|
|
</>
|
|
);
|
|
}
|
|
|
|
return (
|
|
<>
|
|
<Router>
|
|
<div className='min-h-screen flex flex-col bg-gray-900 text-gray-100'>
|
|
<Navbar darkMode={darkMode} setDarkMode={setDarkMode} />
|
|
<div className='max-w-screen-2xl mx-auto px-4 sm:px-6 lg:px-8 mt-2 flex-grow flex-1 w-full'>
|
|
<Routes>
|
|
<Route path='/regex' element={<RegexPage />} />
|
|
<Route path='/format' element={<FormatPage />} />
|
|
<Route path='/profile' element={<ProfilePage />} />
|
|
<Route
|
|
path='/settings'
|
|
element={<SettingsPage />}
|
|
/>
|
|
<Route
|
|
path='/'
|
|
element={<Navigate to='/settings' />}
|
|
/>
|
|
</Routes>
|
|
</div>
|
|
<Footer />
|
|
</div>
|
|
</Router>
|
|
<ToastContainer
|
|
position='top-right'
|
|
autoClose={5000}
|
|
hideProgressBar={false}
|
|
newestOnTop={false}
|
|
closeOnClick
|
|
rtl={false}
|
|
pauseOnFocusLoss
|
|
draggable
|
|
pauseOnHover
|
|
theme='dark'
|
|
/>
|
|
</>
|
|
);
|
|
}
|
|
|
|
export default App;
|