@w3ux/hooks 1.3.1-beta.0 → 1.3.1-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/cjs/index.d.ts +1 -1
  2. package/cjs/index.js +1 -1
  3. package/cjs/index.js.map +1 -1
  4. package/cjs/{useTimeleft → useTimeLeft}/defaults.js.map +1 -1
  5. package/cjs/{useTimeleft → useTimeLeft}/index.js.map +1 -1
  6. package/cjs/{useTimeleft → useTimeLeft}/types.js.map +1 -1
  7. package/cjs/useTimeLeft/utils.d.ts +4 -0
  8. package/cjs/useTimeLeft/utils.js +69 -0
  9. package/cjs/useTimeLeft/utils.js.map +1 -0
  10. package/cjs/util.d.ts +0 -0
  11. package/cjs/util.js +5 -0
  12. package/cjs/util.js.map +1 -0
  13. package/mjs/index.d.ts +1 -1
  14. package/mjs/index.js +1 -1
  15. package/mjs/index.js.map +1 -1
  16. package/mjs/{useTimeleft → useTimeLeft}/defaults.js.map +1 -1
  17. package/mjs/{useTimeleft → useTimeLeft}/index.js.map +1 -1
  18. package/mjs/{useTimeleft → useTimeLeft}/types.js.map +1 -1
  19. package/mjs/useTimeLeft/utils.d.ts +4 -0
  20. package/mjs/{useTimeleft → useTimeLeft}/utils.js +31 -0
  21. package/mjs/useTimeLeft/utils.js.map +1 -0
  22. package/mjs/util.d.ts +0 -0
  23. package/mjs/util.js +5 -0
  24. package/mjs/util.js.map +1 -0
  25. package/package.json +5 -1
  26. package/cjs/useTimeleft/utils.d.ts +0 -2
  27. package/cjs/useTimeleft/utils.js +0 -36
  28. package/cjs/useTimeleft/utils.js.map +0 -1
  29. package/mjs/useTimeleft/utils.d.ts +0 -2
  30. package/mjs/useTimeleft/utils.js.map +0 -1
  31. /package/cjs/{useTimeleft → useTimeLeft}/defaults.d.ts +0 -0
  32. /package/cjs/{useTimeleft → useTimeLeft}/defaults.js +0 -0
  33. /package/cjs/{useTimeleft → useTimeLeft}/index.d.ts +0 -0
  34. /package/cjs/{useTimeleft → useTimeLeft}/index.js +0 -0
  35. /package/cjs/{useTimeleft → useTimeLeft}/types.d.ts +0 -0
  36. /package/cjs/{useTimeleft → useTimeLeft}/types.js +0 -0
  37. /package/mjs/{useTimeleft → useTimeLeft}/defaults.d.ts +0 -0
  38. /package/mjs/{useTimeleft → useTimeLeft}/defaults.js +0 -0
  39. /package/mjs/{useTimeleft → useTimeLeft}/index.d.ts +0 -0
  40. /package/mjs/{useTimeleft → useTimeLeft}/index.js +0 -0
  41. /package/mjs/{useTimeleft → useTimeLeft}/types.d.ts +0 -0
  42. /package/mjs/{useTimeleft → useTimeLeft}/types.js +0 -0
package/cjs/index.d.ts CHANGED
@@ -2,4 +2,4 @@ export * from "./useEffectIgnoreInitial";
2
2
  export * from "./useOnResize";
3
3
  export * from "./useOutsideAlerter";
4
4
  export * from "./useSize";
5
- export * from "./useTimeleft";
5
+ export * from "./useTimeLeft";
package/cjs/index.js CHANGED
@@ -18,7 +18,7 @@ __exportStar(require("./useEffectIgnoreInitial"), exports);
18
18
  __exportStar(require("./useOnResize"), exports);
19
19
  __exportStar(require("./useOutsideAlerter"), exports);
20
20
  __exportStar(require("./useSize"), exports);
21
- __exportStar(require("./useTimeleft"), exports);
21
+ __exportStar(require("./useTimeLeft"), exports);
22
22
 
23
23
  //# sourceMappingURL=index.js.map
24
24
 
