die tenant admin oauth authentifizierung wurde implementiert und funktioniert jetzt. Zudem wurde das marketing frontend dashboard implementiert.

This commit is contained in:
Codex Agent
2025-11-04 16:14:07 +01:00
parent 55c606bdd4
commit 92e64c361a
11 changed files with 407 additions and 156 deletions

View File

@@ -5,9 +5,9 @@ import Header from './components/Header';
import BottomNav from './components/BottomNav';
import { useEventData } from './hooks/useEventData';
import { AlertTriangle, Loader2 } from 'lucide-react';
import type { FetchEventErrorCode } from './services/eventApi';
import { EventStatsProvider } from './context/EventStatsContext';
import { GuestIdentityProvider } from './context/GuestIdentityContext';
import { EventBrandingProvider } from './context/EventBrandingContext';
import LandingPage from './pages/LandingPage';
import ProfileSetupPage from './pages/ProfileSetupPage';
import HomePage from './pages/HomePage';
@@ -26,6 +26,8 @@ import NotFoundPage from './pages/NotFoundPage';
import { LocaleProvider } from './i18n/LocaleContext';
import { DEFAULT_LOCALE, isLocaleCode } from './i18n/messages';
import { useTranslation, type TranslateFn } from './i18n/useTranslation';
import type { EventBranding } from './types/event-branding';
import type { EventBrandingPayload, FetchEventErrorCode } from './services/eventApi';
function HomeLayout() {
const { token } = useParams();
@@ -92,37 +94,43 @@ function EventBoundary({ token }: { token: string }) {
const eventLocale = isLocaleCode(event.default_locale) ? event.default_locale : DEFAULT_LOCALE;
const localeStorageKey = `guestLocale_event_${event.id ?? token}`;
const branding = mapEventBranding(event.branding);
return (
<LocaleProvider defaultLocale={eventLocale} storageKey={localeStorageKey}>
<EventStatsProvider eventKey={token}>
<div className="pb-16">
<Header eventToken={token} />
<div className="px-4 py-3">
<Outlet />
<EventBrandingProvider branding={branding}>
<EventStatsProvider eventKey={token}>
<div className="pb-16">
<Header eventToken={token} />
<div className="px-4 py-3">
<Outlet />
</div>
<BottomNav />
</div>
<BottomNav />
</div>
</EventStatsProvider>
</EventStatsProvider>
</EventBrandingProvider>
</LocaleProvider>
);
}
function SetupLayout() {
const { token } = useParams<{ token: string }>();
if (!token) return null;
const { event } = useEventData();
if (!token) return null;
const eventLocale = event && isLocaleCode(event.default_locale) ? event.default_locale : DEFAULT_LOCALE;
const localeStorageKey = event ? `guestLocale_event_${event.id}` : `guestLocale_event_${token}`;
const branding = event ? mapEventBranding(event.branding) : null;
return (
<GuestIdentityProvider eventKey={token}>
<LocaleProvider defaultLocale={eventLocale} storageKey={localeStorageKey}>
<EventStatsProvider eventKey={token}>
<div className="pb-0">
<Header eventToken={token} />
<Outlet />
</div>
</EventStatsProvider>
<EventBrandingProvider branding={branding}>
<EventStatsProvider eventKey={token}>
<div className="pb-0">
<Header eventToken={token} />
<Outlet />
</div>
</EventStatsProvider>
</EventBrandingProvider>
</LocaleProvider>
</GuestIdentityProvider>
);
@@ -141,6 +149,20 @@ function EventLoadingView() {
);
}
function mapEventBranding(raw?: EventBrandingPayload | null): EventBranding | null {
if (!raw) {
return null;
}
return {
primaryColor: raw.primary_color ?? '',
secondaryColor: raw.secondary_color ?? '',
backgroundColor: raw.background_color ?? '',
fontFamily: raw.font_family ?? null,
logoUrl: raw.logo_url ?? null,
};
}
interface EventErrorViewProps {
code: FetchEventErrorCode | null;
message: string | null;