FormattedDistanceDate.jsx 1.5 KB

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