package/cjs/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAGA,2DAAyC;AACzC,gDAA8B;AAC9B,sDAAoC;AACpC,4CAA0B;AAC1B,gDAA8B","file":"index.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nexport * from \"./useEffectIgnoreInitial\";\nexport * from \"./useOnResize\";\nexport * from \"./useOutsideAlerter\";\nexport * from \"./useSize\";\nexport * from \"./useTimeleft\";\n"]}
1
+ {"version":3,"sources":["../src/index.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAGA,2DAAyC;AACzC,gDAA8B;AAC9B,sDAAoC;AACpC,4CAA0B;AAC1B,gDAA8B","file":"index.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nexport * from \"./useEffectIgnoreInitial\";\nexport * from \"./useOnResize\";\nexport * from \"./useOutsideAlerter\";\nexport * from \"./useSize\";\nexport * from \"./useTimeLeft\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/useTimeleft/defaults.ts"],"names":[],"mappings":";;;AAKa,QAAA,eAAe,GAAqB;IAC/C,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;IACR,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,CAAC;IACV,UAAU,EAAE,KAAK;CAClB,CAAC;AAEW,QAAA,sBAAsB,GAAG,EAAE,CAAC","file":"defaults.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { TimeleftDuration } from \"./types\";\n\nexport const defaultDuration: TimeleftDuration = {\n days: 0,\n hours: 0,\n minutes: 0,\n seconds: 0,\n lastMinute: false,\n};\n\nexport const defaultRefreshInterval = 60;\n"]}
1
+ {"version":3,"sources":["../src/useTimeLeft/defaults.ts"],"names":[],"mappings":";;;AAKa,QAAA,eAAe,GAAqB;IAC/C,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;IACR,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,CAAC;IACV,UAAU,EAAE,KAAK;CAClB,CAAC;AAEW,QAAA,sBAAsB,GAAG,EAAE,CAAC","file":"defaults.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { TimeleftDuration } from \"./types\";\n\nexport const defaultDuration: TimeleftDuration = {\n days: 0,\n hours: 0,\n minutes: 0,\n seconds: 0,\n lastMinute: false,\n};\n\nexport const defaultRefreshInterval = 60;\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/useTimeleft/index.tsx"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { setStateWithRef } from \"@w3ux/utils\";\nimport { useEffect, useRef, useState } from \"react\";\nimport type {\n TimeLeftAll,\n TimeLeftRaw,\n TimeleftDuration,\n UseTimeleftProps,\n} from \"./types\";\nimport { getDuration } from \"./utils\";\n\nexport const useTimeLeft = (props?: UseTimeleftProps) => {\n const depsTimeleft = props?.depsTimeleft || [];\n const depsFormat = props?.depsFormat || [];\n\n // check whether timeleft is within a minute of finishing.\n const inLastHour = () => {\n const { days, hours } = getDuration(toRef.current);\n return !days && !hours;\n };\n\n // get the amount of seconds left if timeleft is in the last minute.\n const lastMinuteCountdown = () => {\n const { seconds } = getDuration(toRef.current);\n if (!inLastHour()) {\n return 60;\n }\n return seconds;\n };\n\n // calculate resulting timeleft object from latest duration.\n const getTimeleft = (c?: TimeleftDuration): TimeLeftAll => {\n const { days, hours, minutes, seconds } = c || getDuration(toRef.current);\n const raw: TimeLeftRaw = {\n days,\n hours,\n minutes,\n };\n if (!days && !hours) {\n raw.seconds = seconds;\n }\n return {\n raw,\n };\n };\n\n // the end time as a date.\n const [to, setTo] = useState<Date | null>(null);\n const toRef = useRef(to);\n\n // resulting timeleft object to be returned.\n const [timeleft, setTimeleft] = useState<TimeLeftAll>(getTimeleft());\n\n // timeleft refresh intervals.\n const [minInterval, setMinInterval] = useState<\n ReturnType<typeof setInterval> | undefined\n >(undefined);\n const minIntervalRef = useRef(minInterval);\n\n const [secInterval, setSecInterval] = useState<\n ReturnType<typeof setInterval> | undefined\n >(undefined);\n const secIntervalRef = useRef(secInterval);\n\n // refresh effects.\n useEffect(() => {\n setTimeleft(getTimeleft());\n if (inLastHour()) {\n // refresh timeleft every second.\n if (!secIntervalRef.current) {\n const interval = setInterval(() => {\n if (!inLastHour()) {\n clearInterval(secIntervalRef.current);\n setStateWithRef(undefined, setSecInterval, secIntervalRef);\n }\n setTimeleft(getTimeleft());\n }, 1000);\n\n setStateWithRef(interval, setSecInterval, secIntervalRef);\n }\n }\n // refresh timeleft every minute.\n else if (!minIntervalRef.current) {\n const interval = setInterval(() => {\n if (inLastHour()) {\n clearInterval(minIntervalRef.current);\n setStateWithRef(undefined, setMinInterval, minIntervalRef);\n }\n setTimeleft(getTimeleft());\n }, 60000);\n setStateWithRef(interval, setMinInterval, minIntervalRef);\n }\n }, [to, inLastHour(), lastMinuteCountdown(), ...depsTimeleft]);\n\n // re-render the timeleft upon formatting changes.\n useEffect(() => {\n setTimeleft(getTimeleft());\n }, [...depsFormat]);\n\n // clear intervals on unmount\n useEffect(\n () => () => {\n clearInterval(minInterval);\n clearInterval(secInterval);\n },\n []\n );\n\n const setFromNow = (dateFrom: Date, dateTo: Date) => {\n setTimeleft(getTimeleft(getDuration(dateFrom)));\n setStateWithRef(dateTo, setTo, toRef);\n };\n\n return {\n setFromNow,\n timeleft,\n };\n};\n"]}
1
+ {"version":3,"sources":["../src/useTimeLeft/index.tsx"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { setStateWithRef } from \"@w3ux/utils\";\nimport { useEffect, useRef, useState } from \"react\";\nimport type {\n TimeLeftAll,\n TimeLeftRaw,\n TimeleftDuration,\n UseTimeleftProps,\n} from \"./types\";\nimport { getDuration } from \"./utils\";\n\nexport const useTimeLeft = (props?: UseTimeleftProps) => {\n const depsTimeleft = props?.depsTimeleft || [];\n const depsFormat = props?.depsFormat || [];\n\n // check whether timeleft is within a minute of finishing.\n const inLastHour = () => {\n const { days, hours } = getDuration(toRef.current);\n return !days && !hours;\n };\n\n // get the amount of seconds left if timeleft is in the last minute.\n const lastMinuteCountdown = () => {\n const { seconds } = getDuration(toRef.current);\n if (!inLastHour()) {\n return 60;\n }\n return seconds;\n };\n\n // calculate resulting timeleft object from latest duration.\n const getTimeleft = (c?: TimeleftDuration): TimeLeftAll => {\n const { days, hours, minutes, seconds } = c || getDuration(toRef.current);\n const raw: TimeLeftRaw = {\n days,\n hours,\n minutes,\n };\n if (!days && !hours) {\n raw.seconds = seconds;\n }\n return {\n raw,\n };\n };\n\n // the end time as a date.\n const [to, setTo] = useState<Date | null>(null);\n const toRef = useRef(to);\n\n // resulting timeleft object to be returned.\n const [timeleft, setTimeleft] = useState<TimeLeftAll>(getTimeleft());\n\n // timeleft refresh intervals.\n const [minInterval, setMinInterval] = useState<\n ReturnType<typeof setInterval> | undefined\n >(undefined);\n const minIntervalRef = useRef(minInterval);\n\n const [secInterval, setSecInterval] = useState<\n ReturnType<typeof setInterval> | undefined\n >(undefined);\n const secIntervalRef = useRef(secInterval);\n\n // refresh effects.\n useEffect(() => {\n setTimeleft(getTimeleft());\n if (inLastHour()) {\n // refresh timeleft every second.\n if (!secIntervalRef.current) {\n const interval = setInterval(() => {\n if (!inLastHour()) {\n clearInterval(secIntervalRef.current);\n setStateWithRef(undefined, setSecInterval, secIntervalRef);\n }\n setTimeleft(getTimeleft());\n }, 1000);\n\n setStateWithRef(interval, setSecInterval, secIntervalRef);\n }\n }\n // refresh timeleft every minute.\n else if (!minIntervalRef.current) {\n const interval = setInterval(() => {\n if (inLastHour()) {\n clearInterval(minIntervalRef.current);\n setStateWithRef(undefined, setMinInterval, minIntervalRef);\n }\n setTimeleft(getTimeleft());\n }, 60000);\n setStateWithRef(interval, setMinInterval, minIntervalRef);\n }\n }, [to, inLastHour(), lastMinuteCountdown(), ...depsTimeleft]);\n\n // re-render the timeleft upon formatting changes.\n useEffect(() => {\n setTimeleft(getTimeleft());\n }, [...depsFormat]);\n\n // clear intervals on unmount\n useEffect(\n () => () => {\n clearInterval(minInterval);\n clearInterval(secInterval);\n },\n []\n );\n\n // Set the end time and calculate timeleft.\n const setFromNow = (dateFrom: Date, dateTo: Date) => {\n setTimeleft(getTimeleft(getDuration(dateFrom)));\n setStateWithRef(dateTo, setTo, toRef);\n };\n\n return {\n setFromNow,\n timeleft,\n };\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/useTimeleft/types.ts"],"names":[],"mappings":"","file":"types.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nexport interface UseTimeleftProps {\n // Dependencies to trigger re-calculation of timeleft.\n depsTimeleft: unknown[];\n // Dependencies to trigger re-render of timeleft, e.g. if language switching occurs.\n depsFormat: unknown[];\n}\n\nexport interface TimeleftDuration {\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n lastMinute: boolean;\n}\n\nexport interface TimeLeftRaw {\n days: number;\n hours: number;\n minutes: number;\n seconds?: number;\n}\n\nexport interface TimeLeftFormatted {\n days: [number, string];\n hours: [number, string];\n minutes: [number, string];\n seconds?: [number, string];\n}\n\nexport interface TimeLeftAll {\n raw: TimeLeftRaw;\n}\n\nexport interface TimeleftHookProps {\n refreshInterval: number;\n}\n"]}
1
+ {"version":3,"sources":["../src/useTimeLeft/types.ts"],"names":[],"mappings":"","file":"types.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nexport interface UseTimeleftProps {\n // Dependencies to trigger re-calculation of timeleft.\n depsTimeleft: unknown[];\n // Dependencies to trigger re-render of timeleft, e.g. if language switching occurs.\n depsFormat: unknown[];\n}\n\nexport interface TimeleftDuration {\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n lastMinute: boolean;\n}\n\nexport interface TimeLeftRaw {\n days: number;\n hours: number;\n minutes: number;\n seconds?: number;\n}\n\nexport interface TimeLeftFormatted {\n days: [number, string];\n hours: [number, string];\n minutes: [number, string];\n seconds?: [number, string];\n}\n\nexport interface TimeLeftAll {\n raw: TimeLeftRaw;\n}\n\nexport interface TimeleftHookProps {\n refreshInterval: number;\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import type { TimeleftDuration } from "./types";
2
+ export declare const getDuration: (toDate: Date | null) => TimeleftDuration;
3
+ export declare const secondsFromNow: (seconds: number) => Date;
4
+ export declare const getDurationFromNow: (toDate: Date | null) => TimeleftDuration;
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getDurationFromNow = exports.secondsFromNow = exports.getDuration = void 0;
4
+ const date_fns_1 = require("date-fns");
5
+ const defaults_1 = require("./defaults");
6
+ const getDuration = (toDate) => {
7
+ if (!toDate) {
8
+ return defaults_1.defaultDuration;
9
+ }
10
+ if ((0, date_fns_1.getUnixTime)(toDate) <= (0, date_fns_1.getUnixTime)(new Date())) {
11
+ return defaults_1.defaultDuration;
12
+ }
13
+ toDate.setSeconds(toDate.getSeconds());
14
+ const d = (0, date_fns_1.intervalToDuration)({
15
+ start: Date.now(),
16
+ end: toDate,
17
+ });
18
+ const days = (0, date_fns_1.differenceInDays)(toDate, Date.now());
19
+ const hours = (d === null || d === void 0 ? void 0 : d.hours) || 0;
20
+ const minutes = (d === null || d === void 0 ? void 0 : d.minutes) || 0;
21
+ const seconds = (d === null || d === void 0 ? void 0 : d.seconds) || 0;
22
+ const lastHour = days === 0 && hours === 0;
23
+ const lastMinute = lastHour && minutes === 0;
24
+ return {
25
+ days,
26
+ hours,
27
+ minutes,
28
+ seconds,
29
+ lastMinute,
30
+ };
31
+ };
32
+ exports.getDuration = getDuration;
33
+ const secondsFromNow = (seconds) => {
34
+ const end = new Date();
35
+ end.setSeconds(end.getSeconds() + seconds);
36
+ return end;
37
+ };
38
+ exports.secondsFromNow = secondsFromNow;
39
+ const getDurationFromNow = (toDate) => {
40
+ if (!toDate) {
41
+ return defaults_1.defaultDuration;
42
+ }
43
+ if ((0, date_fns_1.getUnixTime)(toDate) <= (0, date_fns_1.getUnixTime)(new Date())) {
44
+ return defaults_1.defaultDuration;
45
+ }
46
+ toDate.setSeconds(toDate.getSeconds());
47
+ const d = (0, date_fns_1.intervalToDuration)({
48
+ start: Date.now(),
49
+ end: toDate,
50
+ });
51
+ const days = (0, date_fns_1.differenceInDays)(toDate, Date.now());
52
+ const hours = (d === null || d === void 0 ? void 0 : d.hours) || 0;
53
+ const minutes = (d === null || d === void 0 ? void 0 : d.minutes) || 0;
54
+ const seconds = (d === null || d === void 0 ? void 0 : d.seconds) || 0;
55
+ const lastHour = days === 0 && hours === 0;
56
+ const lastMinute = lastHour && minutes === 0;
57
+ return {
58
+ days,
59
+ hours,
60
+ minutes,
61
+ seconds,
62
+ lastMinute,
63
+ };
64
+ };
65
+ exports.getDurationFromNow = getDurationFromNow;
66
+
67
+ //# sourceMappingURL=utils.js.map
68
+
69
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/useTimeLeft/utils.ts"],"names":[],"mappings":"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","file":"utils.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { differenceInDays, getUnixTime, intervalToDuration } from \"date-fns\";\nimport { defaultDuration } from \"./defaults\";\nimport type { TimeleftDuration } from \"./types\";\n\n// calculates the current timeleft duration.\nexport const getDuration = (toDate: Date | null): TimeleftDuration => {\n if (!toDate) {\n return defaultDuration;\n }\n if (getUnixTime(toDate) <= getUnixTime(new Date())) {\n return defaultDuration;\n }\n\n toDate.setSeconds(toDate.getSeconds());\n const d = intervalToDuration({\n start: Date.now(),\n end: toDate,\n });\n\n const days = differenceInDays(toDate, Date.now());\n const hours = d?.hours || 0;\n const minutes = d?.minutes || 0;\n const seconds = d?.seconds || 0;\n const lastHour = days === 0 && hours === 0;\n const lastMinute = lastHour && minutes === 0;\n\n return {\n days,\n hours,\n minutes,\n seconds,\n lastMinute,\n };\n};\n\n// Helper: Adds `seconds` to the current time and returns the resulting date.\nexport const secondsFromNow = (seconds: number): Date => {\n const end = new Date();\n end.setSeconds(end.getSeconds() + seconds);\n return end;\n};\n\n// Helper: Calculates the duration between the current time and the provided date.\nexport const getDurationFromNow = (toDate: Date | null): TimeleftDuration => {\n if (!toDate) {\n return defaultDuration;\n }\n if (getUnixTime(toDate) <= getUnixTime(new Date())) {\n return defaultDuration;\n }\n\n toDate.setSeconds(toDate.getSeconds());\n const d = intervalToDuration({\n start: Date.now(),\n end: toDate,\n });\n\n const days = differenceInDays(toDate, Date.now());\n const hours = d?.hours || 0;\n const minutes = d?.minutes || 0;\n const seconds = d?.seconds || 0;\n const lastHour = days === 0 && hours === 0;\n const lastMinute = lastHour && minutes === 0;\n\n return {\n days,\n hours,\n minutes,\n seconds,\n lastMinute,\n };\n};\n"]}
package/cjs/util.d.ts ADDED
File without changes
package/cjs/util.js ADDED
@@ -0,0 +1,5 @@
1
+
2
+
3
+ //# sourceMappingURL=util.js.map
4
+
5
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/util.ts"],"names":[],"mappings":"","file":"util.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\n"]}
package/mjs/index.d.ts CHANGED
@@ -2,4 +2,4 @@ export * from "./useEffectIgnoreInitial";
2
2
  export * from "./useOnResize";
