Files
fredy/ui/src/App.jsx

130 lines
4.4 KiB
React
Raw Normal View History

2025-07-23 08:47:26 +02:00
import React, { useEffect } from 'react';
import InsufficientPermission from './components/permission/InsufficientPermission';
import PermissionAwareRoute from './components/permission/PermissionAwareRoute';
import GeneralSettings from './views/generalSettings/GeneralSettings';
import JobMutation from './views/jobs/mutation/JobMutation';
import UserMutator from './views/user/mutation/UserMutator';
2022-12-19 21:44:10 +01:00
import JobInsight from './views/jobs/insights/JobInsight.jsx';
import { useActions, useSelector } from './services/state/store';
2025-09-02 20:18:37 +02:00
import { Routes, Route, Navigate } from 'react-router-dom';
import Logout from './components/logout/Logout';
import Logo from './components/logo/Logo';
import Menu from './components/menu/Menu';
import Login from './views/login/Login';
import Users from './views/user/Users';
import Jobs from './views/jobs/Jobs';
import './App.less';
import TrackingModal from './components/tracking/TrackingModal.jsx';
2025-07-23 08:47:26 +02:00
import { Banner } from '@douyinfe/semi-ui';
import VersionBanner from './components/version/VersionBanner.jsx';
export default function FredyApp() {
const actions = useActions();
2025-07-23 08:47:26 +02:00
const [loading, setLoading] = React.useState(true);
const currentUser = useSelector((state) => state.user.currentUser);
const versionUpdate = useSelector((state) => state.versionUpdate.versionUpdate);
2025-07-23 08:47:26 +02:00
const settings = useSelector((state) => state.generalSettings.settings);
2025-07-23 08:47:26 +02:00
useEffect(() => {
async function init() {
await actions.user.getCurrentUser();
2025-07-23 08:47:26 +02:00
if (!needsLogin()) {
await actions.provider.getProvider();
await actions.jobs.getJobs();
await actions.jobs.getProcessingTimes();
await actions.notificationAdapter.getAdapter();
await actions.generalSettings.getGeneralSettings();
await actions.versionUpdate.getVersionUpdate();
2025-07-23 08:47:26 +02:00
}
setLoading(false);
}
2023-03-20 08:52:13 +01:00
2025-07-23 08:47:26 +02:00
init();
}, [currentUser?.userId]);
2025-07-23 08:47:26 +02:00
const needsLogin = () => {
return currentUser == null || Object.keys(currentUser).length === 0;
};
2025-07-23 08:47:26 +02:00
const isAdmin = () => currentUser != null && currentUser.isAdmin;
2025-07-23 08:47:26 +02:00
const login = () => (
2025-09-02 20:18:37 +02:00
<Routes>
<Route path="/login" element={<Login />} />
<Route path="*" element={<Navigate to="/login" replace />} />
</Routes>
2025-07-23 08:47:26 +02:00
);
return loading ? null : needsLogin() ? (
login()
) : (
<div className="app">
<div className="app__container">
<Logout />
<Logo width={190} white />
<Menu isAdmin={isAdmin()} />
{versionUpdate?.newVersion && <VersionBanner />}
2025-07-23 08:47:26 +02:00
{settings.demoMode && (
<>
<Banner
fullMode={true}
type="info"
bordered
closeIcon={null}
description="You're currently viewing the demo version of Fredy. Jobs won't scrape websites, and any changes you make will be reverted at midnight."
/>
<br />
</>
)}
{settings.analyticsEnabled === null && !settings.demoMode && <TrackingModal />}
2025-09-02 20:18:37 +02:00
<Routes>
<Route path="/403" element={<InsufficientPermission />} />
<Route path="/jobs/new" element={<JobMutation />} />
<Route path="/jobs/edit/:jobId" element={<JobMutation />} />
<Route path="/jobs/insights/:jobId" element={<JobInsight />} />
<Route path="/jobs" element={<Jobs />} />
{/* Permission-aware routes */}
<Route
2025-07-23 08:47:26 +02:00
path="/users/new"
2025-09-02 20:18:37 +02:00
element={
<PermissionAwareRoute currentUser={currentUser}>
<UserMutator />
</PermissionAwareRoute>
}
2025-07-23 08:47:26 +02:00
/>
2025-09-02 20:18:37 +02:00
<Route
2025-07-23 08:47:26 +02:00
path="/users/edit/:userId"
2025-09-02 20:18:37 +02:00
element={
<PermissionAwareRoute currentUser={currentUser}>
<UserMutator />
</PermissionAwareRoute>
}
/>
<Route
path="/users"
element={
<PermissionAwareRoute currentUser={currentUser}>
<Users />
</PermissionAwareRoute>
}
2025-07-23 08:47:26 +02:00
/>
2025-09-02 20:18:37 +02:00
<Route
2025-07-23 08:47:26 +02:00
path="/generalSettings"
2025-09-02 20:18:37 +02:00
element={
<PermissionAwareRoute currentUser={currentUser}>
<GeneralSettings />
</PermissionAwareRoute>
}
2025-07-23 08:47:26 +02:00
/>
2025-09-02 20:18:37 +02:00
<Route path="/" element={<Navigate to="/jobs" replace />} />
</Routes>
2025-07-23 08:47:26 +02:00
</div>
</div>
);
}
FredyApp.displayName = 'FredyApp';