Source

PresentationalComponents/ComplianceRoute/ComplianceRoute.js

import React, { useEffect } from 'react';
import propTypes from 'prop-types';
import { useLocation, matchPath } from 'react-router-dom';
import { WithPermission } from 'PresentationalComponents';
import useDocumentTitle from 'Utilities/hooks/useDocumentTitle';

/**
 * This is component renders "routes" in Routes.js
 *
 *  @param   {object}             props                     Component props
 *  @param   {React.ReactElement} props.component           Component to render
 *  @param   {string}             props.title               Title to set as browser title
 *  @param   {string}             props.path                Path of the route
 *  @param   {Array}              props.requiredPermissions An array of RBAC permissions required to render the component
 *  @param   {object}             props.props               Props for the component to render
 *
 *  @returns {React.ReactElement}                           Returns the component for this route
 *
 *  @category    Compliance
 *  @subcategory Components
 *
 */
const ComplianceRoute = (props) => {
  const {
    component: Component,
    path,
    props: propsProp,
    title,
    requiredPermissions,
  } = props;
  const location = useLocation();
  const setTitle = useDocumentTitle();
  const isCurrent = !!matchPath({ path, end: true }, location.pathname);

  const requiresTitleEntity = title.includes('$entityTitle');
  const componentProps = {
    ...propsProp,
    route: { ...props, isCurrent, setTitle },
  };

  useEffect(() => {
    isCurrent && !requiresTitleEntity && setTitle(title);
  }, []);

  return requiredPermissions ? (
    <WithPermission requiredPermissions={requiredPermissions}>
      <Component {...componentProps} />
    </WithPermission>
  ) : (
    <Component {...componentProps} />
  );
};

ComplianceRoute.propTypes = {
  component: propTypes.node,
  modal: propTypes.bool,
  path: propTypes.string,
  props: propTypes.object,
  title: propTypes.string,
  requiredPermissions: propTypes.array,
};

export default ComplianceRoute;