mapwize-ui-react-native
Version:
Fully featured and ready to use UI to add Mapwize Indoor Maps and Navigation in your React Native app.
254 lines (202 loc) • 7.51 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.buildCurrentOpeningStatus = exports.buildOpeningHours = void 0;
var _dayjs = _interopRequireDefault(require("dayjs"));
var _localizor = require("../localizor");
var _utc = _interopRequireDefault(require("dayjs/plugin/utc"));
var _timezone = _interopRequireDefault(require("dayjs/plugin/timezone"));
var _customParseFormat = _interopRequireDefault(require("dayjs/plugin/customParseFormat"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
_dayjs.default.extend(_utc.default);
_dayjs.default.extend(_timezone.default);
_dayjs.default.extend(_customParseFormat.default);
const buildOpeningHours = (openHours, language, uses24 = true) => {
const format = uses24 ? 'HH:mm' : 'hh:mm';
let formatted = [[], [], [], [], [], [], []];
openHours.forEach(o => {
if (o.open === '00:00' && o.close === '23:59') {
formatted[o.day].push((0, _localizor.lang_open_all_day)(language));
} else {
formatted[o.day].push((0, _dayjs.default)(o.open, 'HH:mm').format(format) + ' - ' + (0, _dayjs.default)(o.close, 'HH:mm').format(format));
}
});
for (let i = 0; i < formatted.length; i++) {
if (formatted[i].length === 0) {
formatted[i].push((0, _localizor.lang_closed)(language));
}
}
formatted = formatted.map((v, i) => {
return {
day: dayOfWeekAsString(i, language),
intervals: v
};
});
formatted.push(formatted.shift());
return formatted;
};
exports.buildOpeningHours = buildOpeningHours;
const buildCurrentOpeningStatus = (placeDetails, language, uses24 = true) => {
return getCurrentOpeningState(placeDetails.openingHours, placeDetails.timezone, language, uses24);
};
exports.buildCurrentOpeningStatus = buildCurrentOpeningStatus;
const getFormattedHours = (minuts, uses24 = true) => {
const date = new Date();
date.setHours(Math.floor(minuts / 60));
date.setMinutes(minuts % 60);
date.setSeconds(0);
date.setMilliseconds(0);
const format = uses24 ? 'HH:mm' : 'hh:mm';
const s = (0, _dayjs.default)(date).format(format);
return s;
};
const dayOfWeekAsString = (dayIndex, language) => {
return [(0, _localizor.lang_sunday)(language), (0, _localizor.lang_monday)(language), (0, _localizor.lang_tuesday)(language), (0, _localizor.lang_wednesday)(language), (0, _localizor.lang_thursday)(language), (0, _localizor.lang_friday)(language), (0, _localizor.lang_saturday)(language)][dayIndex] || '';
};
const getCurrentOpeningState = (input, timezoneCode, language, uses24) => {
const localOffset = -new Date().getTimezoneOffset();
const venueOffset = (0, _dayjs.default)().tz(timezoneCode).utcOffset();
const diff = (venueOffset - localOffset) / 60;
const date = new Date();
const weekday = date.getDay();
const currentMinuts = (new Date().getHours() + diff) * 60 + new Date().getMinutes();
const intervals = sortInterval(buildIntervals(input), new Date().getDay(), currentMinuts);
const currentInterval = getIntervalIfOpenFromIntervals(intervals, weekday, currentMinuts);
if (currentInterval) {
const closingInterval = getNextCloseIntervalFromIntervals(intervals, currentInterval);
if (closingInterval) {
if (closingInterval === currentInterval) {
return (0, _localizor.lang_open_close_at)(language, getFormattedHours(closingInterval.close, uses24));
}
if (closingInterval.day - currentInterval.day === 1 || closingInterval.day - currentInterval.day === -6) {
return (0, _localizor.lang_open_close_tomorrow)(language, getFormattedHours(closingInterval.close, uses24));
} else {
return (0, _localizor.lang_open_close)(language, dayOfWeekAsString(closingInterval.day, language), getFormattedHours(closingInterval.close, uses24));
}
} else {
return (0, _localizor.lang_open_24_7)(language);
}
} else {
const openingInterval = getNextOpeningIntervalFromIntervals(intervals, weekday, currentMinuts);
if (openingInterval) {
if (openingInterval.day === weekday) {
return (0, _localizor.lang_close_open_at)(language, getFormattedHours(openingInterval.open, uses24));
}
if (openingInterval.day - weekday === 1 || openingInterval.day - weekday === -6) {
return (0, _localizor.lang_close_open_tomorrow)(language, getFormattedHours(openingInterval.open, uses24));
} else {
return (0, _localizor.lang_close_open)(language, dayOfWeekAsString(openingInterval.day, language), getFormattedHours(openingInterval.open, uses24));
}
} else {
return (0, _localizor.lang_close_24_7)(language);
}
}
};
const getNextOpeningIntervalFromIntervals = (intervals, day, minuts) => {
// i.open > ? minuts
let nextPossibleOpening = [];
for (let i = 0; i < intervals.length; i++) {
if (intervals[i].day === day && intervals[i].open > minuts && intervals[i].close > minuts) {
return intervals[i];
}
if (intervals[i].day !== day) {
nextPossibleOpening.push(intervals[i]);
}
}
let counter = 0;
while (counter < 7) {
const nextDay = (day + counter) % 7;
const interval = nextPossibleOpening.find(e => e.day === nextDay);
if (interval) {
return interval;
}
counter++;
}
return null;
};
const getNextCloseIntervalFromIntervals = (intervals, current) => {
if (current.close !== 23 * 60 + 59) {
return current;
}
const index = intervals.indexOf(current);
for (let i = 0; i < intervals.length; i++) {
const next = intervals[(i + index) % intervals.length];
if (next.close !== 23 * 60 + 59) {
return next;
}
}
return null;
};
const getIntervalIfOpenFromIntervals = (intervals, day, minuts) => {
for (let i = 0; i < intervals.length; i++) {
if (day === intervals[i].day && minuts > intervals[i].open && minuts < intervals[i].close) {
return intervals[i];
}
}
return null;
};
const buildIntervals = input => {
if (!input) {
return [];
}
return input.map(o => {
return convertStringOpeningHourToMinuts(o);
});
};
const sortInterval = (input, day, minuts) => {
const sorted = input.sort((a, b) => {
if (a.day === b.day) {
return a.open - b.open;
}
return a.day - b.day;
});
let index = -1;
for (let i = 0; i < sorted.length; i++) {
if (sorted[i].day > day) {
index = i - 1;
break;
}
}
for (let i = 0; i < index; i++) {
sorted.push(sorted.shift());
}
return sorted;
};
const isOpenToday = (input, minuts) => {
input.forEach(i => {
if (i.open <= minuts && i.close > minuts) {
return true;
}
});
return false;
};
const convertToOpeningByDay = input => {
const output = {};
convertStringOpeningHoursToMinuts(input).forEach(o => {
if (!output[o.day]) {
output[o.day] = [];
}
output[o.day].push({
open: o.open,
clise: o.close
});
});
return output;
};
const convertStringOpeningHoursToMinuts = input => {
return input.map(convertStringOpeningHourToMinuts);
};
const convertStringOpeningHourToMinuts = input => {
return {
day: input.day,
open: convertStringToMinuts(input.open),
close: convertStringToMinuts(input.close)
};
};
const convertStringToMinuts = input => {
const hours = parseInt(input.substr(0, 2), 10);
const minuts = parseInt(input.substr(3, 2), 10);
return hours * 60 + minuts;
};
//# sourceMappingURL=openingHoursFormatter.js.map