FormattedDistanceDate.jsx 1.3 KB

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