src/app/legacy/containers/CpsRecommendations/index.jsx

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
import React, { useContext } from 'react';
import { useTheme } from '@emotion/react';
import styled from '@emotion/styled';
import {
  GEL_GROUP_2_SCREEN_WIDTH_MIN,
  GEL_GROUP_3_SCREEN_WIDTH_MIN,
  GEL_GROUP_4_SCREEN_WIDTH_MIN,
} from '#psammead/gel-foundations/src/breakpoints';
import pathOr from 'ramda/src/pathOr';
import path from 'ramda/src/path';
import {
  GEL_SPACING,
  GEL_SPACING_DBL,
  GEL_SPACING_TRPL,
} from '#psammead/gel-foundations/src/spacings';
import SectionLabel from '#psammead/psammead-section-label/src';
import SkipLinkWrapper from '#components/SkipLinkWrapper';
import useToggle from '#hooks/useToggle';
import { GridItemMediumNoMargin } from '#components/Grid';

import { ServiceContext } from '../../../contexts/ServiceContext';
import RecommendationsPromoList from './RecommendationsPromoList';
import RecommendationsPromo from './RecommendationsPromo';
import ErrorBoundary from './ErrorBoundary';

const RecommendationsWrapper = styled.div`
  background-color: ${props => props.theme.palette.GREY_2};
  margin: ${GEL_SPACING_TRPL} 0;
  padding: ${GEL_SPACING_DBL} ${GEL_SPACING};
  @media (min-width: ${GEL_GROUP_2_SCREEN_WIDTH_MIN}) {
    margin: 0 0 ${GEL_SPACING_TRPL};
    padding: 0 ${GEL_SPACING_DBL} ${GEL_SPACING_DBL};
  }
  @media (min-width: ${GEL_GROUP_4_SCREEN_WIDTH_MIN}) {
    margin: 0 0 ${GEL_SPACING_TRPL};
    padding: ${GEL_SPACING_DBL} 0;
  }
`;

const LabelComponent = styled(SectionLabel)`
  margin: 0;
  padding: 0;
  @media (min-width: ${GEL_GROUP_3_SCREEN_WIDTH_MIN}) {
    margin: 0 0 ${GEL_SPACING};
  }
`;

const CpsRecommendations = ({ items = [] }) => {
  const { recommendations, translations, script, service, dir } =
    useContext(ServiceContext);
  const { enabled } = useToggle('cpsRecommendations');

  const labelId = 'recommendations-heading';
  const a11yAttributes = {
    as: 'section',
    role: 'region',
    'aria-labelledby': labelId,
  };
  const {
    palette: { GREY_2 },
  } = useTheme();

  const { hasStoryRecommendations } = recommendations;

  if (!hasStoryRecommendations || !enabled || !items.length) return null;

  const titlePath = ['Recommended stories', ['recommendationTitle']];

  const title = pathOr(...titlePath, translations);

  const { text, endTextVisuallyHidden } = path(['skipLink'], recommendations);

  const terms = {
    '%title%': title,
  };

  const isSinglePromo = items.length === 1;

  const endTextId = `end-of-recommendations`;

  const skipLink = {
    endTextId,
    terms,
    text,
    endTextVisuallyHidden,
  };

  return (
    <ErrorBoundary recommendations={items}>
      <GridItemMediumNoMargin>
        <RecommendationsWrapper data-e2e={labelId} {...a11yAttributes}>
          <SkipLinkWrapper service={service} {...skipLink}>
            {title ? (
              <LabelComponent
                script={script}
                service={service}
                dir={dir}
                labelId={labelId}
                columnType="main"
                mobileDivider={false}
                overrideHeadingAs="strong"
                bar={false}
                backgroundColor={GREY_2}
              >
                {title}
              </LabelComponent>
            ) : null}
            {isSinglePromo ? (
              <RecommendationsPromo promo={items[0]} />
            ) : (
              <RecommendationsPromoList promoItems={items} />
            )}
          </SkipLinkWrapper>
        </RecommendationsWrapper>
      </GridItemMediumNoMargin>
    </ErrorBoundary>
  );
};

export default CpsRecommendations;