src/app/components/MediaLoader/Placeholder/PlayButton/index.tsx

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
/** @jsx jsx */
import { jsx } from '@emotion/react';

import { mediaIcons } from '#psammead/psammead-assets/src/svgs';
import styles from './index.styles';
import VisuallyHiddenText from '../../../VisuallyHiddenText';

type Props = {
  className?: string;
  datetime?: string;
  duration?: string;
  durationSpoken?: string;
  type?: string;
  title?: string;
  onClick: () => void;
  guidanceMessage?: string | null;
};

const PlayButton = ({
  className = '',
  datetime,
  duration,
  durationSpoken,
  type = 'video',
  title = '',
  onClick,
  guidanceMessage,
}: Props) => {
  const hiddenText = `${guidanceMessage || ''} Play ${type}, ${
    datetime && duration && durationSpoken
      ? `"${title}", ${durationSpoken}`
      : `"${title}"`
  } `.trim();

  const hasDateTimeDuration = datetime && duration && durationSpoken;

  return (
    <button
      type="button"
      css={styles.button}
      onClick={onClick}
      {...(className && { className })}
    >
      <VisuallyHiddenText>{hiddenText}</VisuallyHiddenText>
      <div
        css={[
          styles.iconWrapper,
          hasDateTimeDuration && styles.iconWrapperWithDate,
        ]}
        aria-hidden="true"
      >
        {mediaIcons?.[type as keyof typeof mediaIcons]}
      </div>
      {datetime && duration && durationSpoken && (
        <time
          css={styles.timeDuration}
          dateTime={datetime}
          aria-hidden="true"
          suppressHydrationWarning
        >
          {duration}
        </time>
      )}
    </button>
  );
};

export default PlayButton;