Home Reference Source

src/components/layout/Header/HeaderShape/index.js

import React from 'react';
import { connect } from 'react-redux';

import getStyles from './styles';

import languages from '../../../../fixtures/languages';

/**
 * A header shape component that displays the header curve svg.
 * @param {Object} props - React Component props.
 * @param {string} props.headerHeight - The header height metric mapped from Redux store.
 * @param {string} props.lang - Language identifier mapped from Redux store.
 * @param {string} props.windowWidth - The window width metric mapped from Redux store.
 * @return {React.Component}
 */
export function HeaderShape({ headerHeight, lang, windowWidth }) {
  const { className, styles } = getStyles({ headerHeight });
  let startCurve = ((windowWidth / 3) - headerHeight);

  if (startCurve < headerHeight) startCurve = headerHeight;
  if (startCurve > (headerHeight * 4)) startCurve = (headerHeight * 4);

  const path = (!languages[lang].rtl) ? `M 0,0
    V ${headerHeight}
    H ${startCurve}
    C ${(startCurve + headerHeight)},${headerHeight} ${(startCurve + headerHeight)},${(headerHeight / 2)}  ${(startCurve + (headerHeight * 2))},${(headerHeight / 2)}
    H ${windowWidth}
    V 0
    H 0` : `M ${windowWidth},0
    V ${headerHeight}
    H ${(windowWidth - startCurve)}
    C ${(windowWidth - startCurve - headerHeight)},${headerHeight} ${(windowWidth - startCurve - headerHeight)},${(headerHeight / 2)}  ${(windowWidth - startCurve - (headerHeight * 2))},${(headerHeight / 2)}
    H 0
    V 0
    H ${windowWidth}`;

  return <svg className={ className }><path className={ className } d={ path } />{ styles }</svg>;
}

export default connect(state => ({
  headerHeight: state.ui.metrics.headerHeight,
  lang: state.settings.lang,
  windowWidth: state.ui.metrics.windowWidth,
}), null)(HeaderShape);