3
3
  export * from "./useOutsideAlerter";
4
4
  export * from "./useSize";
5
- export * from "./useTimeleft";
5
+ export * from "./useTimeLeft";
package/mjs/index.js CHANGED
@@ -2,7 +2,7 @@ export * from "./useEffectIgnoreInitial";
2
2
  export * from "./useOnResize";
3
3
  export * from "./useOutsideAlerter";
4
4
  export * from "./useSize";
5
- export * from "./useTimeleft";
5
+ export * from "./useTimeLeft";
6
6
 
7
7
  //# sourceMappingURL=index.js.map
8
8
 
package/mjs/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.tsx"],"names":[],"mappings":"AAGA,cAAc,0BAA0B,CAAC;AACzC,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC","file":"index.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nexport * from \"./useEffectIgnoreInitial\";\nexport * from \"./useOnResize\";\nexport * from \"./useOutsideAlerter\";\nexport * from \"./useSize\";\nexport * from \"./useTimeleft\";\n"]}
1
+ {"version":3,"sources":["../src/index.tsx"],"names":[],"mappings":"AAGA,cAAc,0BAA0B,CAAC;AACzC,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC","file":"index.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nexport * from \"./useEffectIgnoreInitial\";\nexport * from \"./useOnResize\";\nexport * from \"./useOutsideAlerter\";\nexport * from \"./useSize\";\nexport * from \"./useTimeLeft\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/useTimeleft/defaults.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,eAAe,GAAqB;IAC/C,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;IACR,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,CAAC;IACV,UAAU,EAAE,KAAK;CAClB,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC","file":"defaults.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { TimeleftDuration } from \"./types\";\n\nexport const defaultDuration: TimeleftDuration = {\n days: 0,\n hours: 0,\n minutes: 0,\n seconds: 0,\n lastMinute: false,\n};\n\nexport const defaultRefreshInterval = 60;\n"]}
1
+ {"version":3,"sources":["../src/useTimeLeft/defaults.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,eAAe,GAAqB;IAC/C,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;IACR,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,CAAC;IACV,UAAU,EAAE,KAAK;CAClB,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC","file":"defaults.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { TimeleftDuration } from \"./types\";\n\nexport const defaultDuration: TimeleftDuration = {\n days: 0,\n hours: 0,\n minutes: 0,\n seconds: 0,\n lastMinute: false,\n};\n\nexport const defaultRefreshInterval = 60;\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/useTimeleft/index.tsx"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { setStateWithRef } from \"@w3ux/utils\";\nimport { useEffect, useRef, useState } from \"react\";\nimport type {\n TimeLeftAll,\n TimeLeftRaw,\n TimeleftDuration,\n UseTimeleftProps,\n} from \"./types\";\nimport { getDuration } from \"./utils\";\n\nexport const useTimeLeft = (props?: UseTimeleftProps) => {\n const depsTimeleft = props?.depsTimeleft || [];\n const depsFormat = props?.depsFormat || [];\n\n // check whether timeleft is within a minute of finishing.\n const inLastHour = () => {\n const { days, hours } = getDuration(toRef.current);\n return !days && !hours;\n };\n\n // get the amount of seconds left if timeleft is in the last minute.\n const lastMinuteCountdown = () => {\n const { seconds } = getDuration(toRef.current);\n if (!inLastHour()) {\n return 60;\n }\n return seconds;\n };\n\n // calculate resulting timeleft object from latest duration.\n const getTimeleft = (c?: TimeleftDuration): TimeLeftAll => {\n const { days, hours, minutes, seconds } = c || getDuration(toRef.current);\n const raw: TimeLeftRaw = {\n days,\n hours,\n minutes,\n };\n if (!days && !hours) {\n raw.seconds = seconds;\n }\n return {\n raw,\n };\n };\n\n // the end time as a date.\n const [to, setTo] = useState<Date | null>(null);\n const toRef = useRef(to);\n\n // resulting timeleft object to be returned.\n const [timeleft, setTimeleft] = useState<TimeLeftAll>(getTimeleft());\n\n // timeleft refresh intervals.\n const [minInterval, setMinInterval] = useState<\n ReturnType<typeof setInterval> | undefined\n >(undefined);\n const minIntervalRef = useRef(minInterval);\n\n const [secInterval, setSecInterval] = useState<\n ReturnType<typeof setInterval> | undefined\n >(undefined);\n const secIntervalRef = useRef(secInterval);\n\n // refresh effects.\n useEffect(() => {\n setTimeleft(getTimeleft());\n if (inLastHour()) {\n // refresh timeleft every second.\n if (!secIntervalRef.current) {\n const interval = setInterval(() => {\n if (!inLastHour()) {\n clearInterval(secIntervalRef.current);\n setStateWithRef(undefined, setSecInterval, secIntervalRef);\n }\n setTimeleft(getTimeleft());\n }, 1000);\n\n setStateWithRef(interval, setSecInterval, secIntervalRef);\n }\n }\n // refresh timeleft every minute.\n else if (!minIntervalRef.current) {\n const interval = setInterval(() => {\n if (inLastHour()) {\n clearInterval(minIntervalRef.current);\n setStateWithRef(undefined, setMinInterval, minIntervalRef);\n }\n setTimeleft(getTimeleft());\n }, 60000);\n setStateWithRef(interval, setMinInterval, minIntervalRef);\n }\n }, [to, inLastHour(), lastMinuteCountdown(), ...depsTimeleft]);\n\n // re-render the timeleft upon formatting changes.\n useEffect(() => {\n setTimeleft(getTimeleft());\n }, [...depsFormat]);\n\n // clear intervals on unmount\n useEffect(\n () => () => {\n clearInterval(minInterval);\n clearInterval(secInterval);\n },\n []\n );\n\n const setFromNow = (dateFrom: Date, dateTo: Date) => {\n setTimeleft(getTimeleft(getDuration(dateFrom)));\n setStateWithRef(dateTo, setTo, toRef);\n };\n\n return {\n setFromNow,\n timeleft,\n };\n};\n"]}
1
+ {"version":3,"sources":["../src/useTimeLeft/index.tsx"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { setStateWithRef } from \"@w3ux/utils\";\nimport { useEffect, useRef, useState } from \"react\";\nimport type {\n TimeLeftAll,\n TimeLeftRaw,\n TimeleftDuration,\n UseTimeleftProps,\n} from \"./types\";\nimport { getDuration } from \"./utils\";\n\nexport const useTimeLeft = (props?: UseTimeleftProps) => {\n const depsTimeleft = props?.depsTimeleft || [];\n const depsFormat = props?.depsFormat || [];\n\n // check whether timeleft is within a minute of finishing.\n const inLastHour = () => {\n const { days, hours } = getDuration(toRef.current);\n return !days && !hours;\n };\n\n // get the amount of seconds left if timeleft is in the last minute.\n const lastMinuteCountdown = () => {\n const { seconds } = getDuration(toRef.current);\n if (!inLastHour()) {\n return 60;\n }\n return seconds;\n };\n\n // calculate resulting timeleft object from latest duration.\n const getTimeleft = (c?: TimeleftDuration): TimeLeftAll => {\n const { days, hours, minutes, seconds } = c || getDuration(toRef.current);\n const raw: TimeLeftRaw = {\n days,\n hours,\n minutes,\n };\n if (!days && !hours) {\n raw.seconds = seconds;\n }\n return {\n raw,\n };\n };\n\n // the end time as a date.\n const [to, setTo] = useState<Date | null>(null);\n const toRef = useRef(to);\n\n // resulting timeleft object to be returned.\n const [timeleft, setTimeleft] = useState<TimeLeftAll>(getTimeleft());\n\n // timeleft refresh intervals.\n const [minInterval, setMinInterval] = useState<\n ReturnType<typeof setInterval> | undefined\n >(undefined);\n const minIntervalRef = useRef(minInterval);\n\n const [secInterval, setSecInterval] = useState<\n ReturnType<typeof setInterval> | undefined\n >(undefined);\n const secIntervalRef = useRef(secInterval);\n\n // refresh effects.\n useEffect(() => {\n setTimeleft(getTimeleft());\n if (inLastHour()) {\n // refresh timeleft every second.\n if (!secIntervalRef.current) {\n const interval = setInterval(() => {\n if (!inLastHour()) {\n clearInterval(secIntervalRef.current);\n setStateWithRef(undefined, setSecInterval, secIntervalRef);\n }\n setTimeleft(getTimeleft());\n }, 1000);\n\n setStateWithRef(interval, setSecInterval, secIntervalRef);\n }\n }\n // refresh timeleft every minute.\n else if (!minIntervalRef.current) {\n const interval = setInterval(() => {\n if (inLastHour()) {\n clearInterval(minIntervalRef.current);\n setStateWithRef(undefined, setMinInterval, minIntervalRef);\n }\n setTimeleft(getTimeleft());\n }, 60000);\n setStateWithRef(interval, setMinInterval, minIntervalRef);\n }\n }, [to, inLastHour(), lastMinuteCountdown(), ...depsTimeleft]);\n\n // re-render the timeleft upon formatting changes.\n useEffect(() => {\n setTimeleft(getTimeleft());\n }, [...depsFormat]);\n\n // clear intervals on unmount\n useEffect(\n () => () => {\n clearInterval(minInterval);\n clearInterval(secInterval);\n },\n []\n );\n\n // Set the end time and calculate timeleft.\n const setFromNow = (dateFrom: Date, dateTo: Date) => {\n setTimeleft(getTimeleft(getDuration(dateFrom)));\n setStateWithRef(dateTo, setTo, toRef);\n };\n\n return {\n setFromNow,\n timeleft,\n };\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/useTimeleft/types.ts"],"names":[],"mappings":"","file":"types.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nexport interface UseTimeleftProps {\n // Dependencies to trigger re-calculation of timeleft.\n depsTimeleft: unknown[];\n // Dependencies to trigger re-render of timeleft, e.g. if language switching occurs.\n depsFormat: unknown[];\n}\n\nexport interface TimeleftDuration {\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n lastMinute: boolean;\n}\n\nexport interface TimeLeftRaw {\n days: number;\n hours: number;\n minutes: number;\n seconds?: number;\n}\n\nexport interface TimeLeftFormatted {\n days: [number, string];\n hours: [number, string];\n minutes: [number, string];\n seconds?: [number, string];\n}\n\nexport interface TimeLeftAll {\n raw: TimeLeftRaw;\n}\n\nexport interface TimeleftHookProps {\n refreshInterval: number;\n}\n"]}
1
+ {"version":3,"sources":["../src/useTimeLeft/types.ts"],"names":[],"mappings":"","file":"types.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nexport interface UseTimeleftProps {\n // Dependencies to trigger re-calculation of timeleft.\n depsTimeleft: unknown[];\n // Dependencies to trigger re-render of timeleft, e.g. if language switching occurs.\n depsFormat: unknown[];\n}\n\nexport interface TimeleftDuration {\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n lastMinute: boolean;\n}\n\nexport interface TimeLeftRaw {\n days: number;\n hours: number;\n minutes: number;\n seconds?: number;\n}\n\nexport interface TimeLeftFormatted {\n days: [number, string];\n hours: [number, string];\n minutes: [number, string];\n seconds?: [number, string];\n}\n\nexport interface TimeLeftAll {\n raw: TimeLeftRaw;\n}\n\nexport interface TimeleftHookProps {\n refreshInterval: number;\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import type { TimeleftDuration } from "./types";
2
+ export declare const getDuration: (toDate: Date | null) => TimeleftDuration;
3
+ export declare const secondsFromNow: (seconds: number) => Date;
4
+ export declare const getDurationFromNow: (toDate: Date | null) => TimeleftDuration;
@@ -26,6 +26,37 @@ export const getDuration = (toDate) => {
26
26
  lastMinute,
27
27
  };
28
28
  };
