74 lines
2.0 KiB
JavaScript
74 lines
2.0 KiB
JavaScript
const DAYS = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];
|
|
const DAY_LABELS = {
|
|
sun: 'Domingo',
|
|
mon: 'Lunes',
|
|
tue: 'Martes',
|
|
wed: 'Miércoles',
|
|
thu: 'Jueves',
|
|
fri: 'Viernes',
|
|
sat: 'Sábado',
|
|
};
|
|
|
|
export const DAY_KEYS = DAYS;
|
|
export const DAY_LABEL = DAY_LABELS;
|
|
|
|
function parseHM(str) {
|
|
const [h, m] = str.split(':').map(Number);
|
|
if (!Number.isFinite(h) || !Number.isFinite(m)) return null;
|
|
return h * 60 + m;
|
|
}
|
|
|
|
function parseHours(raw) {
|
|
if (!raw) return null;
|
|
try {
|
|
return typeof raw === 'string' ? JSON.parse(raw) : raw;
|
|
} catch {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
function findNextOpen(hours, now) {
|
|
for (let offset = 1; offset <= 7; offset++) {
|
|
const day = DAYS[(now.getDay() + offset) % 7];
|
|
const range = hours[day];
|
|
if (Array.isArray(range) && range.length === 2) {
|
|
const openStr = range[0];
|
|
if (offset === 1) return `mañana a las ${openStr}`;
|
|
return `${DAY_LABELS[day]} a las ${openStr}`;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
export function getOpenStatus(rawHours, now = new Date()) {
|
|
const hours = parseHours(rawHours);
|
|
if (!hours) return null;
|
|
|
|
const day = DAYS[now.getDay()];
|
|
const range = hours[day];
|
|
|
|
if (!Array.isArray(range) || range.length !== 2) {
|
|
const next = findNextOpen(hours, now);
|
|
return { status: 'closed', label: next ? `Cerrado · Abre ${next}` : 'Cerrado' };
|
|
}
|
|
|
|
const openMins = parseHM(range[0]);
|
|
const closeMins = parseHM(range[1]);
|
|
if (openMins == null || closeMins == null) return null;
|
|
|
|
const nowMins = now.getHours() * 60 + now.getMinutes();
|
|
|
|
if (nowMins < openMins) {
|
|
return { status: 'closed', label: `Cerrado · Abre a las ${range[0]}` };
|
|
}
|
|
if (nowMins >= closeMins) {
|
|
const next = findNextOpen(hours, now);
|
|
return { status: 'closed', label: next ? `Cerrado · Abre ${next}` : 'Cerrado' };
|
|
}
|
|
return { status: 'open', label: `Abierto · Cierra a las ${range[1]}` };
|
|
}
|
|
|
|
export function emptyHours() {
|
|
return { sun: null, mon: null, tue: null, wed: null, thu: null, fri: null, sat: null };
|
|
}
|