@coinmeca/ui
Version:
This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).
78 lines • 2.75 kB
JSX
"use client";
import { useCallback, useMemo, useState } from "react";
export default function useTime(initial) {
const [date, setDate] = useState({
secs: initial?.secs || 0,
days: initial?.days || 0,
weeks: initial?.weeks || 0,
months: initial?.months || 0,
years: initial?.years || 0,
});
const times = useMemo(() => ({
day: 86_400,
week: 604_800,
month: 2_628_000,
year: 31_536_000,
}), []);
const resolve = useCallback((time, type) => {
switch (type) {
case 'days':
time *= times.day;
break;
case 'weeks':
time *= times.week;
break;
case 'months':
time *= times.month;
break;
case 'years':
time *= times.year;
break;
}
return parseInt(time?.toString());
}, [times]);
const sec = useCallback((...args) => {
const secs = resolve((args?.length > 1 && typeof args[1] === 'number') ? args[1] - args[0] : args[0], (args?.length === 3 && typeof args[2] === 'string') ? args[2] : (args?.length === 2 && typeof args[1] === 'string') ? args[1] : undefined);
return {
secs,
days: secs / times.day,
weeks: secs / times.week,
months: secs / times.month,
years: secs / times.year,
};
}, [resolve, times.day, times.week, times.month, times.year]);
const day = useCallback((...args) => ({ ...sec(...args) }), [sec]);
const week = useCallback((...args) => ({ ...sec(...args) }), [sec]);
const month = useCallback((...args) => ({ ...sec(...args) }), [sec]);
const year = useCallback((...args) => ({ ...sec(...args) }), [sec]);
const set = useCallback((time, type) => {
const date = sec(time, type);
setDate(date);
return date;
}, [sec]);
const secs = useCallback((time) => set(time), [set]);
const days = useCallback((time) => set(time, 'days'), [set]);
const weeks = useCallback((time) => set(time, 'weeks'), [set]);
const months = useCallback((time) => set(time, 'months'), [set]);
const years = useCallback((time) => set(time, 'years'), [set]);
const now = useMemo(() => Math.floor(Date.now() / 1000), []);
const end = useMemo(() => now + date.secs, [now, date]);
const when = useCallback((...args) => now + sec(...args).secs, [now, sec]);
return {
date,
now,
end,
when,
sec,
secs,
day,
days,
week,
weeks,
month,
months,
year,
years,
};
}
//# sourceMappingURL=useTime.jsx.map