pages/ValuePartnership/PartnershipsPage/PartnershipsPage.jsxjavascript
import { useEffect, useState } from "react";
import PropTypes from "prop-types";
import { UIMCButton } from "@ui-marcom/react/button";
import { UIMCIcon } from "@ui-marcom/react/icon";
import { useContent } from "../../../services/content";
import { useAnalytics } from "../../../services/analytics/analytics";
import { CategoryMenu } from "./CategoryMenu";
import { CategoryOverlay } from "./CategoryOverlay";
import { PresentationBrowser } from "./PresentationBrowser";
import { SlideView } from "./SlideView";
import "./PartnershipsPage.scss";
/**
* Value Partnerships page: hospital-department/role browser + presentation
* deck viewer, ported from value-partnerships-page.js. See CategoryMenu,
* CategoryOverlay, PresentationBrowser and SlideView for the individual
* pieces this composes.
*
* @param {Object} props
* @param {function(*): void} [props.onActionsChange] -
* Registers this page's "Show key slides"/"Show all presentations" buttons
* into ValuePartnershipNav's children slot (see ValuePartnership.jsx).
*/
export const PartnershipsPage = ({ onActionsChange }) => {
const { content } = useContent();
const {
partnerships,
partnershipsFilterUS,
partnershipsFilter,
labels = {},
} = content.valuePartnership || {};
const { trackEvent, trackSlideOrStory } = useAnalytics();
const [selectedView, setSelectedView] = useState("departments");
const [selectedCategory, setSelectedCategory] = useState(null);
const [browserMode, setBrowserMode] = useState(null); // null | "all" | "keySlides"
const [hideUS, setHideUS] = useState(false);
const [openSlide, setOpenSlide] = useState(null); // { ppt, initialPage } | null
useEffect(() => {
onActionsChange?.(
<>
<UIMCButton
className="value-partnership-nav__action-button"
variant="standard"
size="medium"
icon="arrow-right-medium"
title="Show key slides"
onClick={() => {
trackEvent?.("browser_mode_select", { element: "Show key slides" });
setBrowserMode("keySlides");
}}>
<UIMCIcon slot="prefix" icon="arrow-right" />
Show key slides
</UIMCButton>
<UIMCButton
className="value-partnership-nav__action-button"
variant="standard"
size="medium"
icon="arrow-right-medium"
title="Show all presentations"
onClick={() => {
trackEvent?.("browser_mode_select", { element: "Show all presentations" });
setBrowserMode("all");
}}>
<UIMCIcon slot="prefix" icon="arrow-right" />
Show all presentations
</UIMCButton>
</>
);
return () => onActionsChange?.(null);
}, [onActionsChange, trackEvent]);
if (!partnerships) return null;
const categories = selectedView === "departments" ? partnerships.buttons : partnerships.roles;
const handleSelectPpt = (ppt, initialPage = 1) => {
setOpenSlide({ ppt, initialPage });
trackSlideOrStory?.(ppt.id || ppt.content, initialPage, { title: ppt.content || ppt.id });
};
return (
<div className="partnerships-page">
<div className="partnerships-page__header">
<h1>{labels.valuePartnershipsHeader}</h1>
<p>{labels.valuePartnershipsHeader2}</p>
</div>
{partnerships.image && (
<div className="partnerships-page__hospital">
<img src={partnerships.image} alt="" />
</div>
)}
<CategoryMenu
selectedView={selectedView}
onViewChange={(view) => {
trackEvent?.("toggle_view", {
element: view === "departments" ? "Departments" : "Roles",
});
setSelectedView(view);
}}
categories={categories}
onSelectCategory={(item) => {
setSelectedCategory(item);
trackEvent?.("category_select", { element: item.title });
}}
labels={labels}
/>
{selectedCategory && (
<CategoryOverlay
category={selectedCategory}
selectedView={selectedView}
ppt={partnerships.ppt}
onSelectPpt={(ppt) => handleSelectPpt(ppt, 1)}
onClose={() => setSelectedCategory(null)}
/>
)}
{browserMode && (
<PresentationBrowser
mode={browserMode}
hideUS={hideUS}
onToggleHideUS={(checked) => {
trackEvent?.("toggle_us_content", { payload: { hidden: checked } });
setHideUS(checked);
}}
linkGroups={(hideUS ? partnershipsFilter : partnershipsFilterUS)?.groups || []}
ppt={partnerships.ppt}
keySlidesOverview={partnerships.keySlides.overview}
keySlidesPpt={partnerships.keySlides.ppt}
onSelectPpt={handleSelectPpt}
onClose={() => {
trackEvent?.("browser_close", { element: browserMode });
setBrowserMode(null);
}}
onSwitchMode={() => {
const nextMode = browserMode === "all" ? "keySlides" : "all";
trackEvent?.("browser_mode_select", {
element: nextMode === "keySlides" ? "Show key slides" : "Show all presentations",
});
setBrowserMode(nextMode);
}}
/>
)}
{openSlide && (
<SlideView
key={openSlide.ppt.id || openSlide.ppt.content}
ppt={openSlide.ppt}
initialPage={openSlide.initialPage}
labels={labels}
onClose={() => {
setOpenSlide(null);
}}
/>
)}
</div>
);
};
PartnershipsPage.propTypes = {
onActionsChange: 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 PartnershipsPage;