@taglivros/tag-hooks
Version:
A Collection of React Hooks created by [@taglivros](https://site.taglivros.com/)
159 lines (156 loc) • 5.68 kB
JavaScript
import React, { createContext, useState, useContext } from 'react';
import { differenceInDays, differenceInHours, differenceInMinutes, differenceInSeconds } from 'date-fns';
/* eslint-disable no-console */
var CountdownContext = createContext({});
var CountdownProvider = function (_a) {
var children = _a.children;
var _b = useState(1), seconds = _b[0], setSeconds = _b[1];
var _c = useState(1), minutes = _c[0], setMinutes = _c[1];
var _d = useState(1), hours = _d[0], setHours = _d[1];
var _e = useState(1), days = _e[0], setDays = _e[1];
var _f = useState(true), loading = _f[0], setLoading = _f[1];
var _g = 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 = differenceInDays(endTime, new Date());
var diffHours = differenceInHours(endTime, new Date());
var diffMins = differenceInMinutes(endTime, new Date());
var diffSecs = 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.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 = useContext(CountdownContext);
if (!context) {
throw new Error('useCountdown must be used within a CountdownProvider');
}
return context;
}
export { CountdownProvider, useCountdown };