date-fns#isSameDay JavaScript Examples
The following examples show how to use
date-fns#isSameDay.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: common-functions.js From covid19Nepal-react with MIT License | 6 votes |
parseTotalTestTimeseries = (data) => {
const testTimseries = [];
const today = getNepalDay();
data.forEach((d) => {
const date = parse(
d.updatetimestamp.split(' ')[0],
'dd/MM/yyyy',
new Date()
);
const totaltested = +d.totalsamplestested;
if (isBefore(date, today) && totaltested) {
let dailytested;
if (testTimseries.length) {
const prev = testTimseries[testTimseries.length - 1];
if (isSameDay(date, prev.date)) {
prev.dailytested += totaltested - prev.totaltested;
prev.totaltested = totaltested;
} else {
if (differenceInDays(date, prev.date) === 1)
dailytested = totaltested - prev.totaltested;
else dailytested = NaN;
}
} else dailytested = NaN;
testTimseries.push({
date: date,
totaltested: totaltested,
dailytested: dailytested,
});
}
});
return testTimseries;
}
Example #2
Source File: common-functions.js From covid19Nepal-react with MIT License | 6 votes |
mergeTimeseries = (ts1, ts2) => {
const tsRet = Object.assign({}, ts1);
for (const state in ts1) {
if (ts1.hasOwnProperty(state)) {
tsRet[state] = ts1[state].map((d1) => {
const testData = ts2[state].find((d2) => isSameDay(d1.date, d2.date));
return {
totaltested: testData?.totaltested,
dailytested: testData?.dailytested,
...d1,
};
});
}
}
return tsRet;
}
Example #3
Source File: DatePickerCalendar.js From react-nice-dates with MIT License | 6 votes |
export default function DatePickerCalendar({
locale,
date: selectedDate,
month: receivedMonth,
onDateChange,
onMonthChange,
minimumDate,
maximumDate,
modifiers: receivedModifiers,
modifiersClassNames,
weekdayFormat,
touchDragEnabled
}) {
const isSelected = date => isSameDay(date, selectedDate) && isSelectable(date, { minimumDate, maximumDate })
const modifiers = mergeModifiers({ selected: isSelected, disabled: isSelected }, receivedModifiers)
const [month, setMonth] = useControllableState(receivedMonth, onMonthChange, startOfMonth(selectedDate || new Date()))
const handleDateChange = date => {
onDateChange(selectedDate ? setTime(date, selectedDate) : date)
}
return (
<Calendar
locale={locale}
month={month}
onMonthChange={setMonth}
onDayClick={handleDateChange}
minimumDate={minimumDate}
maximumDate={maximumDate}
modifiers={modifiers}
modifiersClassNames={modifiersClassNames}
weekdayFormat={weekdayFormat}
touchDragEnabled={touchDragEnabled}
/>
)
}
Example #4
Source File: CalendarExample.js From react-nice-dates with MIT License | 6 votes |
export default function CalendarExample() {
const [selectedDates, setSelectedDates] = useState([])
const modifiers = {
selected: date => selectedDates.some(selectedDate => isSameDay(selectedDate, date))
}
const handleDayClick = date => {
setSelectedDates([...selectedDates, date])
}
return (
<Example code={code}>
<Calendar onDayClick={handleDayClick} modifiers={modifiers} locale={enGB} />
</Example>
)
}
Example #5
Source File: DateFilter.js From umami with MIT License | 6 votes |
CustomRange = ({ startDate, endDate, onClick }) => {
const { locale } = useLocale();
function handleClick(e) {
e.stopPropagation();
onClick();
}
return (
<>
<Icon icon={<Calendar />} className="mr-2" onClick={handleClick} />
{dateFormat(startDate, 'd LLL y', locale)}
{!isSameDay(startDate, endDate) && ` — ${dateFormat(endDate, 'd LLL y', locale)}`}
</>
);
}
Example #6
Source File: datePicker.js From taskforce-fe-components with Mozilla Public License 2.0 | 5 votes |
DateTimePicker = ({ startDate, maxDate, onChange }) => {
const computeMinTime = (date) => {
if (!maxDate) {
return;
}
if (isSameDay(date, maxDate)) {
return setHours(setMinutes(new Date(), 0), 0);
}
};
const computeMaxTime = (date) => {
if (!maxDate) {
return;
}
if (isSameDay(date, maxDate)) {
return maxDate;
}
};
const [minTime, setMinTime] = useState(
computeMinTime(startDate || new Date())
);
const [maxTime, setMaxTime] = useState(
computeMaxTime(startDate || new Date())
);
const handleDatetimeChange = (date) => {
setMinTime(computeMinTime(date));
setMaxTime(computeMaxTime(date));
onChange(date);
};
return (
<ReactDatePicker
customInput={<CustomInput />}
placeholderText={"Introdu data si ora"}
selected={startDate}
onChange={handleDatetimeChange}
locale={ro}
dateFormat={"d MMMM yyyy HH:mm"}
showTimeSelect
timeFormat="HH:mm"
timeIntervals={15}
timeCaption="Ora"
maxDate={maxDate}
minTime={minTime}
maxTime={maxTime}
/>
);
}
Example #7
Source File: MonthView.js From react-horizontal-datepicker with MIT License | 5 votes |
MonthView = ({startDate, lastDate, selectDate, getSelectedDay, primaryColor, labelFormat}) => {
const [selectedDate, setSelectedDate] = useState(null);
const rgb = primaryColor.replace(/[^\d,]/g, '').split(',');
const brightness = Math.round(((parseInt(rgb[0]) * 299) +
(parseInt(rgb[1]) * 587) +
(parseInt(rgb[2]) * 114)) / 1000);
const textColour = (brightness > 125) ? 'black' : 'white';
const selectedStyle = {borderRadius:"0.7rem",background:`${primaryColor}`, color: textColour};
const getStyles = (day) => {
return isSameDay(day, selectedDate)?selectedStyle:null;
};
const getId = (day) => {
return isSameDay(day, selectedDate)?'selected':"";
};
const renderDays = () => {
const months = [];
for (let i = 0; i <= differenceInMonths(lastDate, startDate); i++) {
const month = startOfMonth(addMonths(startDate, i));
months.push(
<div id={`${getId(month)}`}
className={styles.monthContainer}
key={month}
style={getStyles(month)}
onClick={() => onDateClick(month)}
>
<span className={styles.monthYearLabel}>
{format(month, labelFormat || "MMMM yyyy")}
</span>
</div>
);
}
return <div id={"container"} className={styles.dateListScrollable}>{months}</div>;
}
const onDateClick = day => {
setSelectedDate(day);
if (getSelectedDay) {
getSelectedDay(day);
}
};
useEffect(() => {
if (getSelectedDay) {
if (selectDate) {
getSelectedDay(selectDate);
} else {
getSelectedDay(startDate);
}
}
}, []);
useEffect(() => {
if (selectDate) {
if (!isSameDay(selectedDate, selectDate)) {
setSelectedDate(selectDate);
setTimeout(() => {
let view = document.getElementById('selected');
if (view) {
view.scrollIntoView({behavior: "smooth", inline: "center", block: "nearest"});
}
}, 20);
}
}
}, [selectDate]);
return <React.Fragment>{renderDays()}</React.Fragment>
}
Example #8
Source File: Calendar.js From umami with MIT License | 5 votes |
DaySelector = ({ date, minDate, maxDate, locale, onSelect }) => {
const dateLocale = getDateLocale(locale);
const weekStartsOn = dateLocale?.options?.weekStartsOn || 0;
const startWeek = startOfWeek(date, {
locale: dateLocale,
weekStartsOn,
});
const startMonth = startOfMonth(date);
const startDay = subDays(startMonth, startMonth.getDay() - weekStartsOn);
const month = date.getMonth();
const year = date.getFullYear();
const daysOfWeek = [];
for (let i = 0; i < 7; i++) {
daysOfWeek.push(addDays(startWeek, i));
}
const days = [];
for (let i = 0; i < 35; i++) {
days.push(addDays(startDay, i));
}
return (
<table>
<thead>
<tr>
{daysOfWeek.map((day, i) => (
<th key={i} className={locale}>
{dateFormat(day, 'EEE', locale)}
</th>
))}
</tr>
</thead>
<tbody>
{chunk(days, 7).map((week, i) => (
<tr key={i}>
{week.map((day, j) => {
const disabled = isBefore(day, minDate) || isAfter(day, maxDate);
return (
<td
key={j}
className={classNames({
[styles.selected]: isSameDay(date, day),
[styles.faded]: day.getMonth() !== month || day.getFullYear() !== year,
[styles.disabled]: disabled,
})}
onClick={!disabled ? () => onSelect(day) : null}
>
{day.getDate()}
</td>
);
})}
</tr>
))}
</tbody>
</table>
);
}
Example #9
Source File: DatePickerForm.js From umami with MIT License | 5 votes |
export default function DatePickerForm({
startDate: defaultStartDate,
endDate: defaultEndDate,
minDate,
maxDate,
onChange,
onClose,
}) {
const [selected, setSelected] = useState(
isSameDay(defaultStartDate, defaultEndDate) ? FILTER_DAY : FILTER_RANGE,
);
const [date, setDate] = useState(defaultStartDate);
const [startDate, setStartDate] = useState(defaultStartDate);
const [endDate, setEndDate] = useState(defaultEndDate);
const disabled =
selected === FILTER_DAY
? isAfter(minDate, date) && isBefore(maxDate, date)
: isAfter(startDate, endDate);
const buttons = [
{
label: <FormattedMessage id="label.single-day" defaultMessage="Single day" />,
value: FILTER_DAY,
},
{
label: <FormattedMessage id="label.date-range" defaultMessage="Date range" />,
value: FILTER_RANGE,
},
];
function handleSave() {
if (selected === FILTER_DAY) {
onChange({ ...getDateRangeValues(date, date), value: 'custom' });
} else {
onChange({ ...getDateRangeValues(startDate, endDate), value: 'custom' });
}
}
return (
<div className={styles.container}>
<div className={styles.filter}>
<ButtonGroup size="small" items={buttons} selectedItem={selected} onClick={setSelected} />
</div>
<div className={styles.calendars}>
{selected === FILTER_DAY ? (
<Calendar date={date} minDate={minDate} maxDate={maxDate} onChange={setDate} />
) : (
<>
<Calendar
date={startDate}
minDate={minDate}
maxDate={endDate}
onChange={setStartDate}
/>
<Calendar date={endDate} minDate={startDate} maxDate={maxDate} onChange={setEndDate} />
</>
)}
</div>
<FormButtons>
<Button variant="action" onClick={handleSave} disabled={disabled}>
<FormattedMessage id="label.save" defaultMessage="Save" />
</Button>
<Button onClick={onClose}>
<FormattedMessage id="label.cancel" defaultMessage="Cancel" />
</Button>
</FormButtons>
</div>
);
}
Example #10
Source File: index.js From whaticket with MIT License | 4 votes |
MessagesList = ({ ticketId, isGroup }) => {
const classes = useStyles();
const [messagesList, dispatch] = useReducer(reducer, []);
const [pageNumber, setPageNumber] = useState(1);
const [hasMore, setHasMore] = useState(false);
const [loading, setLoading] = useState(false);
const lastMessageRef = useRef();
const [selectedMessage, setSelectedMessage] = useState({});
const [anchorEl, setAnchorEl] = useState(null);
const messageOptionsMenuOpen = Boolean(anchorEl);
const currentTicketId = useRef(ticketId);
useEffect(() => {
dispatch({ type: "RESET" });
setPageNumber(1);
currentTicketId.current = ticketId;
}, [ticketId]);
useEffect(() => {
setLoading(true);
const delayDebounceFn = setTimeout(() => {
const fetchMessages = async () => {
try {
const { data } = await api.get("/messages/" + ticketId, {
params: { pageNumber },
});
if (currentTicketId.current === ticketId) {
dispatch({ type: "LOAD_MESSAGES", payload: data.messages });
setHasMore(data.hasMore);
setLoading(false);
}
if (pageNumber === 1 && data.messages.length > 1) {
scrollToBottom();
}
} catch (err) {
setLoading(false);
toastError(err);
}
};
fetchMessages();
}, 500);
return () => {
clearTimeout(delayDebounceFn);
};
}, [pageNumber, ticketId]);
useEffect(() => {
const socket = openSocket();
socket.on("connect", () => socket.emit("joinChatBox", ticketId));
socket.on("appMessage", (data) => {
if (data.action === "create") {
dispatch({ type: "ADD_MESSAGE", payload: data.message });
scrollToBottom();
}
if (data.action === "update") {
dispatch({ type: "UPDATE_MESSAGE", payload: data.message });
}
});
return () => {
socket.disconnect();
};
}, [ticketId]);
const loadMore = () => {
setPageNumber((prevPageNumber) => prevPageNumber + 1);
};
const scrollToBottom = () => {
if (lastMessageRef.current) {
lastMessageRef.current.scrollIntoView({});
}
};
const handleScroll = (e) => {
if (!hasMore) return;
const { scrollTop } = e.currentTarget;
if (scrollTop === 0) {
document.getElementById("messagesList").scrollTop = 1;
}
if (loading) {
return;
}
if (scrollTop < 50) {
loadMore();
}
};
const handleOpenMessageOptionsMenu = (e, message) => {
setAnchorEl(e.currentTarget);
setSelectedMessage(message);
};
const handleCloseMessageOptionsMenu = (e) => {
setAnchorEl(null);
};
const checkMessageMedia = (message) => {
if(message.mediaType === "location" && message.body.split('|').length >= 2) {
let locationParts = message.body.split('|')
let imageLocation = locationParts[0]
let linkLocation = locationParts[1]
let descriptionLocation = null
if(locationParts.length > 2)
descriptionLocation = message.body.split('|')[2]
return <LocationPreview image={imageLocation} link={linkLocation} description={descriptionLocation} />
}
else if (message.mediaType === "vcard") {
//console.log("vcard")
//console.log(message)
let array = message.body.split("\n");
let obj = [];
let contact = "";
for (let index = 0; index < array.length; index++) {
const v = array[index];
let values = v.split(":");
for (let ind = 0; ind < values.length; ind++) {
if (values[ind].indexOf("+") !== -1) {
obj.push({ number: values[ind] });
}
if (values[ind].indexOf("FN") !== -1) {
contact = values[ind + 1];
}
}
}
return <VcardPreview contact={contact} numbers={obj[0].number} />
}
/*else if (message.mediaType === "multi_vcard") {
console.log("multi_vcard")
console.log(message)
if(message.body !== null && message.body !== "") {
let newBody = JSON.parse(message.body)
return (
<>
{
newBody.map(v => (
<VcardPreview contact={v.name} numbers={v.number} />
))
}
</>
)
} else return (<></>)
}*/
else if (message.mediaType === "image") {
return <ModalImageCors imageUrl={message.mediaUrl} />;
} else if (message.mediaType === "audio") {
return (
<audio controls>
<source src={message.mediaUrl} type="audio/ogg"></source>
</audio>
);
} else if (message.mediaType === "video") {
return (
<video
className={classes.messageMedia}
src={message.mediaUrl}
controls
/>
);
} else {
return (
<>
<div className={classes.downloadMedia}>
<Button
startIcon={<GetApp />}
color="primary"
variant="outlined"
target="_blank"
href={message.mediaUrl}
>
Download
</Button>
</div>
<Divider />
</>
);
}
};
const renderMessageAck = (message) => {
if (message.ack === 0) {
return <AccessTime fontSize="small" className={classes.ackIcons} />;
}
if (message.ack === 1) {
return <Done fontSize="small" className={classes.ackIcons} />;
}
if (message.ack === 2) {
return <DoneAll fontSize="small" className={classes.ackIcons} />;
}
if (message.ack === 3 || message.ack === 4) {
return <DoneAll fontSize="small" className={classes.ackDoneAllIcon} />;
}
};
const renderDailyTimestamps = (message, index) => {
if (index === 0) {
return (
<span
className={classes.dailyTimestamp}
key={`timestamp-${message.id}`}
>
<div className={classes.dailyTimestampText}>
{format(parseISO(messagesList[index].createdAt), "dd/MM/yyyy")}
</div>
</span>
);
}
if (index < messagesList.length - 1) {
let messageDay = parseISO(messagesList[index].createdAt);
let previousMessageDay = parseISO(messagesList[index - 1].createdAt);
if (!isSameDay(messageDay, previousMessageDay)) {
return (
<span
className={classes.dailyTimestamp}
key={`timestamp-${message.id}`}
>
<div className={classes.dailyTimestampText}>
{format(parseISO(messagesList[index].createdAt), "dd/MM/yyyy")}
</div>
</span>
);
}
}
if (index === messagesList.length - 1) {
return (
<div
key={`ref-${message.createdAt}`}
ref={lastMessageRef}
style={{ float: "left", clear: "both" }}
/>
);
}
};
const renderMessageDivider = (message, index) => {
if (index < messagesList.length && index > 0) {
let messageUser = messagesList[index].fromMe;
let previousMessageUser = messagesList[index - 1].fromMe;
if (messageUser !== previousMessageUser) {
return (
<span style={{ marginTop: 16 }} key={`divider-${message.id}`}></span>
);
}
}
};
const renderQuotedMessage = (message) => {
return (
<div
className={clsx(classes.quotedContainerLeft, {
[classes.quotedContainerRight]: message.fromMe,
})}
>
<span
className={clsx(classes.quotedSideColorLeft, {
[classes.quotedSideColorRight]: message.quotedMsg?.fromMe,
})}
></span>
<div className={classes.quotedMsg}>
{!message.quotedMsg?.fromMe && (
<span className={classes.messageContactName}>
{message.quotedMsg?.contact?.name}
</span>
)}
{message.quotedMsg?.body}
</div>
</div>
);
};
const renderMessages = () => {
if (messagesList.length > 0) {
const viewMessagesList = messagesList.map((message, index) => {
if (!message.fromMe) {
return (
<React.Fragment key={message.id}>
{renderDailyTimestamps(message, index)}
{renderMessageDivider(message, index)}
<div className={classes.messageLeft}>
<IconButton
variant="contained"
size="small"
id="messageActionsButton"
disabled={message.isDeleted}
className={classes.messageActionsButton}
onClick={(e) => handleOpenMessageOptionsMenu(e, message)}
>
<ExpandMore />
</IconButton>
{isGroup && (
<span className={classes.messageContactName}>
{message.contact?.name}
</span>
)}
{(message.mediaUrl || message.mediaType === "location" || message.mediaType === "vcard"
//|| message.mediaType === "multi_vcard"
) && checkMessageMedia(message)}
<div className={classes.textContentItem}>
{message.quotedMsg && renderQuotedMessage(message)}
<MarkdownWrapper>{message.body}</MarkdownWrapper>
<span className={classes.timestamp}>
{format(parseISO(message.createdAt), "HH:mm")}
</span>
</div>
</div>
</React.Fragment>
);
} else {
return (
<React.Fragment key={message.id}>
{renderDailyTimestamps(message, index)}
{renderMessageDivider(message, index)}
<div className={classes.messageRight}>
<IconButton
variant="contained"
size="small"
id="messageActionsButton"
disabled={message.isDeleted}
className={classes.messageActionsButton}
onClick={(e) => handleOpenMessageOptionsMenu(e, message)}
>
<ExpandMore />
</IconButton>
{(message.mediaUrl || message.mediaType === "location" || message.mediaType === "vcard"
//|| message.mediaType === "multi_vcard"
) && checkMessageMedia(message)}
<div
className={clsx(classes.textContentItem, {
[classes.textContentItemDeleted]: message.isDeleted,
})}
>
{message.isDeleted && (
<Block
color="disabled"
fontSize="small"
className={classes.deletedIcon}
/>
)}
{message.quotedMsg && renderQuotedMessage(message)}
<MarkdownWrapper>{message.body}</MarkdownWrapper>
<span className={classes.timestamp}>
{format(parseISO(message.createdAt), "HH:mm")}
{renderMessageAck(message)}
</span>
</div>
</div>
</React.Fragment>
);
}
});
return viewMessagesList;
} else {
return <div>Say hello to your new contact!</div>;
}
};
return (
<div className={classes.messagesListWrapper}>
<MessageOptionsMenu
message={selectedMessage}
anchorEl={anchorEl}
menuOpen={messageOptionsMenuOpen}
handleClose={handleCloseMessageOptionsMenu}
/>
<div
id="messagesList"
className={classes.messagesList}
onScroll={handleScroll}
>
{messagesList.length > 0 ? renderMessages() : []}
</div>
{loading && (
<div>
<CircularProgress className={classes.circleLoading} />
</div>
)}
</div>
);
}
Example #11
Source File: index.js From whaticket with MIT License | 4 votes |
TicketListItem = ({ ticket }) => {
const classes = useStyles();
const history = useHistory();
const [loading, setLoading] = useState(false);
const { ticketId } = useParams();
const isMounted = useRef(true);
const { user } = useContext(AuthContext);
useEffect(() => {
return () => {
isMounted.current = false;
};
}, []);
const handleAcepptTicket = async id => {
setLoading(true);
try {
await api.put(`/tickets/${id}`, {
status: "open",
userId: user?.id,
});
} catch (err) {
setLoading(false);
toastError(err);
}
if (isMounted.current) {
setLoading(false);
}
history.push(`/tickets/${id}`);
};
const handleSelectTicket = id => {
history.push(`/tickets/${id}`);
};
return (
<React.Fragment key={ticket.id}>
<ListItem
dense
button
onClick={e => {
if (ticket.status === "pending") return;
handleSelectTicket(ticket.id);
}}
selected={ticketId && +ticketId === ticket.id}
className={clsx(classes.ticket, {
[classes.pendingTicket]: ticket.status === "pending",
})}
>
<Tooltip
arrow
placement="right"
title={ticket.queue?.name || "Sem fila"}
>
<span
style={{ backgroundColor: ticket.queue?.color || "#7C7C7C" }}
className={classes.ticketQueueColor}
></span>
</Tooltip>
<ListItemAvatar>
<Avatar src={ticket?.contact?.profilePicUrl} />
</ListItemAvatar>
<ListItemText
disableTypography
primary={
<span className={classes.contactNameWrapper}>
<Typography
noWrap
component="span"
variant="body2"
color="textPrimary"
>
{ticket.contact.name}
</Typography>
{ticket.status === "closed" && (
<Badge
className={classes.closedBadge}
badgeContent={"closed"}
color="primary"
/>
)}
{ticket.lastMessage && (
<Typography
className={classes.lastMessageTime}
component="span"
variant="body2"
color="textSecondary"
>
{isSameDay(parseISO(ticket.updatedAt), new Date()) ? (
<>{format(parseISO(ticket.updatedAt), "HH:mm")}</>
) : (
<>{format(parseISO(ticket.updatedAt), "dd/MM/yyyy")}</>
)}
</Typography>
)}
{ticket.whatsappId && (
<div className={classes.userTag} title={i18n.t("ticketsList.connectionTitle")}>{ticket.whatsapp?.name}</div>
)}
</span>
}
secondary={
<span className={classes.contactNameWrapper}>
<Typography
className={classes.contactLastMessage}
noWrap
component="span"
variant="body2"
color="textSecondary"
>
{ticket.lastMessage ? (
<MarkdownWrapper>{ticket.lastMessage}</MarkdownWrapper>
) : (
<br />
)}
</Typography>
<Badge
className={classes.newMessagesCount}
badgeContent={ticket.unreadMessages}
classes={{
badge: classes.badgeStyle,
}}
/>
</span>
}
/>
{ticket.status === "pending" && (
<ButtonWithSpinner
color="primary"
variant="contained"
className={classes.acceptButton}
size="small"
loading={loading}
onClick={e => handleAcepptTicket(ticket.id)}
>
{i18n.t("ticketsList.buttons.accept")}
</ButtonWithSpinner>
)}
</ListItem>
<Divider variant="inset" component="li" />
</React.Fragment>
);
}
Example #12
Source File: DateRangePickerCalendar.js From react-nice-dates with MIT License | 4 votes |
export default function DateRangePickerCalendar({
locale,
startDate,
endDate,
focus,
month: receivedMonth,
onStartDateChange,
onEndDateChange,
onFocusChange,
onMonthChange,
minimumDate,
maximumDate,
minimumLength,
maximumLength,
modifiers: receivedModifiers,
modifiersClassNames,
weekdayFormat,
touchDragEnabled
}) {
const [hoveredDate, setHoveredDate] = useState()
const [month, setMonth] = useControllableState(
receivedMonth,
onMonthChange,
startOfMonth(startDate || endDate || new Date())
)
const displayedStartDate =
focus === START_DATE && !startDate && endDate && hoveredDate && !isSameDay(hoveredDate, endDate)
? hoveredDate
: startOfDay(startDate)
const displayedEndDate =
focus === END_DATE && !endDate && startDate && hoveredDate && !isSameDay(hoveredDate, startDate)
? hoveredDate
: startOfDay(endDate)
const isStartDate = date => isSameDay(date, displayedStartDate) && isBefore(date, displayedEndDate)
const isMiddleDate = date => isAfter(date, displayedStartDate) && isBefore(date, displayedEndDate)
const isEndDate = date => isSameDay(date, displayedEndDate) && isAfter(date, displayedStartDate)
const modifiers = mergeModifiers(
{
selected: date =>
isSelectable(date, { minimumDate, maximumDate }) &&
(isStartDate(date) ||
isMiddleDate(date) ||
isEndDate(date) ||
isSameDay(date, startDate) ||
isSameDay(date, endDate)),
selectedStart: isStartDate,
selectedMiddle: isMiddleDate,
selectedEnd: isEndDate,
disabled: date =>
(focus === START_DATE &&
endDate &&
((differenceInDays(startOfDay(endDate), date) < minimumLength && (!startDate || !isAfter(date, startOfDay(endDate)))) ||
(!startDate && maximumLength && differenceInDays(startOfDay(endDate), date) > maximumLength))) ||
(focus === END_DATE &&
startDate &&
((differenceInDays(date, startOfDay(startDate)) < minimumLength && (!endDate || !isBefore(date, startOfDay(startDate)))) ||
(!endDate && maximumLength && differenceInDays(date, startOfDay(startDate)) > maximumLength)))
},
receivedModifiers
)
const handleSelectDate = date => {
if (focus === START_DATE) {
const invalidEndDate =
endDate && !isRangeLengthValid({ startDate: date, endDate }, { minimumLength, maximumLength })
if (invalidEndDate) {
onEndDateChange(null)
}
onStartDateChange(startDate ? setTime(date, startDate) : date)
onFocusChange(END_DATE)
} else if (focus === END_DATE) {
const invalidStartDate =
startDate && !isRangeLengthValid({ startDate, endDate: date }, { minimumLength, maximumLength })
if (invalidStartDate) {
onStartDateChange(null)
}
onEndDateChange(endDate ? setTime(date, endDate) : date)
onFocusChange(invalidStartDate || !startDate ? START_DATE : null)
}
}
return (
<Calendar
locale={locale}
month={month}
onMonthChange={setMonth}
onDayHover={setHoveredDate}
onDayClick={handleSelectDate}
minimumDate={minimumDate}
maximumDate={maximumDate}
modifiers={modifiers}
modifiersClassNames={modifiersClassNames}
weekdayFormat={weekdayFormat}
touchDragEnabled={touchDragEnabled}
/>
)
}
Example #13
Source File: DateView.js From react-horizontal-datepicker with MIT License | 4 votes |
DateView = ({
startDate,
lastDate,
selectDate,
getSelectedDay,
primaryColor,
labelFormat
}) => {
const [selectedDate, setSelectedDate] = useState(null);
const firstSection = {
marginLeft: '40px'
};
const selectedStyle = {
fontWeight: "bold",
width: "45px",
height: "45px",
borderRadius: "50%",
border: `2px solid ${primaryColor}`,
color: primaryColor
};
const labelColor = {
color: primaryColor
};
const getStyles = day => {
return isSameDay(day, selectedDate) ? selectedStyle : null;
};
const getId = day => {
return isSameDay(day, selectedDate) ? 'selected' : "";
};
const renderDays = () => {
const dayFormat = "E";
const dateFormat = "d";
const months = [];
let days = [];
for (let i = 0; i <= differenceInMonths(lastDate, startDate); i++) {
let start, end;
const month = startOfMonth(addMonths(startDate, i));
start = i === 0 ? Number(format(startDate, dateFormat)) - 1 : 0;
end = i === differenceInMonths(lastDate, startDate) ? Number(format(lastDate, "d")) : Number(format(lastDayOfMonth(month), "d"));
for (let j = start; j < end; j++) {
let currentDay = addDays(month, j);
days.push( /*#__PURE__*/React.createElement("div", {
id: `${getId(currentDay)}`,
className: styles.dateDayItem,
style: getStyles(currentDay),
key: currentDay,
onClick: () => onDateClick(currentDay)
}, /*#__PURE__*/React.createElement("div", {
className: styles.dayLabel
}, format(currentDay, dayFormat)), /*#__PURE__*/React.createElement("div", {
className: styles.dateLabel
}, format(currentDay, dateFormat))));
}
months.push( /*#__PURE__*/React.createElement("div", {
className: styles.monthContainer,
key: month
}, /*#__PURE__*/React.createElement("span", {
className: styles.monthYearLabel,
style: labelColor
}, format(month, labelFormat || "MMMM yyyy")), /*#__PURE__*/React.createElement("div", {
className: styles.daysContainer,
style: i === 0 ? firstSection : null
}, days)));
days = [];
}
return /*#__PURE__*/React.createElement("div", {
id: "container",
className: styles.dateListScrollable
}, months);
};
const onDateClick = day => {
setSelectedDate(day);
if (getSelectedDay) {
getSelectedDay(day);
}
};
useEffect(() => {
if (getSelectedDay) {
if (selectDate) {
getSelectedDay(selectDate);
} else {
getSelectedDay(startDate);
}
}
}, []);
useEffect(() => {
if (selectDate) {
if (!isSameDay(selectedDate, selectDate)) {
setSelectedDate(selectDate);
setTimeout(() => {
let view = document.getElementById('selected');
if (view) {
view.scrollIntoView({
behavior: "smooth",
inline: "center",
block: "nearest"
});
}
}, 20);
}
}
}, [selectDate]);
return /*#__PURE__*/React.createElement(React.Fragment, null, renderDays());
}
Example #14
Source File: MonthView.js From react-horizontal-datepicker with MIT License | 4 votes |
MonthView = ({
startDate,
lastDate,
selectDate,
getSelectedDay,
primaryColor,
labelFormat
}) => {
const [selectedDate, setSelectedDate] = useState(null);
const rgb = primaryColor.replace(/[^\d,]/g, '').split(',');
const brightness = Math.round((parseInt(rgb[0]) * 299 + parseInt(rgb[1]) * 587 + parseInt(rgb[2]) * 114) / 1000);
const textColour = brightness > 125 ? 'black' : 'white';
const selectedStyle = {
borderRadius: "0.7rem",
background: `${primaryColor}`,
color: textColour
};
const getStyles = day => {
return isSameDay(day, selectedDate) ? selectedStyle : null;
};
const getId = day => {
return isSameDay(day, selectedDate) ? 'selected' : "";
};
const renderDays = () => {
const months = [];
for (let i = 0; i <= differenceInMonths(lastDate, startDate); i++) {
const month = startOfMonth(addMonths(startDate, i));
months.push( /*#__PURE__*/React.createElement("div", {
id: `${getId(month)}`,
className: styles.monthContainer,
key: month,
style: getStyles(month),
onClick: () => onDateClick(month)
}, /*#__PURE__*/React.createElement("span", {
className: styles.monthYearLabel
}, format(month, labelFormat || "MMMM yyyy"))));
}
return /*#__PURE__*/React.createElement("div", {
id: "container",
className: styles.dateListScrollable
}, months);
};
const onDateClick = day => {
setSelectedDate(day);
if (getSelectedDay) {
getSelectedDay(day);
}
};
useEffect(() => {
if (getSelectedDay) {
if (selectDate) {
getSelectedDay(selectDate);
} else {
getSelectedDay(startDate);
}
}
}, []);
useEffect(() => {
if (selectDate) {
if (!isSameDay(selectedDate, selectDate)) {
setSelectedDate(selectDate);
setTimeout(() => {
let view = document.getElementById('selected');
if (view) {
view.scrollIntoView({
behavior: "smooth",
inline: "center",
block: "nearest"
});
}
}, 20);
}
}
}, [selectDate]);
return /*#__PURE__*/React.createElement(React.Fragment, null, renderDays());
}
Example #15
Source File: DateView.js From react-horizontal-datepicker with MIT License | 4 votes |
DateView = ({startDate, lastDate, selectDate, getSelectedDay, primaryColor, labelFormat, marked}) => {
const [selectedDate, setSelectedDate] = useState(null);
const firstSection = {marginLeft: '40px'};
const selectedStyle = {fontWeight:"bold",width:"45px",height:"45px",borderRadius:"50%",border:`2px solid ${primaryColor}`,color:primaryColor};
const labelColor = {color: primaryColor};
const markedStyle = {color: "#8c3737", padding: "2px", fontSize: 12};
const getStyles = (day) => {
return isSameDay(day, selectedDate)?selectedStyle:null;
};
const getId = (day) => {
return isSameDay(day, selectedDate)?'selected':"";
};
const getMarked = (day) => {
let markedRes = marked.find(i => isSameDay(i.date, day));
if (markedRes) {
if (!markedRes?.marked) {
return;
}
return <div style={{ ...markedRes?.style ?? markedStyle }} className={styles.markedLabel}>
{markedRes.text}
</div>;
}
return "";
};
const renderDays = () => {
const dayFormat = "E";
const dateFormat = "d";
const months = [];
let days = [];
// const styleItemMarked = marked ? styles.dateDayItemMarked : styles.dateDayItem;
for (let i = 0; i <= differenceInMonths(lastDate, startDate); i++) {
let start, end;
const month = startOfMonth(addMonths(startDate, i));
start = i === 0 ? Number(format(startDate, dateFormat)) - 1 : 0;
end = i === differenceInMonths(lastDate, startDate) ? Number(format(lastDate, "d")) : Number(format(lastDayOfMonth(month), "d"));
for (let j = start; j < end; j++) {
let currentDay = addDays(month, j);
days.push(
<div id={`${getId(currentDay)}`}
className={marked ? styles.dateDayItemMarked : styles.dateDayItem}
style={getStyles(currentDay)}
key={currentDay}
onClick={() => onDateClick(currentDay)}
>
<div className={styles.dayLabel}>{format(currentDay, dayFormat)}</div>
<div className={styles.dateLabel}>{format(currentDay, dateFormat)}</div>
{getMarked(currentDay)}
</div>
);
}
months.push(
<div className={styles.monthContainer}
key={month}
>
<span className={styles.monthYearLabel} style={labelColor}>
{format(month, labelFormat || "MMMM yyyy")}
</span>
<div className={styles.daysContainer} style={i===0?firstSection:null}>
{days}
</div>
</div>
);
days = [];
}
return <div id={"container"} className={styles.dateListScrollable}>{months}</div>;
}
const onDateClick = day => {
setSelectedDate(day);
if (getSelectedDay) {
getSelectedDay(day);
}
};
useEffect(() => {
if (getSelectedDay) {
if (selectDate) {
getSelectedDay(selectDate);
} else {
getSelectedDay(startDate);
}
}
}, []);
useEffect(() => {
if (selectDate) {
if (!isSameDay(selectedDate, selectDate)) {
setSelectedDate(selectDate);
setTimeout(() => {
let view = document.getElementById('selected');
if (view) {
view.scrollIntoView({behavior: "smooth", inline: "center", block: "nearest"});
}
}, 20);
}
}
}, [selectDate]);
return <React.Fragment>{renderDays()}</React.Fragment>
}