UNPKG

react-output-schedule

Version:
185 lines (157 loc) 4.99 kB
'use strict'; var dayjs = require('dayjs'); var utc = require('dayjs/plugin/utc'); var timezone = require('dayjs/plugin/timezone'); var objectSupport = require('dayjs/plugin/objectSupport'); dayjs.extend(utc); dayjs.extend(timezone); dayjs.extend(objectSupport); var getCompare = function getCompare(_ref) { var g = _ref.g, unit = _ref.unit; var target = g; typeof unit.Y !== 'undefined' && (target = target.year(unit.Y)); typeof unit.M !== 'undefined' && (target = target.month(unit.M - 1)); typeof unit.D !== 'undefined' && (target = target.date(unit.D)); typeof unit.h !== 'undefined' && (target = target.hour(unit.h)); typeof unit.m !== 'undefined' && (target = target.minute(unit.m)); typeof unit.s !== 'undefined' && (target = target.second(unit.s)); return { timestamp: target.valueOf(), string: target.format(), diff: target.diff(g, 'second') }; }; /** * Get Valid schedule * * @param {object} schedules the lists include the start and end of campaigns * @param {object} location for timezone like Asia/Hong_Kong * * @return {Object} the action from schedule */ var OutSchedule = function OutSchedule(_ref2) { var schedules = _ref2.schedules, location = _ref2.location, enableExtraTrack = _ref2.enableExtraTrack; var g = dayjs().tz(location || 'Asia/Hong_Kong'); var gt = g.valueOf(), data = {}; try { var outObject = {}; var data = getActive({ g: g, schedules: schedules }); if (Object.keys(data).length > 0) outObject.currentActive = data.schedules[data.activeIndex]; if (enableExtraTrack || false) { data.nextStartIndex = getClosetStartTime({ schedules: data.schedules, gt: gt, activeIndex: data.activeIndex }); data.perviousIndex = getClosetEndTime({ schedules: data.schedules, gt: gt, activeIndex: data.activeIndex, nextStartIndex: data.nextStartIndex }); } } catch (err) { console.error('OutSchedule fail', err); } return data; }; /** * point out the valid one * * @param {object} g dayjs for global time * @param {object} schedules the lists include the start and end of campaigns * * @return {Object} */ var getActive = function getActive(_ref3) { var g = _ref3.g, schedules = _ref3.schedules; var activeIndex; for (var i = 0; i < schedules.length; i++) { var schedule = schedules[i], v; var isEnable = schedule.isEnable || true, isValid = true; if (!isEnable) continue; if (schedule.start) { v = getCompare({ g: g, unit: schedule.start }); schedules[i].startTime = v.timestamp; schedules[i].startString = v.string; if (v.diff > 0) isValid = false; } if (schedule.end) { v = getCompare({ g: g, unit: schedule.end }); schedules[i].endTime = v.timestamp; schedules[i].endString = v.string; if (v.diff < 0) isValid = false; } isValid && (activeIndex = i); } return { schedules: schedules, activeIndex: activeIndex }; }; /** * point out the next valid one * * @param {object} gt timestamp for global * @param {object} schedules the lists include the start and end of campaigns * @param {object} activeIndex valid index of schedules for compare * * @return {Object} */ var getClosetStartTime = function getClosetStartTime(_ref4) { var schedules = _ref4.schedules, gt = _ref4.gt, activeIndex = _ref4.activeIndex; var nextIndex; for (var i = 0; i < schedules.length; i++) { if (activeIndex && activeIndex === i) continue; var schedule = schedules[i]; var start = schedule.startTime || 0, end = schedule.endTime || 0; if (end < gt || activeIndex && start > schedules[activeIndex].startTime || typeof nextIndex !== 'undefined' && start > schedules[nextIndex].startTime || false) continue; nextIndex = i; } return nextIndex; }; /** * point out pervious invalid one * * @param {object} gt timestamp for global * @param {object} schedules the lists include the start and end of campaigns * @param {object} activeIndex valid index of schedules for compare * * @return {Object} */ var getClosetEndTime = function getClosetEndTime(_ref5) { var schedules = _ref5.schedules, gt = _ref5.gt, activeIndex = _ref5.activeIndex, nextStartIndex = _ref5.nextStartIndex; var index, closeTime; for (var i = 0; i < schedules.length; i++) { var targetIndex = activeIndex || nextStartIndex; if (targetIndex === i) continue; var schedule = schedules[i]; if (schedule.startTime >= gt || targetIndex && schedule.startTime >= schedules[targetIndex].startTime || typeof closeTime !== 'undefined' && schedule.endTime < closeTime || false) continue; closeTime = schedule.endTime; index = i; } return index; }; module.exports = OutSchedule;