Weboberflaeche mit Spielerkonto, Import und Verwaltung
Die Spieler-Detailseite beantwortet die Kernfrage direkt: drei grosse Zaehler, rot sobald ein Topf im Minus ist, darunter ob ein neuer CC oder ein Redesign gerade moeglich ist. Inaktive CCs zeigen ihren Grund und bieten genau die passende Aktion an - gratis reaktivieren oder bezahlt. Beim Redesign steht der Kulanz-Topf an erster Stelle, damit er zuerst aufgebraucht wird. Der Import fuehrt ueber Spaltenzuordnung und Vorschau; gebucht wird erst nach Bestaetigung.
This commit is contained in:
@@ -0,0 +1,97 @@
|
||||
import { Navigate, Route, Routes } from 'react-router-dom';
|
||||
import Layout from './components/Layout';
|
||||
import { useSession } from './lib/session';
|
||||
import type { Role } from './lib/types';
|
||||
import Account from './pages/Account';
|
||||
import Admin from './pages/Admin';
|
||||
import Dashboard from './pages/Dashboard';
|
||||
import Import from './pages/Import';
|
||||
import Login from './pages/Login';
|
||||
import PlayerDetail from './pages/PlayerDetail';
|
||||
|
||||
function Protected({ children, minimum }: { children: React.ReactNode; minimum?: Role }) {
|
||||
const { user, loading, can } = useSession();
|
||||
|
||||
if (loading) return <div className="boot">Lade …</div>;
|
||||
if (!user) return <Navigate to="/login" replace />;
|
||||
|
||||
// Ein frisch angelegtes Konto muss zuerst sein Passwort wechseln.
|
||||
if (user.mustChangePassword) return <Navigate to="/account" replace />;
|
||||
if (minimum && !can(minimum)) return <Navigate to="/" replace />;
|
||||
|
||||
return <>{children}</>;
|
||||
}
|
||||
|
||||
export default function App() {
|
||||
const { user, loading } = useSession();
|
||||
|
||||
return (
|
||||
<Routes>
|
||||
<Route
|
||||
path="/login"
|
||||
element={loading ? <div className="boot">Lade …</div> : user ? <Navigate to="/" replace /> : <Login />}
|
||||
/>
|
||||
|
||||
<Route
|
||||
path="/account"
|
||||
element={
|
||||
loading ? (
|
||||
<div className="boot">Lade …</div>
|
||||
) : !user ? (
|
||||
<Navigate to="/login" replace />
|
||||
) : (
|
||||
<Layout>
|
||||
<Account />
|
||||
</Layout>
|
||||
)
|
||||
}
|
||||
/>
|
||||
|
||||
<Route
|
||||
path="/"
|
||||
element={
|
||||
<Protected>
|
||||
<Layout>
|
||||
<Dashboard />
|
||||
</Layout>
|
||||
</Protected>
|
||||
}
|
||||
/>
|
||||
|
||||
<Route
|
||||
path="/players/:id"
|
||||
element={
|
||||
<Protected>
|
||||
<Layout>
|
||||
<PlayerDetail />
|
||||
</Layout>
|
||||
</Protected>
|
||||
}
|
||||
/>
|
||||
|
||||
<Route
|
||||
path="/import"
|
||||
element={
|
||||
<Protected minimum="ADMIN">
|
||||
<Layout>
|
||||
<Import />
|
||||
</Layout>
|
||||
</Protected>
|
||||
}
|
||||
/>
|
||||
|
||||
<Route
|
||||
path="/admin"
|
||||
element={
|
||||
<Protected minimum="ADMIN">
|
||||
<Layout>
|
||||
<Admin />
|
||||
</Layout>
|
||||
</Protected>
|
||||
}
|
||||
/>
|
||||
|
||||
<Route path="*" element={<Navigate to="/" replace />} />
|
||||
</Routes>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user