@taglivros/tag-hooks
Version:
A Collection of React Hooks created by [@taglivros](https://site.taglivros.com/)
168 lines (161 loc) • 5.97 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', { value: true });
var React = require('react');
var dateFns = require('date-fns');
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
/* eslint-disable no-console */
var CountdownContext = React.createContext({});
var CountdownProvider = function (_a) {
var children = _a.children;
var _b = React.useState(1), seconds = _b[0], setSeconds = _b[1];
var _c = React.useState(1), minutes = _c[0], setMinutes = _c[1];
var _d = React.useState(1), hours = _d[0], setHours = _d[1];
var _e = React.useState(1), days = _e[0], setDays = _e[1];
var _f = React.useState(true), loading = _f[0], setLoading = _f[1];
var _g = React.useState(false), hasError = _g[0], setHasError = _g[1];
var timer = 0;
var negative = false;
var initializeCountdown = function (_a) {
var days_ = _a.days_, hours_ = _a.hours_, minutes_ = _a.minutes_, seconds_ = _a.seconds_, endTime = _a.endTime;
return new Promise(function (resolve) {
setSeconds(Math.floor(seconds_ || 0));
setMinutes(Math.floor(minutes_ || 0));
setHours(Math.floor(hours_ || 0));
setDays(Math.floor(days_ || 0));
if (endTime) {
var diffDays = dateFns.differenceInDays(endTime, new Date());
var diffHours = dateFns.differenceInHours(endTime, new Date());
var diffMins = dateFns.differenceInMinutes(endTime, new Date());
var diffSecs = dateFns.differenceInSeconds(endTime, new Date());
if (diffDays < 0 && diffHours < 0 && diffMins < 0 && diffSecs < 0) {
negative = true;
}
setDays(Math.floor(diffDays));
setHours(Math.floor(diffHours % 24));
setMinutes(Math.floor(diffMins % 60));
setSeconds(Math.floor(diffSecs % 60));
}
resolve(true);
});
};
var mZero = false;
var hZero = false;
var dZero = false;
var lastMinute = false;
var setTimerError = function (value) {
setHasError(value);
};
var handleCountdown = function () {
if ((days || hours || minutes || seconds) && !negative) {
var changeMinute_1 = false;
var changeHour_1 = false;
var changeDay_1 = false;
setSeconds(function (s) {
if (s > 0 && !hZero && !mZero) {
return s - 1;
}
else if (!hZero && !mZero) {
changeMinute_1 = true;
return 59;
}
else if (s > 0 && lastMinute) {
return s - 1;
}
else if (lastMinute) {
return 0;
}
else {
lastMinute = true;
setMinutes(0);
return 59;
}
});
if (changeMinute_1) {
setMinutes(function (m) {
if (m > 0) {
return m - 1;
}
else {
changeHour_1 = true;
if (hZero) {
mZero = true;
return 0;
}
if (!hZero) {
return 59;
}
else {
return 0;
}
}
});
}
if (changeHour_1) {
setHours(function (h) {
if (h > 0) {
return h - 1;
}
else {
changeDay_1 = true;
if (dZero) {
hZero = true;
return 0;
}
if (!dZero) {
return 23;
}
else {
return 0;
}
}
});
}
if (changeDay_1) {
setDays(function (d) {
if (d > 0) {
return d - 1;
}
else {
dZero = true;
return 0;
}
});
}
}
else {
setDays(0);
setMinutes(0);
setHours(0);
setSeconds(0);
clearInterval(timer);
}
};
var startCountdown = function () {
var interval = setInterval(handleCountdown, 1000);
setLoading(false);
timer = interval;
return interval;
};
return (React__default['default'].createElement(CountdownContext.Provider, { value: {
days: days,
hasError: hasError,
hours: hours,
initializeCountdown: initializeCountdown,
loading: loading,
minutes: minutes,
seconds: seconds,
setTimerError: setTimerError,
startCountdown: startCountdown,
timer: timer
} }, children));
};
function useCountdown() {
var context = React.useContext(CountdownContext);
if (!context) {
throw new Error('useCountdown must be used within a CountdownProvider');
}
return context;
}
exports.CountdownProvider = CountdownProvider;
exports.useCountdown = useCountdown;