UNPKG

@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
"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