allaw-ui 2.5.4 → 2.5.5
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.
|
@@ -6,5 +6,5 @@ export type BillingCountProps = {
|
|
|
6
6
|
resetTimer?: boolean;
|
|
7
7
|
pauseTimer?: boolean;
|
|
8
8
|
};
|
|
9
|
-
declare const BillingCount: ({ onEnd, setIsStarted,
|
|
9
|
+
declare const BillingCount: ({ onEnd, setIsStarted, pauseTimer, resetTimer, }: BillingCountProps) => React.JSX.Element;
|
|
10
10
|
export default BillingCount;
|
|
@@ -2,145 +2,145 @@ import React, { useEffect, useState, useRef } from "react";
|
|
|
2
2
|
import "./BillingCount.css";
|
|
3
3
|
var LOCAL_STORAGE_KEYS = {
|
|
4
4
|
START_TIME: "startTimeBilling",
|
|
5
|
-
|
|
5
|
+
ELAPSED_TIME: "elapsedTime",
|
|
6
6
|
IS_RUNNING: "isRunning",
|
|
7
7
|
};
|
|
8
8
|
var BillingCount = function (_a) {
|
|
9
|
-
var onEnd = _a.onEnd, setIsStarted = _a.setIsStarted,
|
|
10
|
-
var _b = useState(0),
|
|
11
|
-
var _c = useState(false),
|
|
9
|
+
var onEnd = _a.onEnd, setIsStarted = _a.setIsStarted, pauseTimer = _a.pauseTimer, resetTimer = _a.resetTimer;
|
|
10
|
+
var _b = useState(0), time = _b[0], setTime = _b[1];
|
|
11
|
+
var _c = useState(false), isPaused = _c[0], setIsPaused = _c[1];
|
|
12
|
+
var _d = useState(false), isRunning = _d[0], setIsRunning = _d[1];
|
|
13
|
+
var _e = useState(false), isInitialized = _e[0], setIsInitialized = _e[1];
|
|
12
14
|
var intervalRef = useRef(null);
|
|
13
|
-
// --- Au premier render, on relit le localStorage
|
|
14
15
|
useEffect(function () {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
16
|
+
setIsInitialized(true);
|
|
17
|
+
}, []);
|
|
18
|
+
useEffect(function () {
|
|
19
|
+
setTime(getSavedElapsedTime());
|
|
20
|
+
}, []);
|
|
21
|
+
useEffect(function () {
|
|
22
|
+
if (!isInitialized)
|
|
23
|
+
return;
|
|
24
|
+
if (resetTimer)
|
|
25
|
+
setTime(0);
|
|
26
|
+
setIsPaused(false);
|
|
27
|
+
setIsRunning(false);
|
|
28
|
+
clearTimerData();
|
|
29
|
+
if (intervalRef.current) {
|
|
30
|
+
clearInterval(intervalRef.current);
|
|
20
31
|
}
|
|
21
|
-
if (
|
|
22
|
-
|
|
23
|
-
setIsStarted && setIsStarted(true);
|
|
32
|
+
else if (pauseTimer) {
|
|
33
|
+
pauseTimerHandler();
|
|
24
34
|
}
|
|
25
|
-
else {
|
|
26
|
-
|
|
27
|
-
setIsStarted && setIsStarted(false);
|
|
35
|
+
else if (!pauseTimer && !isRunning && isPaused) {
|
|
36
|
+
startTimerHandler();
|
|
28
37
|
}
|
|
29
|
-
}, [
|
|
30
|
-
// --- Gère l'interval pour mettre à jour l'affichage
|
|
38
|
+
}, [resetTimer]);
|
|
31
39
|
useEffect(function () {
|
|
32
|
-
if (isRunning) {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
40
|
+
if (isRunning && !isPaused) {
|
|
41
|
+
intervalRef.current = setInterval(function () {
|
|
42
|
+
setTime(function (prevTime) {
|
|
43
|
+
var newElapsedTime = prevTime + 1;
|
|
44
|
+
updateElapsedTime(newElapsedTime);
|
|
45
|
+
return newElapsedTime;
|
|
46
|
+
});
|
|
37
47
|
}, 1000);
|
|
38
48
|
}
|
|
39
49
|
else if (intervalRef.current) {
|
|
40
|
-
// On stoppe l'interval
|
|
41
50
|
clearInterval(intervalRef.current);
|
|
42
51
|
intervalRef.current = null;
|
|
43
52
|
}
|
|
44
|
-
// Cleanup si le composant se démonte
|
|
45
53
|
return function () {
|
|
46
54
|
if (intervalRef.current)
|
|
47
55
|
clearInterval(intervalRef.current);
|
|
48
56
|
};
|
|
49
|
-
}, [isRunning]);
|
|
50
|
-
// --- Sur changement de resetTimer/pauseTimer
|
|
51
|
-
// on applique la logique de reset, de pause ou de start
|
|
57
|
+
}, [isRunning, isPaused]);
|
|
52
58
|
useEffect(function () {
|
|
59
|
+
if (!isInitialized)
|
|
60
|
+
return;
|
|
53
61
|
if (resetTimer) {
|
|
54
|
-
resetTimerHandler();
|
|
55
|
-
}
|
|
56
|
-
else if (pauseTimer) {
|
|
57
62
|
pauseTimerHandler();
|
|
58
63
|
}
|
|
59
64
|
else if (!pauseTimer && !resetTimer) {
|
|
60
65
|
startTimerHandler();
|
|
61
66
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
var
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
67
|
+
else if (pauseTimer) {
|
|
68
|
+
pauseTimerHandler();
|
|
69
|
+
}
|
|
70
|
+
}, [pauseTimer, resetTimer]);
|
|
71
|
+
// Gestion de reprise de chrono en cas de refresh de page
|
|
72
|
+
useEffect(function () {
|
|
73
|
+
var savedElapsedTime = getSavedElapsedTime();
|
|
74
|
+
var savedIsRunning = localStorage.getItem(LOCAL_STORAGE_KEYS.IS_RUNNING) === "true";
|
|
75
|
+
setTime(savedElapsedTime);
|
|
76
|
+
if (savedIsRunning && savedElapsedTime > 0) {
|
|
77
|
+
setIsRunning(true);
|
|
78
|
+
setIsStarted && setIsStarted(true);
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
setIsRunning(false);
|
|
82
|
+
setIsStarted && setIsStarted(false);
|
|
83
|
+
}
|
|
84
|
+
}, [setIsStarted]);
|
|
85
|
+
// Mise a jour du temps de session
|
|
86
|
+
var updateElapsedTime = function (elapsedTime) {
|
|
87
|
+
localStorage.setItem(LOCAL_STORAGE_KEYS.ELAPSED_TIME, elapsedTime.toString());
|
|
88
|
+
};
|
|
89
|
+
// Cleanup du localStorage après un reset de session de travail
|
|
90
|
+
var clearTimerData = function () {
|
|
91
|
+
localStorage.removeItem(LOCAL_STORAGE_KEYS.START_TIME);
|
|
92
|
+
localStorage.removeItem(LOCAL_STORAGE_KEYS.ELAPSED_TIME);
|
|
93
|
+
localStorage.removeItem(LOCAL_STORAGE_KEYS.IS_RUNNING);
|
|
94
|
+
};
|
|
95
|
+
var getSavedElapsedTime = function () {
|
|
96
|
+
return parseInt(localStorage.getItem(LOCAL_STORAGE_KEYS.ELAPSED_TIME) || "0", 10);
|
|
97
|
+
};
|
|
98
|
+
var getCurrentElapsedTime = function () {
|
|
99
|
+
var savedStartTime = localStorage.getItem(LOCAL_STORAGE_KEYS.START_TIME);
|
|
100
|
+
if (savedStartTime) {
|
|
101
|
+
return getSavedElapsedTime();
|
|
102
|
+
}
|
|
103
|
+
return getSavedElapsedTime();
|
|
74
104
|
};
|
|
75
|
-
// On lance ou relance le chrono
|
|
76
105
|
var startTimerHandler = function () {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
// On enregistre le moment précis du démarrage (ms)
|
|
80
|
-
localStorage.setItem(LOCAL_STORAGE_KEYS.START_TIME, Date.now().toString());
|
|
106
|
+
if (!isRunning) {
|
|
107
|
+
localStorage.setItem(LOCAL_STORAGE_KEYS.START_TIME, new Date().toISOString());
|
|
81
108
|
localStorage.setItem(LOCAL_STORAGE_KEYS.IS_RUNNING, "true");
|
|
109
|
+
setTime(getSavedElapsedTime());
|
|
82
110
|
setIsRunning(true);
|
|
83
111
|
setIsStarted && setIsStarted(true);
|
|
84
112
|
}
|
|
85
113
|
};
|
|
86
|
-
// On met le chrono en pause
|
|
87
114
|
var pauseTimerHandler = function () {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
var newElapsed = computeElapsedTime();
|
|
92
|
-
// On met à jour l'accumulatedTime en localStorage
|
|
93
|
-
localStorage.setItem(LOCAL_STORAGE_KEYS.ACCUMULATED_TIME, newElapsed.toString());
|
|
94
|
-
// On arrête
|
|
115
|
+
if (isRunning) {
|
|
116
|
+
var elapsed = getCurrentElapsedTime();
|
|
117
|
+
updateElapsedTime(elapsed);
|
|
95
118
|
localStorage.setItem(LOCAL_STORAGE_KEYS.IS_RUNNING, "false");
|
|
96
|
-
|
|
97
|
-
setElapsedSeconds(newElapsed);
|
|
119
|
+
setTime(elapsed);
|
|
98
120
|
setIsRunning(false);
|
|
99
121
|
setIsStarted && setIsStarted(false);
|
|
100
|
-
onEnd(newElapsed); // si on veut déclencher l'événement "onEnd"
|
|
101
122
|
}
|
|
102
123
|
};
|
|
103
|
-
// On remet tout à zéro
|
|
104
|
-
var resetTimerHandler = function () {
|
|
105
|
-
clearTimerData();
|
|
106
|
-
setElapsedSeconds(0);
|
|
107
|
-
setIsRunning(false);
|
|
108
|
-
setIsStarted && setIsStarted(false);
|
|
109
|
-
};
|
|
110
124
|
var handleButtonClick = function () {
|
|
111
|
-
if (isRunning) {
|
|
112
|
-
|
|
125
|
+
if (!isRunning) {
|
|
126
|
+
startTimerHandler();
|
|
113
127
|
}
|
|
114
128
|
else {
|
|
115
|
-
|
|
129
|
+
pauseTimerHandler();
|
|
130
|
+
onEnd(getCurrentElapsedTime());
|
|
116
131
|
}
|
|
117
132
|
};
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
var
|
|
121
|
-
|
|
122
|
-
};
|
|
123
|
-
var getAccumulatedTime = function () {
|
|
124
|
-
var val = localStorage.getItem(LOCAL_STORAGE_KEYS.ACCUMULATED_TIME);
|
|
125
|
-
return val ? parseInt(val, 10) : 0;
|
|
126
|
-
};
|
|
127
|
-
var clearTimerData = function () {
|
|
128
|
-
localStorage.removeItem(LOCAL_STORAGE_KEYS.START_TIME);
|
|
129
|
-
localStorage.removeItem(LOCAL_STORAGE_KEYS.ACCUMULATED_TIME);
|
|
130
|
-
localStorage.removeItem(LOCAL_STORAGE_KEYS.IS_RUNNING);
|
|
131
|
-
};
|
|
132
|
-
// --- Format d'affichage
|
|
133
|
-
var formatTime = function (totalSeconds) {
|
|
134
|
-
var hrs = Math.floor(totalSeconds / 3600);
|
|
135
|
-
var mins = Math.floor((totalSeconds % 3600) / 60);
|
|
136
|
-
var secs = totalSeconds % 60;
|
|
133
|
+
var formatTime = function (seconds) {
|
|
134
|
+
var hrs = Math.floor(seconds / 3600);
|
|
135
|
+
var mins = Math.floor((seconds % 3600) / 60);
|
|
136
|
+
var secs = seconds % 60;
|
|
137
137
|
return "".concat(hrs.toString().padStart(2, "0"), ":").concat(mins
|
|
138
138
|
.toString()
|
|
139
139
|
.padStart(2, "0"), ":").concat(secs.toString().padStart(2, "0"));
|
|
140
140
|
};
|
|
141
141
|
return (React.createElement("button", { onClick: handleButtonClick, className: "billing-button-wrapper ".concat(isRunning ? "isRunning" : "") },
|
|
142
142
|
React.createElement("i", { className: "allaw-icon-clock" }),
|
|
143
|
-
React.createElement("span", { className: "billing-time" }, formatTime(
|
|
143
|
+
React.createElement("span", { className: "billing-time" }, formatTime(time)),
|
|
144
144
|
React.createElement("i", { className: isRunning ? "allaw-icon-pause" : "allaw-icon-play", style: { fontSize: "12px", color: "#25BEEB", fontWeight: 800 } })));
|
|
145
145
|
};
|
|
146
146
|
export default BillingCount;
|