Files
Portfolio/src/App.tsx.bak
damjan_savicandClaude Opus 4.5 b1ec7b4d61 Migrate from Vite to Next.js 15 with SSR
- Replace Vite + React Router with Next.js 15 App Router
- Implement i18n with next-intl (URL-based: /de, /en, /sr)
- Add SSR/SSG for all pages (48 static pages generated)
- Setup Supabase SSR client for auth
- Migrate all pages: Home, About, Portfolio, Blog, Contact, Login, Dashboard, Imprint, Privacy, Terms
- Add Docker support with standalone output
- Replace i18next with next-intl JSON translations
- Use next/image for optimized images

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-17 01:00:33 +01:00

64 lines
2.0 KiB
Plaintext

// App.tsx
import { useEffect, Suspense } from 'react';
import { BrowserRouter, useLocation } from 'react-router-dom';
import { HelmetProvider } from 'react-helmet-async';
import Layout from './components/Layout';
import AppRoutes from './routes';
import ErrorBoundary from './components/ErrorBoundary';
import CookieBanner from './components/CookieBanner';
import PageTransition from './components/PageTransition';
import { ScrollProvider } from './components/ScrollContext';
import DebugOverlay from './components/DebugOverlay';
import { logPageView, isCookieCategoryEnabled } from './utils/analytics';
import { useScrollTracking } from './hooks/useScrollTracking';
import './styles/scrollbar.css';
// RouteTracker Component für präzises Seiten-Tracking - aber nur mit Zustimmung
const RouteTracker = () => {
const location = useLocation();
// Scroll tracking aktivieren
useScrollTracking();
useEffect(() => {
// Nur tracken, wenn die Analytics-Cookies akzeptiert wurden
if (isCookieCategoryEnabled('analytics')) {
logPageView();
}
}, [location]);
return null;
};
function App() {
useEffect(() => {
// Benutzerdefiniertes Scrollbar-Styling aktivieren
document.documentElement.classList.add('custom-scrollbar');
}, []);
return (
<HelmetProvider>
<ErrorBoundary>
<BrowserRouter future={{ v7_startTransition: true, v7_relativeSplatPath: true }}>
<ScrollProvider>
<Suspense fallback={<div />}>
<PageTransition>
<Layout>
<ErrorBoundary>
<RouteTracker /> {/* Tracking nur mit Zustimmung */}
<AppRoutes />
</ErrorBoundary>
<CookieBanner />
<DebugOverlay />
</Layout>
</PageTransition>
</Suspense>
</ScrollProvider>
</BrowserRouter>
</ErrorBoundary>
</HelmetProvider>
);
}
export default App;