pages/ValuePartnership/ValueExcellencePage/ValueExcellencePage.jsxjavascript
import { useState, useEffect } from "react";
import PropTypes from "prop-types";
import { useContent } from "../../../services/content";
import { useAnalytics } from "../../../services/analytics/analytics";
import { Headline } from "../../../components/elements/Headline/Headline";
import { ValueInfographic } from "./ValueInfographic";
import { ValueDriverNav } from "./ValueDriverNav";
import "./ValueExcellencePage.scss";
/**
* Value & Excellence Drivers page, ported from value-excellence-page.js:
* an overview (clickable Venn infographic) that switches to a driver detail
* view. The old page also duplicated the detail solutions as a mobile-only
* accordion (hidden above its "xl" breakpoint via CSS) - this kiosk always
* runs at one large landscape resolution (see presentationModes.js), so only
* the grid variant is ported; the DOM-measurement height hack for the grid
* titles is replaced by CSS Grid's own row-stretching.
*/
export const ValueExcellencePage = ({ onSelectionChange }) => {
const { content } = useContent();
const { drivers = [], labels = {} } = content.valuePartnership || {};
const { trackEvent } = useAnalytics();
const [selectedDriver, setSelectedDriver] = useState(null);
// tells the parent to unmount ValuePartnershipNav while ValueDriverNav
// occupies its slot instead - reset on unmount too, in case the user
// navigates away from the excellence section while a driver is still
// selected (mirrors GlobePage's onSelectionChange)
useEffect(() => {
onSelectionChange?.(!!selectedDriver);
}, [selectedDriver, onSelectionChange]);
useEffect(() => () => onSelectionChange?.(false), [onSelectionChange]);
const handleSelect = (id) => {
const driver = drivers.find((d) => d.id === id);
if (!driver) return;
setSelectedDriver(driver);
trackEvent?.("driver_select", { element: driver.title, payload: { driverId: id } });
};
const handleBack = () => {
setSelectedDriver(null);
trackEvent?.("driver_back_to_overview");
};
if (selectedDriver) {
return (
<div className="value-excellence-page value-excellence-page--detail">
<div className="value-excellence-page__aside">
<img className="value-excellence-page__driver-image" src={selectedDriver.image} alt="" />
<ValueDriverNav
drivers={drivers}
selectedId={selectedDriver.id}
onSelect={handleSelect}
onBack={handleBack}
labels={labels}
/>
</div>
<div className="value-excellence-page__content">
<div className="value-excellence-page__driver-header">
<Headline text={selectedDriver.title} level={1} color="orange" />
<Headline text={selectedDriver.tagline} level={2} />
</div>
<p className="value-excellence-page__description">{selectedDriver.description}</p>
<div className="value-excellence-page__solutions">
{selectedDriver.solutions.map((solution) => (
<div key={solution.title} className="value-excellence-page__solution">
<p className="value-excellence-page__solution-title">{solution.title}</p>
<p className="value-excellence-page__solution-text">{solution.text}</p>
</div>
))}
</div>
</div>
</div>
);
}
return (
<div className="value-excellence-page">
<div className="value-excellence-page__header-container">
<h1 className="value-excellence-page__header">{labels.valueExcellenceHeader}</h1>
</div>
<div className="value-excellence-page__infographic">
<ValueInfographic onSelect={handleSelect} />
</div>
</div>
);
};
ValueExcellencePage.propTypes = {
// called with true while a driver is selected, false once cleared - lets
// the parent unmount ValuePartnershipNav so ValueDriverNav can take its slot
onSelectionChange: PropTypes.func,
};
// also default-exported (alongside the named export above, which the rest
// of the codebase's page components use) so ValuePartnership.jsx can
// React.lazy() it - see the comment there
export default ValueExcellencePage;