mimir-ui-kit 1.8.1 → 1.9.0
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.
- package/dist/assets/Timer.css +1 -0
- package/dist/components/Timer/Timer.d.ts +24 -0
- package/dist/components/Timer/Timer.js +29 -0
- package/dist/components/Timer/index.d.ts +1 -0
- package/dist/components/Timer/index.js +4 -0
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.js +2 -0
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/index.js +5 -1
- package/dist/hooks/useInterval/index.d.ts +1 -0
- package/dist/hooks/useInterval/index.js +4 -0
- package/dist/hooks/useInterval/useInterval.d.ts +1 -0
- package/dist/hooks/useInterval/useInterval.js +17 -0
- package/dist/hooks/useTimer/index.d.ts +18 -0
- package/dist/hooks/useTimer/index.js +83 -0
- package/dist/hooks/useTimer/useTimer.d.ts +18 -0
- package/dist/hooks/useTimer/useTimer.js +83 -0
- package/dist/hooks/useTimer/utils.d.ts +20 -0
- package/dist/hooks/useTimer/utils.js +78 -0
- package/dist/index.js +7 -1
- package/package.json +1 -1
@@ -0,0 +1 @@
|
|
1
|
+
._timer_llwad_3{color:var(--black-60);font-size:var(--size-text-l)}@media (max-width: 600px){._timer_llwad_3{font-size:var(--size-text-m)}}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
type TProps = {
|
2
|
+
/**
|
3
|
+
* число, которое представляет собой временную метку, указывающую время, когда истекает таймер.
|
4
|
+
* const timer = new Date().getTime() + 60000; => таймер на 1 минуту
|
5
|
+
*/
|
6
|
+
expiryTimestamp: number;
|
7
|
+
/**
|
8
|
+
* необязательное свойство типа boolean, которое указывает, должен ли таймер начинаться автоматически при создании компонента.
|
9
|
+
*/
|
10
|
+
autoStart?: boolean;
|
11
|
+
/**
|
12
|
+
* необязательная функция, которая вызывается, когда таймер истекает.
|
13
|
+
*/
|
14
|
+
onTimerEnd?: () => void;
|
15
|
+
/**
|
16
|
+
* Дополнительный класс.
|
17
|
+
*/
|
18
|
+
className?: string;
|
19
|
+
};
|
20
|
+
/**
|
21
|
+
* Компонент Timer отображает таймер с отсчетом времени в минутах и секундах.
|
22
|
+
*/
|
23
|
+
export declare const Timer: ({ expiryTimestamp, autoStart, onTimerEnd, className }: TProps) => import("react/jsx-runtime").JSX.Element;
|
24
|
+
export {};
|
@@ -0,0 +1,29 @@
|
|
1
|
+
import { jsxs } from "react/jsx-runtime";
|
2
|
+
import { c as classNames } from "../../index-CweZ_OcN.js";
|
3
|
+
import { useTimer } from "../../hooks/useTimer/index.js";
|
4
|
+
import '../../assets/Timer.css';const timer = "_timer_llwad_3";
|
5
|
+
const cls = {
|
6
|
+
timer
|
7
|
+
};
|
8
|
+
const Timer = ({
|
9
|
+
expiryTimestamp,
|
10
|
+
autoStart = false,
|
11
|
+
onTimerEnd,
|
12
|
+
className
|
13
|
+
}) => {
|
14
|
+
const { minutes, seconds } = useTimer({
|
15
|
+
expiryTimestamp,
|
16
|
+
onExpire: onTimerEnd,
|
17
|
+
autoStart
|
18
|
+
});
|
19
|
+
const formattedMinutes = String(minutes).padStart(2, "0");
|
20
|
+
const formattedSeconds = String(seconds).padStart(2, "0");
|
21
|
+
return /* @__PURE__ */ jsxs("div", { className: classNames(cls.timer, className), children: [
|
22
|
+
formattedMinutes,
|
23
|
+
":",
|
24
|
+
formattedSeconds
|
25
|
+
] });
|
26
|
+
};
|
27
|
+
export {
|
28
|
+
Timer
|
29
|
+
};
|
@@ -0,0 +1 @@
|
|
1
|
+
export { Timer } from './Timer';
|
package/dist/components/index.js
CHANGED
@@ -22,6 +22,7 @@ import { EVoteSize } from "./Vote/constants.js";
|
|
22
22
|
import { SelectSearch } from "./SelectSearch/SelectSearch.js";
|
23
23
|
import { ESelectSearchSize } from "./SelectSearch/constants.js";
|
24
24
|
import { Switch } from "./Switch/Switch.js";
|
25
|
+
import { Timer } from "./Timer/Timer.js";
|
25
26
|
export {
|
26
27
|
Button,
|
27
28
|
DatePicker,
|
@@ -51,6 +52,7 @@ export {
|
|
51
52
|
Slider,
|
52
53
|
Steps,
|
53
54
|
Switch,
|
55
|
+
Timer,
|
54
56
|
Vote,
|
55
57
|
getMaskedInputPhoneValue,
|
56
58
|
getUnmaskedInputValue
|
package/dist/hooks/index.d.ts
CHANGED
package/dist/hooks/index.js
CHANGED
@@ -1,8 +1,12 @@
|
|
1
1
|
import { useMediaQuery } from "./useMediaQuery/useMediaQuery.js";
|
2
2
|
import { EMediaQuery } from "./useMediaQuery/constants.js";
|
3
3
|
import { useLockBodyScroll } from "./useLockBodyScroll/useLockBodyScroll.js";
|
4
|
+
import { useInterval } from "./useInterval/useInterval.js";
|
5
|
+
import { useTimer } from "./useTimer/index.js";
|
4
6
|
export {
|
5
7
|
EMediaQuery,
|
8
|
+
useInterval,
|
6
9
|
useLockBodyScroll,
|
7
|
-
useMediaQuery
|
10
|
+
useMediaQuery,
|
11
|
+
useTimer
|
8
12
|
};
|
@@ -0,0 +1 @@
|
|
1
|
+
export { useInterval } from './useInterval';
|
@@ -0,0 +1 @@
|
|
1
|
+
export declare function useInterval(callback: VoidFunction, delay: number | null): void;
|
@@ -0,0 +1,17 @@
|
|
1
|
+
import { useRef, useEffect } from "react";
|
2
|
+
function useInterval(callback, delay) {
|
3
|
+
const callbackRef = useRef();
|
4
|
+
callbackRef.current = callback;
|
5
|
+
useEffect(() => {
|
6
|
+
if (!delay) {
|
7
|
+
return;
|
8
|
+
}
|
9
|
+
const interval = setInterval(() => {
|
10
|
+
callbackRef.current && callbackRef.current();
|
11
|
+
}, delay);
|
12
|
+
return () => clearInterval(interval);
|
13
|
+
}, [delay]);
|
14
|
+
}
|
15
|
+
export {
|
16
|
+
useInterval
|
17
|
+
};
|
@@ -0,0 +1,18 @@
|
|
1
|
+
export type TUserTimer = ReturnType<typeof useTimer>;
|
2
|
+
export type TUseTimerProps = {
|
3
|
+
expiryTimestamp?: number;
|
4
|
+
onExpire?: VoidFunction;
|
5
|
+
autoStart?: boolean;
|
6
|
+
};
|
7
|
+
export declare function useTimer({ expiryTimestamp: expiry, onExpire, autoStart }: TUseTimerProps): {
|
8
|
+
start: () => void;
|
9
|
+
pause: () => void;
|
10
|
+
resume: () => void;
|
11
|
+
restart: (newExpiryTimestamp: number, newAutoStart?: boolean) => void;
|
12
|
+
isRunning: boolean;
|
13
|
+
totalSeconds: number;
|
14
|
+
days: number;
|
15
|
+
hours: number;
|
16
|
+
minutes: number;
|
17
|
+
seconds: number;
|
18
|
+
};
|
@@ -0,0 +1,83 @@
|
|
1
|
+
import { useState, useCallback } from "react";
|
2
|
+
import { Time, Validate } from "./utils.js";
|
3
|
+
import { useInterval } from "../useInterval/useInterval.js";
|
4
|
+
const DEFAULT_DELAY = 1e3;
|
5
|
+
function getDelayFromExpiryTimestamp(expiryTimestamp) {
|
6
|
+
if (!Validate.expiryTimestamp(expiryTimestamp)) {
|
7
|
+
return null;
|
8
|
+
}
|
9
|
+
const seconds = Time.getSecondsFromExpiry(expiryTimestamp);
|
10
|
+
const extraMilliSeconds = Math.floor((seconds - Math.floor(seconds)) * 1e3);
|
11
|
+
return extraMilliSeconds > 0 ? extraMilliSeconds : DEFAULT_DELAY;
|
12
|
+
}
|
13
|
+
function useTimer({
|
14
|
+
expiryTimestamp: expiry,
|
15
|
+
onExpire,
|
16
|
+
autoStart = false
|
17
|
+
}) {
|
18
|
+
const [expiryTimestamp, setExpiryTimestamp] = useState(expiry);
|
19
|
+
const [seconds, setSeconds] = useState(
|
20
|
+
Time.getSecondsFromExpiry(expiry ?? 0)
|
21
|
+
);
|
22
|
+
const [isRunning, setIsRunning] = useState(autoStart);
|
23
|
+
const [didStart, setDidStart] = useState(autoStart);
|
24
|
+
const [delay, setDelay] = useState(getDelayFromExpiryTimestamp(expiry ?? 0));
|
25
|
+
const handleExpire = useCallback(() => {
|
26
|
+
Validate.onExpire(onExpire) && (onExpire == null ? void 0 : onExpire());
|
27
|
+
setIsRunning(false);
|
28
|
+
setDelay(null);
|
29
|
+
}, [onExpire]);
|
30
|
+
const pause = useCallback(() => {
|
31
|
+
setIsRunning(false);
|
32
|
+
}, []);
|
33
|
+
const restart = useCallback(
|
34
|
+
(newExpiryTimestamp, newAutoStart = true) => {
|
35
|
+
setDelay(getDelayFromExpiryTimestamp(newExpiryTimestamp));
|
36
|
+
setDidStart(newAutoStart);
|
37
|
+
setIsRunning(newAutoStart);
|
38
|
+
setExpiryTimestamp(newExpiryTimestamp);
|
39
|
+
setSeconds(Time.getSecondsFromExpiry(newExpiryTimestamp));
|
40
|
+
},
|
41
|
+
[]
|
42
|
+
);
|
43
|
+
const resume = useCallback(() => {
|
44
|
+
const time = /* @__PURE__ */ new Date();
|
45
|
+
time.setMilliseconds(time.getMilliseconds() + seconds * 1e3);
|
46
|
+
restart(time.getTime(), true);
|
47
|
+
}, [seconds, restart]);
|
48
|
+
const start = useCallback(() => {
|
49
|
+
if (didStart) {
|
50
|
+
setSeconds(Time.getSecondsFromExpiry(expiryTimestamp ?? 0, false));
|
51
|
+
setIsRunning(true);
|
52
|
+
} else {
|
53
|
+
resume();
|
54
|
+
}
|
55
|
+
}, [expiryTimestamp, didStart, resume]);
|
56
|
+
useInterval(
|
57
|
+
() => {
|
58
|
+
if (delay !== DEFAULT_DELAY) {
|
59
|
+
setDelay(DEFAULT_DELAY);
|
60
|
+
}
|
61
|
+
const secondsValue = Time.getSecondsFromExpiry(
|
62
|
+
expiryTimestamp ?? 0,
|
63
|
+
false
|
64
|
+
);
|
65
|
+
setSeconds(secondsValue);
|
66
|
+
if (secondsValue <= 0) {
|
67
|
+
handleExpire();
|
68
|
+
}
|
69
|
+
},
|
70
|
+
isRunning ? delay : null
|
71
|
+
);
|
72
|
+
return {
|
73
|
+
...Time.getTimeFromSeconds(seconds),
|
74
|
+
start,
|
75
|
+
pause,
|
76
|
+
resume,
|
77
|
+
restart,
|
78
|
+
isRunning
|
79
|
+
};
|
80
|
+
}
|
81
|
+
export {
|
82
|
+
useTimer
|
83
|
+
};
|
@@ -0,0 +1,18 @@
|
|
1
|
+
export type TUserTimer = ReturnType<typeof useTimer>;
|
2
|
+
export type TUseTimerProps = {
|
3
|
+
expiryTimestamp?: number;
|
4
|
+
onExpire?: VoidFunction;
|
5
|
+
autoStart?: boolean;
|
6
|
+
};
|
7
|
+
export declare function useTimer({ expiryTimestamp: expiry, onExpire, autoStart }: TUseTimerProps): {
|
8
|
+
start: () => void;
|
9
|
+
pause: () => void;
|
10
|
+
resume: () => void;
|
11
|
+
restart: (newExpiryTimestamp: number, newAutoStart?: boolean) => void;
|
12
|
+
isRunning: boolean;
|
13
|
+
totalSeconds: number;
|
14
|
+
days: number;
|
15
|
+
hours: number;
|
16
|
+
minutes: number;
|
17
|
+
seconds: number;
|
18
|
+
};
|
@@ -0,0 +1,83 @@
|
|
1
|
+
import { useState, useCallback } from "react";
|
2
|
+
import { Time, Validate } from "./utils.js";
|
3
|
+
import { useInterval } from "../useInterval/useInterval.js";
|
4
|
+
const DEFAULT_DELAY = 1e3;
|
5
|
+
function getDelayFromExpiryTimestamp(expiryTimestamp) {
|
6
|
+
if (!Validate.expiryTimestamp(expiryTimestamp)) {
|
7
|
+
return null;
|
8
|
+
}
|
9
|
+
const seconds = Time.getSecondsFromExpiry(expiryTimestamp);
|
10
|
+
const extraMilliSeconds = Math.floor((seconds - Math.floor(seconds)) * 1e3);
|
11
|
+
return extraMilliSeconds > 0 ? extraMilliSeconds : DEFAULT_DELAY;
|
12
|
+
}
|
13
|
+
function useTimer({
|
14
|
+
expiryTimestamp: expiry,
|
15
|
+
onExpire,
|
16
|
+
autoStart = true
|
17
|
+
}) {
|
18
|
+
const [expiryTimestamp, setExpiryTimestamp] = useState(expiry);
|
19
|
+
const [seconds, setSeconds] = useState(
|
20
|
+
Time.getSecondsFromExpiry(expiry ?? 0)
|
21
|
+
);
|
22
|
+
const [isRunning, setIsRunning] = useState(autoStart);
|
23
|
+
const [didStart, setDidStart] = useState(autoStart);
|
24
|
+
const [delay, setDelay] = useState(getDelayFromExpiryTimestamp(expiry ?? 0));
|
25
|
+
const handleExpire = useCallback(() => {
|
26
|
+
Validate.onExpire(onExpire) && (onExpire == null ? void 0 : onExpire());
|
27
|
+
setIsRunning(false);
|
28
|
+
setDelay(null);
|
29
|
+
}, [onExpire]);
|
30
|
+
const pause = useCallback(() => {
|
31
|
+
setIsRunning(false);
|
32
|
+
}, []);
|
33
|
+
const restart = useCallback(
|
34
|
+
(newExpiryTimestamp, newAutoStart = true) => {
|
35
|
+
setDelay(getDelayFromExpiryTimestamp(newExpiryTimestamp));
|
36
|
+
setDidStart(newAutoStart);
|
37
|
+
setIsRunning(newAutoStart);
|
38
|
+
setExpiryTimestamp(newExpiryTimestamp);
|
39
|
+
setSeconds(Time.getSecondsFromExpiry(newExpiryTimestamp));
|
40
|
+
},
|
41
|
+
[]
|
42
|
+
);
|
43
|
+
const resume = useCallback(() => {
|
44
|
+
const time = /* @__PURE__ */ new Date();
|
45
|
+
time.setMilliseconds(time.getMilliseconds() + seconds * 1e3);
|
46
|
+
restart(time.getTime(), true);
|
47
|
+
}, [seconds, restart]);
|
48
|
+
const start = useCallback(() => {
|
49
|
+
if (didStart) {
|
50
|
+
setSeconds(Time.getSecondsFromExpiry(expiryTimestamp ?? 0, false));
|
51
|
+
setIsRunning(true);
|
52
|
+
} else {
|
53
|
+
resume();
|
54
|
+
}
|
55
|
+
}, [expiryTimestamp, didStart, resume]);
|
56
|
+
useInterval(
|
57
|
+
() => {
|
58
|
+
if (delay !== DEFAULT_DELAY) {
|
59
|
+
setDelay(DEFAULT_DELAY);
|
60
|
+
}
|
61
|
+
const secondsValue = Time.getSecondsFromExpiry(
|
62
|
+
expiryTimestamp ?? 0,
|
63
|
+
false
|
64
|
+
);
|
65
|
+
setSeconds(secondsValue);
|
66
|
+
if (secondsValue <= 0) {
|
67
|
+
handleExpire();
|
68
|
+
}
|
69
|
+
},
|
70
|
+
isRunning ? delay : null
|
71
|
+
);
|
72
|
+
return {
|
73
|
+
...Time.getTimeFromSeconds(seconds),
|
74
|
+
start,
|
75
|
+
pause,
|
76
|
+
resume,
|
77
|
+
restart,
|
78
|
+
isRunning
|
79
|
+
};
|
80
|
+
}
|
81
|
+
export {
|
82
|
+
useTimer
|
83
|
+
};
|
@@ -0,0 +1,20 @@
|
|
1
|
+
type TTimeObject = {
|
2
|
+
totalSeconds: number;
|
3
|
+
days: number;
|
4
|
+
hours: number;
|
5
|
+
minutes: number;
|
6
|
+
seconds: number;
|
7
|
+
};
|
8
|
+
type TFormattedTime = Omit<TTimeObject, 'totalSeconds' | 'days'>;
|
9
|
+
export declare class Time {
|
10
|
+
static getTimeFromSeconds(secs: number): TTimeObject;
|
11
|
+
static getSecondsFromExpiry(expiry: number, shouldRound?: boolean): number;
|
12
|
+
static getSecondsFromPrevTime(prevTime: number, shouldRound: boolean): number;
|
13
|
+
static getSecondsFromTimeNow(): number;
|
14
|
+
static getFormattedTimeFromSeconds(totalSeconds: number): TFormattedTime;
|
15
|
+
}
|
16
|
+
export declare class Validate {
|
17
|
+
static expiryTimestamp(expiryTimestamp: number): boolean;
|
18
|
+
static onExpire(onExpire?: VoidFunction | null): boolean | null | undefined;
|
19
|
+
}
|
20
|
+
export {};
|
@@ -0,0 +1,78 @@
|
|
1
|
+
class Time {
|
2
|
+
static getTimeFromSeconds(secs) {
|
3
|
+
const totalSeconds = Math.ceil(secs);
|
4
|
+
const days = Math.floor(totalSeconds / (60 * 60 * 24));
|
5
|
+
const hours = Math.floor(totalSeconds % (60 * 60 * 24) / (60 * 60));
|
6
|
+
const minutes = Math.floor(totalSeconds % (60 * 60) / 60);
|
7
|
+
const seconds = Math.floor(totalSeconds % 60);
|
8
|
+
return {
|
9
|
+
totalSeconds,
|
10
|
+
seconds,
|
11
|
+
minutes,
|
12
|
+
hours,
|
13
|
+
days
|
14
|
+
};
|
15
|
+
}
|
16
|
+
static getSecondsFromExpiry(expiry, shouldRound) {
|
17
|
+
const now = (/* @__PURE__ */ new Date()).getTime();
|
18
|
+
const milliSecondsDistance = expiry - now;
|
19
|
+
if (milliSecondsDistance > 0) {
|
20
|
+
const val = milliSecondsDistance / 1e3;
|
21
|
+
return shouldRound ? Math.round(val) : val;
|
22
|
+
}
|
23
|
+
return 0;
|
24
|
+
}
|
25
|
+
static getSecondsFromPrevTime(prevTime, shouldRound) {
|
26
|
+
const now = (/* @__PURE__ */ new Date()).getTime();
|
27
|
+
const milliSecondsDistance = now - prevTime;
|
28
|
+
if (milliSecondsDistance > 0) {
|
29
|
+
const val = milliSecondsDistance / 1e3;
|
30
|
+
return shouldRound ? Math.round(val) : val;
|
31
|
+
}
|
32
|
+
return 0;
|
33
|
+
}
|
34
|
+
static getSecondsFromTimeNow() {
|
35
|
+
const now = /* @__PURE__ */ new Date();
|
36
|
+
const currentTimestamp = now.getTime();
|
37
|
+
const offset = now.getTimezoneOffset() * 60;
|
38
|
+
return currentTimestamp / 1e3 - offset;
|
39
|
+
}
|
40
|
+
static getFormattedTimeFromSeconds(totalSeconds) {
|
41
|
+
const {
|
42
|
+
seconds: secondsValue,
|
43
|
+
minutes,
|
44
|
+
hours
|
45
|
+
} = Time.getTimeFromSeconds(totalSeconds);
|
46
|
+
return {
|
47
|
+
seconds: secondsValue,
|
48
|
+
minutes,
|
49
|
+
hours
|
50
|
+
};
|
51
|
+
}
|
52
|
+
}
|
53
|
+
class Validate {
|
54
|
+
static expiryTimestamp(expiryTimestamp) {
|
55
|
+
const isValid = new Date(expiryTimestamp).getTime() > 0;
|
56
|
+
if (!isValid) {
|
57
|
+
console.warn(
|
58
|
+
"{ useTimer } Invalid expiryTimestamp settings",
|
59
|
+
expiryTimestamp
|
60
|
+
);
|
61
|
+
}
|
62
|
+
return isValid;
|
63
|
+
}
|
64
|
+
static onExpire(onExpire) {
|
65
|
+
const isValid = onExpire && typeof onExpire === "function";
|
66
|
+
if (onExpire && !isValid) {
|
67
|
+
console.warn(
|
68
|
+
" { useTimer } Invalid onExpire settings function",
|
69
|
+
onExpire
|
70
|
+
);
|
71
|
+
}
|
72
|
+
return isValid;
|
73
|
+
}
|
74
|
+
}
|
75
|
+
export {
|
76
|
+
Time,
|
77
|
+
Validate
|
78
|
+
};
|
package/dist/index.js
CHANGED
@@ -22,9 +22,12 @@ import { EVoteSize } from "./components/Vote/constants.js";
|
|
22
22
|
import { SelectSearch } from "./components/SelectSearch/SelectSearch.js";
|
23
23
|
import { ESelectSearchSize } from "./components/SelectSearch/constants.js";
|
24
24
|
import { Switch } from "./components/Switch/Switch.js";
|
25
|
+
import { Timer } from "./components/Timer/Timer.js";
|
25
26
|
import { useMediaQuery } from "./hooks/useMediaQuery/useMediaQuery.js";
|
26
27
|
import { EMediaQuery } from "./hooks/useMediaQuery/constants.js";
|
27
28
|
import { useLockBodyScroll } from "./hooks/useLockBodyScroll/useLockBodyScroll.js";
|
29
|
+
import { useInterval } from "./hooks/useInterval/useInterval.js";
|
30
|
+
import { useTimer } from "./hooks/useTimer/index.js";
|
28
31
|
import { Icon } from "./icons/Icon.js";
|
29
32
|
import { formating } from "./utils/index.js";
|
30
33
|
import './assets/index.css';export {
|
@@ -58,10 +61,13 @@ import './assets/index.css';export {
|
|
58
61
|
Slider,
|
59
62
|
Steps,
|
60
63
|
Switch,
|
64
|
+
Timer,
|
61
65
|
Vote,
|
62
66
|
formating,
|
63
67
|
getMaskedInputPhoneValue,
|
64
68
|
getUnmaskedInputValue,
|
69
|
+
useInterval,
|
65
70
|
useLockBodyScroll,
|
66
|
-
useMediaQuery
|
71
|
+
useMediaQuery,
|
72
|
+
useTimer
|
67
73
|
};
|