supersam/src/components/client/deliveryDateFormatting.js

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}`;
};