29
+ export const secondsFromNow = (seconds) => {
30
+ const end = new Date();
31
+ end.setSeconds(end.getSeconds() + seconds);
32
+ return end;
33
+ };
34
+ export const getDurationFromNow = (toDate) => {
35
+ if (!toDate) {
36
+ return defaultDuration;
37
+ }
38
+ if (getUnixTime(toDate) <= getUnixTime(new Date())) {
39
+ return defaultDuration;
40
+ }
41
+ toDate.setSeconds(toDate.getSeconds());
42
+ const d = intervalToDuration({
43
+ start: Date.now(),
44
+ end: toDate,
45
+ });
46
+ const days = differenceInDays(toDate, Date.now());
47
+ const hours = d?.hours || 0;
48
+ const minutes = d?.minutes || 0;
49
+ const seconds = d?.seconds || 0;
50
+ const lastHour = days === 0 && hours === 0;
51
+ const lastMinute = lastHour && minutes === 0;
52
+ return {
53
+ days,
54
+ hours,
55
+ minutes,
56
+ seconds,
57
+ lastMinute,
58
+ };
59
+ };
29
60
 
30
61
  //# sourceMappingURL=utils.js.map
31
62
 
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/useTimeLeft/utils.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAI7C,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,MAAmB,EAAoB,EAAE;IACnE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,eAAe,CAAC;IACzB,CAAC;IACD,IAAI,WAAW,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC;QACnD,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;IACvC,MAAM,CAAC,GAAG,kBAAkB,CAAC;QAC3B,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE;QACjB,GAAG,EAAE,MAAM;KACZ,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;IAC5B,MAAM,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,QAAQ,IAAI,OAAO,KAAK,CAAC,CAAC;IAE7C,OAAO;QACL,IAAI;QACJ,KAAK;QACL,OAAO;QACP,OAAO;QACP,UAAU;KACX,CAAC;AACJ,CAAC,CAAC;AAGF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAe,EAAQ,EAAE;IACtD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,OAAO,CAAC,CAAC;IAC3C,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AAGF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,MAAmB,EAAoB,EAAE;IAC1E,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,eAAe,CAAC;IACzB,CAAC;IACD,IAAI,WAAW,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC;QACnD,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;IACvC,MAAM,CAAC,GAAG,kBAAkB,CAAC;QAC3B,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE;QACjB,GAAG,EAAE,MAAM;KACZ,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;IAC5B,MAAM,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,QAAQ,IAAI,OAAO,KAAK,CAAC,CAAC;IAE7C,OAAO;QACL,IAAI;QACJ,KAAK;QACL,OAAO;QACP,OAAO;QACP,UAAU;KACX,CAAC;AACJ,CAAC,CAAC","file":"utils.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { differenceInDays, getUnixTime, intervalToDuration } from \"date-fns\";\nimport { defaultDuration } from \"./defaults\";\nimport type { TimeleftDuration } from \"./types\";\n\n// calculates the current timeleft duration.\nexport const getDuration = (toDate: Date | null): TimeleftDuration => {\n if (!toDate) {\n return defaultDuration;\n }\n if (getUnixTime(toDate) <= getUnixTime(new Date())) {\n return defaultDuration;\n }\n\n toDate.setSeconds(toDate.getSeconds());\n const d = intervalToDuration({\n start: Date.now(),\n end: toDate,\n });\n\n const days = differenceInDays(toDate, Date.now());\n const hours = d?.hours || 0;\n const minutes = d?.minutes || 0;\n const seconds = d?.seconds || 0;\n const lastHour = days === 0 && hours === 0;\n const lastMinute = lastHour && minutes === 0;\n\n return {\n days,\n hours,\n minutes,\n seconds,\n lastMinute,\n };\n};\n\n// Helper: Adds `seconds` to the current time and returns the resulting date.\nexport const secondsFromNow = (seconds: number): Date => {\n const end = new Date();\n end.setSeconds(end.getSeconds() + seconds);\n return end;\n};\n\n// Helper: Calculates the duration between the current time and the provided date.\nexport const getDurationFromNow = (toDate: Date | null): TimeleftDuration => {\n if (!toDate) {\n return defaultDuration;\n }\n if (getUnixTime(toDate) <= getUnixTime(new Date())) {\n return defaultDuration;\n }\n\n toDate.setSeconds(toDate.getSeconds());\n const d = intervalToDuration({\n start: Date.now(),\n end: toDate,\n });\n\n const days = differenceInDays(toDate, Date.now());\n const hours = d?.hours || 0;\n const minutes = d?.minutes || 0;\n const seconds = d?.seconds || 0;\n const lastHour = days === 0 && hours === 0;\n const lastMinute = lastHour && minutes === 0;\n\n return {\n days,\n hours,\n minutes,\n seconds,\n lastMinute,\n };\n};\n"]}
package/mjs/util.d.ts ADDED
File without changes
package/mjs/util.js ADDED
@@ -0,0 +1,5 @@
1
+
2
+
3
+ //# sourceMappingURL=util.js.map
4
+
5
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/util.ts"],"names":[],"mappings":"","file":"util.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@w3ux/hooks",
3
- "version": "1.3.1-beta.0",
3
+ "version": "1.3.1-beta.2",
4
4
  "license": "GPL-3.0-only",
