Files
skrift-app/src/App.tsx
s4luorth 2386721e41
All checks were successful
Build & Deploy / deploy (push) Successful in 23s
Motiv-Freigabe: öffentliche Seite /freigabe/:token (A6-Entwurf ansehen + freigeben)
Kunde öffnet den Einmal-Link (kein Login), sieht den A6-Drucklayout-Entwurf und
gibt frei oder hinterlegt einen Änderungswunsch. API: fetchFreigabe/sendFreigabe/
freigabeLayoutUrl (öffentlich, token-gated).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-18 08:05:23 +02:00

67 lines
2.6 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { Navigate, Route, Routes } from 'react-router-dom';
import AppShell from './components/AppShell';
import { WizardProvider } from './lib/wizard';
import { DialogsProvider } from './lib/dialogs';
import Login from './routes/Login';
import Auftraege from './routes/Auftraege';
import Stammdaten from './routes/Stammdaten';
import Configurator from './routes/Configurator';
import MusterSeite from './routes/Muster';
import AngebotSeite from './routes/Angebot';
import FreigabeSeite from './routes/Freigabe';
import Textmenge from './routes/Textmenge';
import { loadSession } from './lib/api';
/**
* Produkt-Direktlinks (Slug → Produktschlüssel): wählen das Produkt vor, der
* Konfigurator startet auf Schritt 1. Mehrere freundliche Slugs erlaubt
* (z. B. /followups zeigt auf den Schlüssel follow_ups).
*/
const PRODUKT_PFADE: Record<string, string> = {
briefe: 'briefe',
postkarten: 'postkarten',
unterschriftenservice: 'unterschriftenservice',
follow_ups: 'follow_ups',
followups: 'follow_ups',
'follow-ups': 'follow_ups',
};
function Geschuetzt({ children }: { children: React.ReactNode }) {
return loadSession() ? <>{children}</> : <Navigate to="/login" replace />;
}
export default function App() {
return (
<DialogsProvider>
<WizardProvider>
<AppShell>
<Routes>
<Route path="/" element={<Configurator />} />
<Route path="/login" element={<Login />} />
{/* Muster & individuelles Angebot als eigene Seiten (kein Popup). */}
<Route path="/muster" element={<MusterSeite />} />
<Route path="/angebot" element={<AngebotSeite />} />
{/* Motiv-Freigabe über Einmal-Link (kein Login nötig). */}
<Route path="/freigabe/:token" element={<FreigabeSeite />} />
{/* Textmengen-Tool – öffentlich, Direktlink /textmenge. */}
<Route path="/textmenge" element={<Textmenge />} />
<Route
path="/auftraege"
element={<Geschuetzt><Auftraege /></Geschuetzt>}
/>
<Route
path="/stammdaten"
element={<Geschuetzt><Stammdaten /></Geschuetzt>}
/>
{/* Produkt-Direktlinks – Produktwahl entfällt, Personentyp bleibt. */}
{Object.entries(PRODUKT_PFADE).map(([slug, key]) => (
<Route key={slug} path={`/${slug}`} element={<Configurator vorwahlProdukt={key} />} />
))}
<Route path="*" element={<Navigate to="/" replace />} />
</Routes>
</AppShell>
</WizardProvider>
</DialogsProvider>
);
}