react-output-schedule
Version:
ouput the data with timer
185 lines (157 loc) • 4.99 kB
JavaScript
'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;