5
5
  "dependencies": {
6
6
  "@w3ux/utils": "^1.1.1-beta.9",
@@ -12,6 +12,10 @@
12
12
  ".": {
13
13
  "import": "./mjs/index.js",
14
14
  "require": "./cjs/index.js"
15
+ },
16
+ "./utils": {
17
+ "import": "./mjs/utils/index.js",
18
+ "require": "./cjs/utils/index.js"
15
19
  }
16
20
  },
17
21
  "peerDependencies": {
@@ -1,2 +0,0 @@
1
- import type { TimeleftDuration } from "./types";
2
- export declare const getDuration: (toDate: Date | null) => TimeleftDuration;
@@ -1,36 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getDuration = void 0;
4
- const date_fns_1 = require("date-fns");
5
- const defaults_1 = require("./defaults");
6
- const getDuration = (toDate) => {
7
- if (!toDate) {
8
- return defaults_1.defaultDuration;
9
- }
10
- if ((0, date_fns_1.getUnixTime)(toDate) <= (0, date_fns_1.getUnixTime)(new Date())) {
11
- return defaults_1.defaultDuration;
12
- }
13
- toDate.setSeconds(toDate.getSeconds());
14
- const d = (0, date_fns_1.intervalToDuration)({
15
- start: Date.now(),
16
- end: toDate,
17
- });
18
- const days = (0, date_fns_1.differenceInDays)(toDate, Date.now());
19
- const hours = (d === null || d === void 0 ? void 0 : d.hours) || 0;
20
- const minutes = (d === null || d === void 0 ? void 0 : d.minutes) || 0;
21
- const seconds = (d === null || d === void 0 ? void 0 : d.seconds) || 0;
22
- const lastHour = days === 0 && hours === 0;
23
- const lastMinute = lastHour && minutes === 0;
24
- return {
25
- days,
26
- hours,
27
- minutes,
28
- seconds,
29
- lastMinute,
30
- };
31
- };
32
- exports.getDuration = getDuration;
33
-
34
- //# sourceMappingURL=utils.js.map
35
-
36
- //# sourceMappingURL=utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/useTimeleft/utils.ts"],"names":[],"mappings":";;;AAGA,uCAA6E;AAC7E,yCAA6C;AAItC,MAAM,WAAW,GAAG,CAAC,MAAmB,EAAoB,EAAE;IACnE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,0BAAe,CAAC;IACzB,CAAC;IACD,IAAI,IAAA,sBAAW,EAAC,MAAM,CAAC,IAAI,IAAA,sBAAW,EAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC;QACnD,OAAO,0BAAe,CAAC;IACzB,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;IACvC,MAAM,CAAC,GAAG,IAAA,6BAAkB,EAAC;QAC3B,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE;QACjB,GAAG,EAAE,MAAM;KACZ,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,IAAA,2BAAgB,EAAC,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,CAAA,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,KAAK,KAAI,CAAC,CAAC;IAC5B,MAAM,OAAO,GAAG,CAAA,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,OAAO,KAAI,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,CAAA,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,OAAO,KAAI,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,QAAQ,IAAI,OAAO,KAAK,CAAC,CAAC;IAE7C,OAAO;QACL,IAAI;QACJ,KAAK;QACL,OAAO;QACP,OAAO;QACP,UAAU;KACX,CAAC;AACJ,CAAC,CAAC;AA5BW,QAAA,WAAW,eA4BtB","file":"utils.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { differenceInDays, getUnixTime, intervalToDuration } from \"date-fns\";\nimport { defaultDuration } from \"./defaults\";\nimport type { TimeleftDuration } from \"./types\";\n\n// calculates the current timeleft duration.\nexport const getDuration = (toDate: Date | null): TimeleftDuration => {\n if (!toDate) {\n return defaultDuration;\n }\n if (getUnixTime(toDate) <= getUnixTime(new Date())) {\n return defaultDuration;\n }\n\n toDate.setSeconds(toDate.getSeconds());\n const d = intervalToDuration({\n start: Date.now(),\n end: toDate,\n });\n\n const days = differenceInDays(toDate, Date.now());\n const hours = d?.hours || 0;\n const minutes = d?.minutes || 0;\n const seconds = d?.seconds || 0;\n const lastHour = days === 0 && hours === 0;\n const lastMinute = lastHour && minutes === 0;\n\n return {\n days,\n hours,\n minutes,\n seconds,\n lastMinute,\n };\n};\n"]}
@@ -1,2 +0,0 @@
1
- import type { TimeleftDuration } from "./types";
2
- export declare const getDuration: (toDate: Date | null) => TimeleftDuration;
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/useTimeleft/utils.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAI7C,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,MAAmB,EAAoB,EAAE;IACnE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,eAAe,CAAC;IACzB,CAAC;IACD,IAAI,WAAW,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC;QACnD,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;IACvC,MAAM,CAAC,GAAG,kBAAkB,CAAC;QAC3B,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE;QACjB,GAAG,EAAE,MAAM;KACZ,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;IAC5B,MAAM,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,QAAQ,IAAI,OAAO,KAAK,CAAC,CAAC;IAE7C,OAAO;QACL,IAAI;QACJ,KAAK;QACL,OAAO;QACP,OAAO;QACP,UAAU;KACX,CAAC;AACJ,CAAC,CAAC","file":"utils.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { differenceInDays, getUnixTime, intervalToDuration } from \"date-fns\";\nimport { defaultDuration } from \"./defaults\";\nimport type { TimeleftDuration } from \"./types\";\n\n// calculates the current timeleft duration.\nexport const getDuration = (toDate: Date | null): TimeleftDuration => {\n if (!toDate) {\n return defaultDuration;\n }\n if (getUnixTime(toDate) <= getUnixTime(new Date())) {\n return defaultDuration;\n }\n\n toDate.setSeconds(toDate.getSeconds());\n const d = intervalToDuration({\n start: Date.now(),\n end: toDate,\n });\n\n const days = differenceInDays(toDate, Date.now());\n const hours = d?.hours || 0;\n const minutes = d?.minutes || 0;\n const seconds = d?.seconds || 0;\n const lastHour = days === 0 && hours === 0;\n const lastMinute = lastHour && minutes === 0;\n\n return {\n days,\n hours,\n minutes,\n seconds,\n lastMinute,\n };\n};\n"]}
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes