Skip to content

Commit 764aebb

Browse files
committed
Maintenance Page Cleanup
Moved it into the react app instead of a separate html file.
1 parent 36611ca commit 764aebb

9 files changed

Lines changed: 110 additions & 86 deletions

File tree

.env.example

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ VITE_REPORT_WMS_LAYER=<report wms layer url>
6161
VITE_BCEID_REGISTER_URL=<URL for BCeID basic registration page>
6262
VITE_FROM_EMAIL=<default from address for outgoing emails>
6363
VITE_LEGACY_URL=<legacy URL for the old DriveBC site>
64+
VITE_MAINTENANCE_MODE=<true/false to indicate if site is in maintenance mode>
6465

6566
# API
6667
DRIVEBC_INLAND_FERRY_API_BASE_URL=<inland ferry api url>

compose/frontend/default_maintenance.txt

Lines changed: 0 additions & 59 deletions
This file was deleted.

compose/frontend/generate-config.sh

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,6 @@ mkdir -p "${SHARED_CONFIG}/NGINX_CONFIG"
1212
SITE_ASSETS="${SHARED_CONFIG}/SITE_ASSETS"
1313
NGINX_CONFIG="${SHARED_CONFIG}/NGINX_CONFIG"
1414

15-
# --- Maintenance Mode Check ---
16-
if [ "$MAINTENANCE_MODE" = "true" ]; then
17-
echo "Maintenance mode is enabled."
18-
cp /etc/nginx/default_maintenance.txt "${NGINX_CONFIG}/default.conf"
19-
exit 0
20-
fi
21-
2215
echo "Copying /usr/share/nginx/html/ to ${SITE_ASSETS}..."
2316
cp -r /usr/share/nginx/html/* "${SITE_ASSETS}/"
2417

src/frontend/src/App.jsx

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ import Header from './Components/shared/header/Header';
4444
import MapPage from './pages/MapPage';
4545
import AuthModal from './AuthModal';
4646
// import ConsentModal from "./ConsentModal";
47+
import MaintenancePage from './pages/MaintenancePage';
4748
import NotFoundPage from './pages/NotFoundPage';
4849
import ProblemsPage from './pages/ProblemsPage';
4950
import ReportElectricalPage from './pages/ReportElectricalPage';
@@ -280,24 +281,29 @@ function App() {
280281

281282
/* Rendering */
282283
// Main component
284+
const isMaintenanceMode = window.MAINTENANCE_MODE === 'true' || window.MAINTENANCE_MODE === true;
285+
283286
return (
284287
<AuthContext.Provider value={{ authContext, setAuthContext }}>
285288
<MapContext.Provider value={{ mapContext, setMapContext }}>
286289
<CamsContext.Provider value={{ camsContext, setCamsContext }}>
287290
<AlertContext.Provider value={{ alertMessage, setAlertMessage }}>
288291
<CMSContext.Provider value={{ cmsContext, setCMSContext }}>
289292
<EmergencyAlertContext.Provider value={{ emergencyAlertContext, setEmergencyAlertContext }}>
290-
<FeatureContext.Provider value={{ featureContext, setFeatureContext }}>
291-
<FilterContext.Provider value={{ filterContext, setFilterContext }}>
292-
<div className="App">
293-
<Header />
294-
295-
<EmergencyAlert />
293+
<FeatureContext.Provider value={{ featureContext, setFeatureContext }}>
294+
<FilterContext.Provider value={{ filterContext, setFilterContext }}>
295+
296+
<div className="App">
297+
<Header isMaintenance={isMaintenanceMode} />
296298

297-
<main id='main'>
299+
{!isMaintenanceMode && <EmergencyAlert />}
298300

299-
<ScrollToTop />
301+
<main id='main'>
302+
<ScrollToTop />
300303

304+
{isMaintenanceMode ? (
305+
<MaintenancePage />
306+
) : (
301307
<Routes>
302308
<Route path="/" element={<MapPage />} />
303309
<Route path="/my-cameras" element={<SavedCamerasPage />} />
@@ -315,24 +321,22 @@ function App() {
315321
<Route path="/feedback" element={<FeedbackPage />} />
316322
<Route path="/verify-email" element={<VerifyEmailPage />} />
317323
<Route path="/emergency-alert-detail/:slug" element={<EmergencyAlertDetail />} />
318-
{/* Catch-all route for 404 errors */}
319324
<Route path="*" element={<NotFoundPage />} />
320325
<Route path="/problems" element={<ProblemsPage />} />
321326
<Route path="/website-problem" element={<div>Website Problem or Suggestion Page</div>} />
322327
<Route path="/highway-problem" element={<ReportRoadPage />} />
323328
<Route path="/road-electrical-problem" element={<ReportElectricalPage />} />
324329
</Routes>
330+
)}
331+
</main>
325332

326-
</main>
327-
328-
<AuthModal />
329-
330-
<Alert alertMessage={alertMessage} closeAlert={() => setAlertMessage(null)} />
333+
<AuthModal />
334+
<Alert alertMessage={alertMessage} closeAlert={() => setAlertMessage(null)} />
335+
<Survey />
336+
</div>
331337

332-
<Survey />
333-
</div>
334-
</FilterContext.Provider>
335-
</FeatureContext.Provider>
338+
</FilterContext.Provider>
339+
</FeatureContext.Provider>
336340
</EmergencyAlertContext.Provider>
337341
</CMSContext.Provider>
338342
</AlertContext.Provider>

src/frontend/src/Components/shared/header/Header.jsx

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,32 @@ import logo from '../../..//images/dbc-header-logo.svg';
3232
// Styling
3333
import './Header.scss';
3434

35-
export default function Header() {
35+
export default function Header({ isMaintenance }) {
3636
/* Setup */
3737
// Misc
3838
const xLargeScreen = useMediaQuery('only screen and (min-width : 1200px)');
39-
const smallScreen = useMediaQuery('only screen and (max-width: 575px)');
4039

40+
if (isMaintenance) {
41+
return (
42+
<header className="maintenance-header"> {/* Added class here */}
43+
<Navbar expand="xl">
44+
<Container>
45+
<div className='header'>
46+
<div className='header-left'>
47+
<Navbar.Brand href="/">
48+
<img className="header-logo" src={logo} alt="Government of British Columbia" />
49+
</Navbar.Brand>
50+
{/* Ensure the divider shows even in maintenance if screen is large */}
51+
<div className="nav-divider"></div>
52+
</div>
53+
</div>
54+
</Container>
55+
</Navbar>
56+
</header>
57+
);
58+
}
59+
60+
const smallScreen = useMediaQuery('only screen and (max-width: 575px)');
4161
// Check current page location
4262
const location = useLocation();
4363
const showSearch = ['/cameras', '/delays'].some(path => location.pathname.startsWith(path)) || location.pathname === '/';

src/frontend/src/Components/shared/header/Header.scss

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -491,3 +491,21 @@
491491
}
492492
}
493493
}
494+
495+
.maintenance-header {
496+
.navbar {
497+
.header-left {
498+
padding: 10px 0 10px 20px;
499+
500+
@media (min-width: 1200px) {
501+
padding-left: 0;
502+
}
503+
}
504+
505+
.nav-divider {
506+
@media (min-width: 1200px) {
507+
display: block;
508+
}
509+
}
510+
}
511+
}

src/frontend/src/env.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,4 @@ export const DEPLOYMENT_TAG = `${getEnv('DEPLOYMENT_TAG')}`;
2525
export const RELEASE = `${getEnv('RELEASE')}`;
2626
export const FROM_EMAIL = `${getEnv('FROM_EMAIL')}`;
2727
export const LEGACY_URL = `${getEnv('LEGACY_URL')}`;
28+
export const MAINTENANCE_MODE = `${getEnv('MAINTENANCE_MODE')}`;
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// React
2+
import React from 'react';
3+
4+
// Internal imports
5+
import Footer from '../Footer';
6+
7+
// Styling
8+
import './MaintenancePage.scss';
9+
10+
export default function MaintenancePage() {
11+
document.title = 'DriveBC - Maintenance';
12+
13+
return (
14+
<div className='maintenance-page'>
15+
{/* Changed from Container to div */}
16+
<div className='text-container'>
17+
<h1>DriveBC is currently down for maintenance</h1>
18+
<p>We're working on getting the site back up again as soon as possible.</p>
19+
<p>In the meantime, please visit the <a href="https://twitter.com/DriveBC" rel="noreferrer" target="_blank" alt="Twitter" > DriveBC X (Twitter)</a> page for updates.</p>
20+
</div>
21+
22+
<Footer />
23+
</div>
24+
);
25+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
@import "../styles/variables.scss";
2+
3+
.maintenance-page {
4+
.text-container {
5+
max-width: 50rem;
6+
margin: 50px auto;
7+
padding: 0 15px;
8+
9+
color: $BC-Blue;
10+
11+
h1, p {
12+
color: inherit;
13+
margin-bottom: 15px;
14+
}
15+
16+
a {
17+
color: inherit;
18+
margin-right: 1rem;
19+
}
20+
}
21+
}

0 commit comments

Comments
 (0)