73 lines
1.7 KiB
JavaScript
73 lines
1.7 KiB
JavaScript
const DAY_IN_MS = 24 * 60 * 60 * 1000;
|
|
|
|
const parseIsoDate = (dateStr) => {
|
|
const [year, month, day] = dateStr.split("-").map(Number);
|
|
if (!year || !month || !day) {
|
|
return null;
|
|
}
|
|
|
|
return new Date(Date.UTC(year, month - 1, day));
|
|
};
|
|
|
|
export const formatDeliveryDate = (dateStr) => {
|
|
const parsed = parseIsoDate(dateStr);
|
|
if (!parsed) {
|
|
return dateStr;
|
|
}
|
|
|
|
const day = String(parsed.getUTCDate()).padStart(2, "0");
|
|
const month = String(parsed.getUTCMonth() + 1).padStart(2, "0");
|
|
const year = String(parsed.getUTCFullYear());
|
|
|
|
return `${day}.${month}.${year}`;
|
|
};
|
|
|
|
export const getDeliveryRelativeDayLabel = (dateStr, referenceDate = new Date()) => {
|
|
const target = parseIsoDate(dateStr);
|
|
if (!target) {
|
|
return "";
|
|
}
|
|
|
|
const reference = Date.UTC(
|
|
referenceDate.getUTCFullYear(),
|
|
referenceDate.getUTCMonth(),
|
|
referenceDate.getUTCDate(),
|
|
);
|
|
const diff = Math.round((target.getTime() - reference) / DAY_IN_MS);
|
|
|
|
if (diff === 1) {
|
|
return "Завтра";
|
|
}
|
|
|
|
if (diff === 2) {
|
|
return "Послезавтра";
|
|
}
|
|
|
|
return "";
|
|
};
|
|
|
|
export const formatDeliverySlotGroupLabel = (dateStr, referenceDate = new Date()) => {
|
|
const formattedDate = formatDeliveryDate(dateStr);
|
|
const relativeLabel = getDeliveryRelativeDayLabel(dateStr, referenceDate);
|
|
|
|
return relativeLabel ? `${relativeLabel} · ${formattedDate}` : formattedDate;
|
|
};
|
|
|
|
export const formatDeliverySlotLabel = ({ date, time } = {}) => {
|
|
const formattedDate = date ? formatDeliveryDate(date) : "";
|
|
|
|
if (!formattedDate && !time) {
|
|
return "";
|
|
}
|
|
|
|
if (!formattedDate) {
|
|
return time || "";
|
|
}
|
|
|
|
if (!time) {
|
|
return formattedDate;
|
|
}
|
|
|
|
return `${formattedDate}, ${time}`;
|
|
};
|