pages/ValuePartnership/PartnershipsPage/CategoryMenu.jsxjavascript
import { useState } from "react";
import PropTypes from "prop-types";
import { UIMCButton } from "@ui-marcom/react/button";
import { UIMCIcon } from "@ui-marcom/react/icon";
import { UIMCControlButton } from "@ui-marcom/react/control-button";
import { UIMCToggleButtonSwitch } from "@ui-marcom/react/toggle-button-switch";
import { useAnalytics } from "../../../services/analytics/analytics";
import { useScreensaver } from "../../../services/screensaver";
import "./CategoryMenu.scss";

/**
 * "Choose a category" slide-in side panel, ported from
 * value-partnerships-page.js's .value-categories block: a Departments/Roles
 * switch plus the matching list of clickable category buttons
 * (content.partnerships.buttons or .roles). Same collapsible-drawer pattern
 * as GlobePage's ValueCheckboxPanel - see that component for why the
 * open/collapsed state is local UI state rather than a prop.
 *
 * @param {Object} props
 * @param {"departments"|"roles"} props.selectedView
 * @param {function(string): void} props.onViewChange
 * @param {Array<{id: string, title: string}>} props.categories - Buttons or roles for the current view.
 * @param {function(Object): void} props.onSelectCategory
 * @param {Object} props.labels
 */
export const CategoryMenu = ({
  selectedView,
  onViewChange,
  categories,
  onSelectCategory,
  labels,
}) => {
  const [isOpen, setIsOpen] = useState(true);
  const { trackEvent } = useAnalytics();
  const { showNow } = useScreensaver();

  return (
    <div className={`category-menu${isOpen ? "" : " category-menu--collapsed"}`}>
      <UIMCControlButton
        className="category-menu__toggle"
        variant="primary-content"
        size="medium"
        icon={isOpen ? "arrow-left-large" : "arrow-right-large"}
        title={isOpen ? "Collapse categories" : "Expand categories"}
        onClick={() => setIsOpen((open) => !open)}
      />

      <div className="category-menu__scroll">
        <div className="category-menu__header">
          <p>Choose a Category of Enterprise Solutions</p>
          <UIMCToggleButtonSwitch
            current={selectedView === "departments" ? 0 : 1}
            onChange={(index) => onViewChange(index === 0 ? "departments" : "roles")}
            className="category-menu__toggle-switch">
            <UIMCButton className="category-menu__toggle-switch-button">
              {labels.departments || "Clinical Focus Area"}
            </UIMCButton>
            <UIMCButton className="category-menu__toggle-switch-button">
              {labels.roles || "Roles"}
            </UIMCButton>
          </UIMCToggleButtonSwitch>
        </div>

        <div className="category-menu__items">
          {categories.map((item) => (
            <div
              key={item.id}
              className="category-menu__item"
              onClick={() => onSelectCategory(item)}>
              <span className="category-menu__item-title">{item.title}</span>
              <UIMCControlButton
                className="category-menu__item-button"
                icon="arrow-right-medium"
                title={item.title}
              />
            </div>
          ))}
        </div>
      </div>

      <div className="category-menu__footer">
        <UIMCButton
          className="category-menu__footer-button"
          variant="standard"
          title="Screensaver"
          onClick={() => {
            trackEvent?.("navigation_click", { element: "Screensaver" });
            showNow();
          }}>
          <UIMCIcon slot="prefix" icon="play" />
          Screensaver
        </UIMCButton>
      </div>
    </div>
  );
};

CategoryMenu.propTypes = {
  selectedView: PropTypes.oneOf(["departments", "roles"]).isRequired,
  onViewChange: PropTypes.func.isRequired,
  categories: PropTypes.arrayOf(
    PropTypes.shape({ id: PropTypes.string.isRequired, title: PropTypes.string.isRequired })
  ).isRequired,
  onSelectCategory: PropTypes.func.isRequired,
  labels: PropTypes.object.isRequired,
};