Reputation: 336
If date is 1 or 2 days away use color red and green for the next 1 to 2 days after date otherwise black. Is there a better way of doing this
const date = moment(apptDate).isValid() ? moment(apptDate) : '';
const dateMinus1days = date !== '' ? date.subtract(1, 'day').format('MM/DD/YYYY') : null;
const dateMinus2days = date !== '' ? date.subtract(2, 'day').format('MM/DD/YYYY') : null;
const dateAdd1days = date !== '' ? date.add(1, 'day').format('MM/DD/YYYY') : null;
const dateAdd2days = date !== '' ? date.add(2, 'day').format('MM/DD/YYYY') : null;
let color;
if (dateMinus1days && moment().format('MM/DD/YYYY') === dateMinus1days || dateMinus2days && moment().format('MM/DD/YYYY') === dateMinus2days) {
color = 'green'
} else if (dateAdd1days && moment().format('MM/DD/YYYY') === dateAdd1days || dateAdd2days && moment().format('MM/DD/YYYY') === dateAdd2days) {
color = 'red'
} else {
color = 'black'
}
Upvotes: 0
Views: 55
Reputation: 31482
You can use isBetween
that:
Check if a moment is between two other moments, optionally looking at unit scale (minutes, hours, days, etc). The match is exclusive. The first two arguments will be parsed as moments, if not already so.
Your code could be like the following:
const getColor = (apptDate) => {
let color = 'black';
const date = moment(apptDate);
const now = moment();
const inTwoDays = moment().add(2, 'day');
const twoDaysAgo = moment().subtract(2, 'day')
if (date.isValid() && date.isBetween(twoDaysAgo, now, 'day', '[]')) {
color = 'green';
} else if (date.isValid() && date.isBetween(now, inTwoDays, 'day', '[]')) {
color = 'red';
}
return color;
}
[
moment().format(),
moment().add(1, 'day').format(),
moment().add(2, 'day').format(),
moment().add(3, 'day').format(),
moment().subtract(1, 'day').format(),
moment().subtract(2, 'day').format(),
moment().subtract(3, 'day').format(),
'invalid'
].forEach((elem) => {
console.log(elem, getColor(elem));
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>
Upvotes: 3