FormattedDistanceDate.jsx 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. import React from 'react';
  2. import { differenceInSeconds, format, formatDistanceStrict } from 'date-fns';
  3. import PropTypes from 'prop-types';
  4. import { UncontrolledTooltip } from 'reactstrap';
  5. const FormattedDistanceDate = (props) => {
  6. // cast to date if string
  7. const date =
  8. typeof props.date === 'string' ? new Date(props.date) : props.date;
  9. const baseDate = props.baseDate || new Date();
  10. const dateFormatted = format(date, 'yyyy/MM/dd HH:mm');
  11. const diff = Math.abs(differenceInSeconds(date, baseDate));
  12. if (diff > props.differenceForAvoidingFormat) {
  13. return <>{dateFormatted}</>;
  14. }
  15. const elemId = `grw-fdd-${props.id}`;
  16. return (
  17. <>
  18. <span id={elemId}>{formatDistanceStrict(date, baseDate)}</span>
  19. {props.isShowTooltip && (
  20. <UncontrolledTooltip placement="bottom" fade={false} target={elemId}>
  21. {dateFormatted}
  22. </UncontrolledTooltip>
  23. )}
  24. </>
  25. );
  26. };
  27. FormattedDistanceDate.propTypes = {
  28. id: PropTypes.string.isRequired,
  29. date: PropTypes.oneOfType([PropTypes.string, PropTypes.instanceOf(Date)])
  30. .isRequired,
  31. baseDate: PropTypes.instanceOf(Date),
  32. // the number(sec) from 'baseDate' to avoid format
  33. differenceForAvoidingFormat: PropTypes.number,
  34. isShowTooltip: PropTypes.bool,
  35. };
  36. FormattedDistanceDate.defaultProps = {
  37. differenceForAvoidingFormat: 86400 * 3,
  38. isShowTooltip: true,
  39. };
  40. export default FormattedDistanceDate;