Skip to content

Commit a06f39f

Browse files
feat: Phase 7 - Router & App Shell Integration
- Wire up react-router-dom v6 Routes in App.tsx - / redirects to /news/1 - /news/:page, /newest/:page, /show/:page, /ask/:page, /jobs/:page → FeedPage with feedType prop - /item/:id → ItemDetailsPage, /user/:id → UserPage - Theme class on root div from SettingsContext (dynamic: default/night/amoledblack) - SettingsProvider wraps entire app - GA tracking via useLocation hook on route changes - Header + Routes (Outlet equivalent) + Footer layout Co-Authored-By: Vibha Seshadri <vibha.seshadri@cognition.ai>
1 parent f61193d commit a06f39f

1 file changed

Lines changed: 49 additions & 15 deletions

File tree

src/App.tsx

Lines changed: 49 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,57 @@
1-
import { BrowserRouter } from 'react-router-dom';
1+
import { useEffect } from 'react';
2+
import { BrowserRouter, Routes, Route, Navigate, useLocation } from 'react-router-dom';
3+
import { SettingsProvider, useSettings } from './contexts/SettingsContext';
4+
import Header from './components/layout/Header';
5+
import Footer from './components/layout/Footer';
6+
import FeedPage from './pages/FeedPage';
7+
import ItemDetailsPage from './pages/ItemDetailsPage';
8+
import UserPage from './pages/UserPage';
29
import './App.scss';
310

11+
declare function ga(...args: unknown[]): void;
12+
13+
function GATracker() {
14+
const location = useLocation();
15+
useEffect(() => {
16+
if (typeof ga !== 'undefined') {
17+
ga('set', 'page', location.pathname);
18+
ga('send', 'pageview');
19+
}
20+
}, [location]);
21+
return null;
22+
}
23+
24+
function AppShell() {
25+
const { settings } = useSettings();
26+
27+
return (
28+
<div className={settings.theme}>
29+
<div className="body-cover"></div>
30+
<div className="wrapper">
31+
<Header />
32+
<Routes>
33+
<Route path="/" element={<Navigate to="/news/1" replace />} />
34+
<Route path="/news/:page" element={<FeedPage feedType="news" />} />
35+
<Route path="/newest/:page" element={<FeedPage feedType="newest" />} />
36+
<Route path="/show/:page" element={<FeedPage feedType="show" />} />
37+
<Route path="/ask/:page" element={<FeedPage feedType="ask" />} />
38+
<Route path="/jobs/:page" element={<FeedPage feedType="jobs" />} />
39+
<Route path="/item/:id" element={<ItemDetailsPage />} />
40+
<Route path="/user/:id" element={<UserPage />} />
41+
</Routes>
42+
<Footer />
43+
</div>
44+
</div>
45+
);
46+
}
47+
448
function App() {
549
return (
650
<BrowserRouter>
7-
<div className="default">
8-
<div className="body-cover"></div>
9-
<div className="wrapper">
10-
<header id="header">
11-
<h1>Hacker News</h1>
12-
</header>
13-
<main>
14-
<p>React 18 + Vite app shell loaded successfully.</p>
15-
</main>
16-
<footer id="footer">
17-
<p>Built with React</p>
18-
</footer>
19-
</div>
20-
</div>
51+
<SettingsProvider>
52+
<GATracker />
53+
<AppShell />
54+
</SettingsProvider>
2155
</BrowserRouter>
2256
);
2357
}

0 commit comments

Comments
 (0)