@eohjsc/react-native-smart-city 0.5.9 → 0.6.1
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/README.md +44 -6
- package/package.json +1 -1
- package/src/commons/Device/HorizontalBarChart.js +1 -1
- package/src/commons/Device/PowerConsumptionChart.js +159 -0
- package/src/commons/Device/ProgressBar/__test__/ProgressBar.test.js +2 -3
- package/src/commons/Device/ProgressBar/index.js +36 -38
- package/src/commons/Device/ProgressBar/styles.js +18 -24
- package/src/commons/Form/CurrencyInput.js +2 -0
- package/src/commons/UnitSummary/ConfigHistoryChart/index.js +6 -61
- package/src/commons/Widgets/IFrame/IFrame.js +54 -0
- package/src/commons/Widgets/IFrame/IFrameStyles.js +35 -0
- package/src/commons/Widgets/IFrame/__tests__/IFrame.test.js +74 -0
- package/src/commons/Widgets/IFrame/index.js +0 -0
- package/src/commons/Widgets/IFrameWithConfig/IFrameWithConfig.js +163 -0
- package/src/commons/Widgets/IFrameWithConfig/IFrameWithConfigStyles.js +9 -0
- package/src/commons/Widgets/IFrameWithConfig/__tests__/IFrameWithConfig.test.js +284 -0
- package/src/commons/Widgets/IFrameWithConfig/index.js +0 -0
- package/src/commons/Widgets/Widget.js +0 -0
- package/src/commons/Widgets/index.js +0 -0
- package/src/configs/AccessibilityLabel.js +3 -0
- package/src/configs/Constants.js +5 -0
- package/src/hooks/Common/useDevicesStatus.js +23 -23
- package/src/screens/Device/__test__/sensorDisplayItem.test.js +3 -3
- package/src/screens/Device/components/SensorDisplayItem.js +23 -5
- package/src/screens/Device/components/__test__/VisualChart.test.js +2 -9
- package/src/screens/PlayBackCamera/Styles/index.js +2 -4
- package/src/screens/PlayBackCamera/Timer.js +65 -47
- package/src/screens/PlayBackCamera/__test__/index.test.js +27 -19
- package/src/screens/PlayBackCamera/index.js +114 -111
- package/src/screens/UnitSummary/components/3PPowerConsumption/index.js +10 -23
- package/src/screens/UnitSummary/components/PowerConsumption/__test__/PowerConsumption.test.js +57 -3
- package/src/screens/UnitSummary/components/PowerConsumption/index.js +21 -30
- package/src/commons/Device/HistoryChart.js +0 -225
- package/src/commons/UnitSummary/ConfigHistoryChart/__test__/ConfigHistoryChart.test.js +0 -289
- package/src/screens/Device/__test__/DetailHistoryChart.test.js +0 -69
- package/src/screens/Device/components/DetailHistoryChart.js +0 -118
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import moment from 'moment';
|
|
2
|
-
import React, {
|
|
2
|
+
import React, {
|
|
3
|
+
useState,
|
|
4
|
+
useCallback,
|
|
5
|
+
useEffect,
|
|
6
|
+
useMemo,
|
|
7
|
+
useRef,
|
|
8
|
+
} from 'react';
|
|
3
9
|
import { View, Image, TouchableOpacity } from 'react-native';
|
|
4
10
|
import { Calendar } from 'react-native-calendars';
|
|
5
11
|
|
|
@@ -15,75 +21,83 @@ import { setStatusBarPreview } from '../../hooks/Common/useStatusBar';
|
|
|
15
21
|
import MediaPlayerFull from '../../commons/MediaPlayerDetail/MediaPlayerFull';
|
|
16
22
|
import { DATE_TIME_FORMAT, AccessibilityLabel } from '../../configs/Constants';
|
|
17
23
|
|
|
18
|
-
let dateTemp = moment().format(DATE_TIME_FORMAT.YMD);
|
|
19
|
-
let isFirstTime = true;
|
|
20
|
-
|
|
21
24
|
const PlayBackCamera = () => {
|
|
22
|
-
const now = useMemo(() => moment().format(DATE_TIME_FORMAT.YMD), []);
|
|
23
|
-
const hourTemp = useMemo(() => moment().format('HH:mm:ss'), []);
|
|
24
|
-
const arrHourTemp = useMemo(() => hourTemp.split(':'), [hourTemp]);
|
|
25
25
|
const t = useTranslations();
|
|
26
26
|
const { params = {} } = useRoute();
|
|
27
|
-
const { item
|
|
28
|
-
const
|
|
27
|
+
const { item, thumbnail } = params;
|
|
28
|
+
const { configuration } = item;
|
|
29
|
+
const { time_zone, playback, name, uri } = configuration;
|
|
30
|
+
|
|
31
|
+
const initialDate = useMemo(() => moment().format(DATE_TIME_FORMAT.YMD), []);
|
|
32
|
+
const initialHour = useMemo(() => moment().format('HH:mm:ss').split(':'), []);
|
|
33
|
+
|
|
34
|
+
const [selected, setSelected] = useState(initialDate);
|
|
29
35
|
const [isShowDate, setIsShowDate] = useState(false);
|
|
30
36
|
const [hour, setHour] = useState({
|
|
31
|
-
h:
|
|
32
|
-
m:
|
|
33
|
-
s:
|
|
37
|
+
h: initialHour[0],
|
|
38
|
+
m: initialHour[1],
|
|
39
|
+
s: initialHour[2],
|
|
34
40
|
});
|
|
35
|
-
const [
|
|
36
|
-
const [mainURI, setMainURI] = useState(uri);
|
|
41
|
+
const [uriCamera, setUriCamera] = useState(uri);
|
|
37
42
|
const [paused, setPaused] = useState(false);
|
|
43
|
+
const isFirstTime = useRef(true); // Use useRef to track the first render
|
|
44
|
+
const tempDate = useRef(initialDate);
|
|
45
|
+
|
|
38
46
|
const onOpenDateModal = useCallback(() => {
|
|
47
|
+
tempDate.current = selected;
|
|
39
48
|
setIsShowDate(true);
|
|
40
|
-
}, []);
|
|
49
|
+
}, [selected, setIsShowDate]);
|
|
41
50
|
|
|
42
51
|
const onPressCancel = useCallback(() => {
|
|
43
52
|
setIsShowDate(false);
|
|
44
|
-
setSelected(
|
|
45
|
-
}, []);
|
|
53
|
+
setSelected(tempDate.current);
|
|
54
|
+
}, [setIsShowDate]);
|
|
55
|
+
|
|
56
|
+
const updateCameraPlayback = useCallback(
|
|
57
|
+
async (selectedTime) => {
|
|
58
|
+
setPaused(true);
|
|
59
|
+
await setUriPlayBack(selectedTime, hour);
|
|
60
|
+
setPaused(false);
|
|
61
|
+
},
|
|
62
|
+
[hour, setUriPlayBack]
|
|
63
|
+
);
|
|
46
64
|
|
|
47
65
|
const onPressOk = useCallback(() => {
|
|
48
66
|
setIsShowDate(false);
|
|
49
|
-
|
|
50
|
-
}, [selected]);
|
|
67
|
+
updateCameraPlayback(selected);
|
|
68
|
+
}, [selected, setIsShowDate, updateCameraPlayback]);
|
|
51
69
|
|
|
52
70
|
const onAddDate = useCallback(() => {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
}, [selected, now]);
|
|
71
|
+
const nextDate = moment(selected)
|
|
72
|
+
.add(1, 'days')
|
|
73
|
+
.format(DATE_TIME_FORMAT.YMD);
|
|
74
|
+
setSelected(nextDate);
|
|
75
|
+
updateCameraPlayback(nextDate);
|
|
76
|
+
}, [selected, updateCameraPlayback]);
|
|
60
77
|
|
|
61
78
|
const onSubtractDate = useCallback(() => {
|
|
62
|
-
|
|
63
|
-
const date = moment(selected)
|
|
79
|
+
const prevDate = moment(selected)
|
|
64
80
|
.subtract(1, 'days')
|
|
65
81
|
.format(DATE_TIME_FORMAT.YMD);
|
|
66
|
-
setSelected(
|
|
67
|
-
|
|
68
|
-
}, [selected]);
|
|
82
|
+
setSelected(prevDate);
|
|
83
|
+
updateCameraPlayback(prevDate);
|
|
84
|
+
}, [selected, updateCameraPlayback]);
|
|
69
85
|
|
|
70
86
|
const getHourWithTimeZone = useCallback(
|
|
71
|
-
// eslint-disable-next-line no-shadow
|
|
72
87
|
(hour) => {
|
|
73
88
|
const hourWithTimezone =
|
|
74
|
-
parseInt(hour, 10) + parseInt(
|
|
89
|
+
parseInt(hour, 10) + parseInt(time_zone || 0, 10);
|
|
75
90
|
if (hourWithTimezone < 0 || hourWithTimezone > 9) {
|
|
76
91
|
return hourWithTimezone;
|
|
77
92
|
}
|
|
78
93
|
return '0' + hourWithTimezone;
|
|
79
94
|
},
|
|
80
|
-
[
|
|
95
|
+
[time_zone]
|
|
81
96
|
);
|
|
82
97
|
|
|
83
98
|
const onScrollEndDrag = useCallback(() => {
|
|
84
|
-
setMainURI(uri);
|
|
85
99
|
setPaused(false);
|
|
86
|
-
}, [
|
|
100
|
+
}, []);
|
|
87
101
|
|
|
88
102
|
const onDayPress = useCallback((day) => {
|
|
89
103
|
setPaused(true);
|
|
@@ -99,13 +113,37 @@ const PlayBackCamera = () => {
|
|
|
99
113
|
addMonth && addMonth();
|
|
100
114
|
}, []);
|
|
101
115
|
|
|
116
|
+
const setUriPlayBack = useCallback(
|
|
117
|
+
(selectedTime, time) => {
|
|
118
|
+
const currentTime = moment().valueOf();
|
|
119
|
+
const selectedDayTime = moment(
|
|
120
|
+
`${selectedTime} ${time.h}:${time.m}:${time.s}`,
|
|
121
|
+
'YYYY-MM-DD HH:mm:SS'
|
|
122
|
+
).valueOf();
|
|
123
|
+
|
|
124
|
+
if (selectedDayTime > currentTime) {
|
|
125
|
+
setUriCamera(uri);
|
|
126
|
+
} else {
|
|
127
|
+
if (playback.includes('chID')) {
|
|
128
|
+
setUriCamera(
|
|
129
|
+
`${playback}&date=${selectedTime}&time=${time.h}:${time.m}:${time.s}&timelen=100&StreamType=main`
|
|
130
|
+
);
|
|
131
|
+
} else {
|
|
132
|
+
const date = selectedTime.split('-');
|
|
133
|
+
setUriCamera(
|
|
134
|
+
`${playback.split('=')[0]}=${date[0]}${date[1]}${
|
|
135
|
+
date[2]
|
|
136
|
+
}T${getHourWithTimeZone(time.h)}${time.m}${time.s}Z`
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
},
|
|
141
|
+
[getHourWithTimeZone, playback, uri]
|
|
142
|
+
);
|
|
143
|
+
|
|
102
144
|
const onChangeValue = useCallback(
|
|
103
145
|
(value, selectedTime) => {
|
|
104
|
-
if (!isFirstTime) {
|
|
105
|
-
const currentTime =
|
|
106
|
-
parseFloat(arrHourTemp[0]) +
|
|
107
|
-
parseFloat(arrHourTemp[1] / 60) +
|
|
108
|
-
parseFloat(arrHourTemp[2] / 3600);
|
|
146
|
+
if (!isFirstTime.current) {
|
|
109
147
|
setPaused(true);
|
|
110
148
|
const t1 = value / 96;
|
|
111
149
|
const t2 = t1.toString().split('.');
|
|
@@ -115,62 +153,23 @@ const PlayBackCamera = () => {
|
|
|
115
153
|
const h = t2[0] < 10 ? '0' + t2[0] : t2[0];
|
|
116
154
|
const m = t4[0] < 10 ? '0' + t4[0] : t4[0];
|
|
117
155
|
const s = t5 < 10 ? '0' + t5 : t5;
|
|
156
|
+
|
|
118
157
|
setHour({ h, m, s });
|
|
119
|
-
|
|
120
|
-
setUri(item?.configuration?.uri);
|
|
121
|
-
} else {
|
|
122
|
-
const playback = item?.configuration?.playback || '';
|
|
123
|
-
const date = selectedTime.split('-');
|
|
124
|
-
setUri(
|
|
125
|
-
`${playback.split('=')[0]}=${date[0]}${date[1]}${
|
|
126
|
-
date[2]
|
|
127
|
-
}T${getHourWithTimeZone(h)}${m}${s}Z`
|
|
128
|
-
);
|
|
129
|
-
}
|
|
158
|
+
setUriPlayBack(selectedTime, { h, m, s });
|
|
130
159
|
}
|
|
131
160
|
},
|
|
132
|
-
[
|
|
133
|
-
arrHourTemp,
|
|
134
|
-
getHourWithTimeZone,
|
|
135
|
-
item?.configuration?.playback,
|
|
136
|
-
item?.configuration?.uri,
|
|
137
|
-
now,
|
|
138
|
-
]
|
|
161
|
+
[setUriPlayBack]
|
|
139
162
|
);
|
|
140
163
|
|
|
141
|
-
const renderArrow = useCallback(
|
|
142
|
-
|
|
164
|
+
const renderArrow = useCallback(
|
|
165
|
+
(direction) => (
|
|
143
166
|
<Image
|
|
144
167
|
source={Images.arrowLeft}
|
|
145
168
|
style={[direction !== 'left' && styles.arrowRight]}
|
|
146
169
|
/>
|
|
147
|
-
)
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
useEffect(() => {
|
|
151
|
-
if (!isFirstTime) {
|
|
152
|
-
const date = selected.split('-');
|
|
153
|
-
const playback = item?.configuration?.playback || '';
|
|
154
|
-
if (
|
|
155
|
-
selected === now &&
|
|
156
|
-
parseInt(moment().format('HH:mm:ss'), 10) <=
|
|
157
|
-
parseInt(`${hour.h}:${hour.m}:${hour.s}`, 10)
|
|
158
|
-
) {
|
|
159
|
-
setMainURI(item?.configuration?.uri);
|
|
160
|
-
} else {
|
|
161
|
-
setMainURI(
|
|
162
|
-
`${playback.split('=')[0]}=${date[0]}${date[1]}${
|
|
163
|
-
date[2]
|
|
164
|
-
}T${getHourWithTimeZone(hour.h)}${hour.m}${hour.s}Z`
|
|
165
|
-
);
|
|
166
|
-
}
|
|
167
|
-
const to = setTimeout(() => {
|
|
168
|
-
setPaused(false);
|
|
169
|
-
clearTimeout(to);
|
|
170
|
-
}, 100);
|
|
171
|
-
}
|
|
172
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
173
|
-
}, [selected, getHourWithTimeZone]);
|
|
170
|
+
),
|
|
171
|
+
[]
|
|
172
|
+
);
|
|
174
173
|
|
|
175
174
|
useEffect(() => {
|
|
176
175
|
setStatusBarPreview(
|
|
@@ -179,13 +178,13 @@ const PlayBackCamera = () => {
|
|
|
179
178
|
}, [isShowDate]);
|
|
180
179
|
|
|
181
180
|
useEffect(() => {
|
|
182
|
-
const
|
|
183
|
-
isFirstTime = false;
|
|
184
|
-
clearTimeout(to);
|
|
181
|
+
const timeoutId = setTimeout(() => {
|
|
182
|
+
isFirstTime.current = false;
|
|
185
183
|
}, 2000);
|
|
184
|
+
|
|
186
185
|
return () => {
|
|
187
|
-
|
|
188
|
-
|
|
186
|
+
isFirstTime.current = true;
|
|
187
|
+
clearTimeout(timeoutId);
|
|
189
188
|
};
|
|
190
189
|
}, []);
|
|
191
190
|
|
|
@@ -193,11 +192,11 @@ const PlayBackCamera = () => {
|
|
|
193
192
|
<View style={styles.wrap}>
|
|
194
193
|
<HeaderCustom title={t('video_detail')} />
|
|
195
194
|
<MediaPlayerFull
|
|
196
|
-
uri={
|
|
195
|
+
uri={uriCamera}
|
|
197
196
|
isPaused={paused}
|
|
198
197
|
thumbnail={thumbnail}
|
|
199
198
|
isShowFullScreenIcon
|
|
200
|
-
cameraName={
|
|
199
|
+
cameraName={name}
|
|
201
200
|
amount={1}
|
|
202
201
|
/>
|
|
203
202
|
<View style={styles.container}>
|
|
@@ -209,19 +208,16 @@ const PlayBackCamera = () => {
|
|
|
209
208
|
>
|
|
210
209
|
<Image source={Images.arrowLeft} />
|
|
211
210
|
</TouchableOpacity>
|
|
212
|
-
|
|
213
|
-
accessibilityLabel={AccessibilityLabel.OPEN_DATE_MODAL}
|
|
214
|
-
onPress={onOpenDateModal}
|
|
215
|
-
style={styles.textDate}
|
|
216
|
-
type="h4"
|
|
217
|
-
>
|
|
218
|
-
{moment(selected).format('DD/MM/YYYY')}
|
|
219
|
-
</Text>
|
|
211
|
+
|
|
220
212
|
<TouchableOpacity
|
|
213
|
+
accessibilityLabel={AccessibilityLabel.OPEN_DATE_MODAL}
|
|
221
214
|
onPress={onOpenDateModal}
|
|
222
|
-
style={styles.
|
|
215
|
+
style={styles.row}
|
|
223
216
|
>
|
|
224
|
-
<
|
|
217
|
+
<Text onPress={onOpenDateModal} style={styles.textDate} type="h4">
|
|
218
|
+
{moment(selected).format('DD/MM/YYYY')}
|
|
219
|
+
</Text>
|
|
220
|
+
<Image source={Images.file} />
|
|
225
221
|
</TouchableOpacity>
|
|
226
222
|
<TouchableOpacity
|
|
227
223
|
accessibilityLabel={AccessibilityLabel.ON_PRESS_ADD_DATE}
|
|
@@ -238,9 +234,9 @@ const PlayBackCamera = () => {
|
|
|
238
234
|
<View style={styles.timer}>
|
|
239
235
|
<Timer
|
|
240
236
|
value={
|
|
241
|
-
(parseFloat(
|
|
242
|
-
parseFloat(
|
|
243
|
-
parseFloat(
|
|
237
|
+
(parseFloat(initialHour[0]) +
|
|
238
|
+
parseFloat(initialHour[1] / 60) +
|
|
239
|
+
parseFloat(initialHour[2] / 3600)) *
|
|
244
240
|
96
|
|
245
241
|
}
|
|
246
242
|
minimum={0}
|
|
@@ -260,11 +256,18 @@ const PlayBackCamera = () => {
|
|
|
260
256
|
</View>
|
|
261
257
|
</View>
|
|
262
258
|
|
|
263
|
-
<ModalCustom
|
|
259
|
+
<ModalCustom
|
|
260
|
+
isVisible={isShowDate}
|
|
261
|
+
style={styles.modal}
|
|
262
|
+
onBackdropPress={() => {
|
|
263
|
+
setIsShowDate(false);
|
|
264
|
+
}}
|
|
265
|
+
accessibilityLabel={AccessibilityLabel.MODAL_CUSTOM}
|
|
266
|
+
>
|
|
264
267
|
<View style={styles.wrapDate}>
|
|
265
268
|
<Calendar
|
|
266
269
|
onDayPress={onDayPress}
|
|
267
|
-
maxDate={
|
|
270
|
+
maxDate={initialDate}
|
|
268
271
|
onPressArrowLeft={onPressArrowLeft}
|
|
269
272
|
onPressArrowRight={onPressArrowRight}
|
|
270
273
|
markedDates={{
|
|
@@ -275,7 +278,7 @@ const PlayBackCamera = () => {
|
|
|
275
278
|
selectedTextColor: Colors.White,
|
|
276
279
|
},
|
|
277
280
|
}}
|
|
278
|
-
enableSwipeMonths
|
|
281
|
+
enableSwipeMonths
|
|
279
282
|
renderArrow={renderArrow}
|
|
280
283
|
headerStyle={styles.headerStyle}
|
|
281
284
|
/>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React, { memo,
|
|
1
|
+
import React, { memo, useCallback, useMemo, useState } from 'react';
|
|
2
2
|
import { View, StyleSheet } from 'react-native';
|
|
3
3
|
import Text from '../../../../commons/Text';
|
|
4
4
|
import { API, Colors } from '../../../../configs';
|
|
@@ -8,7 +8,7 @@ import ListQualityIndicator from '../../../../commons/Device/WaterQualitySensor/
|
|
|
8
8
|
import PMSensorIndicator from '../../../../commons/Device/PMSensor/PMSensorIndicator';
|
|
9
9
|
import VisualChart from '../../../Device/components/VisualChart';
|
|
10
10
|
import { useTranslations } from '../../../../hooks/Common/useTranslations';
|
|
11
|
-
import
|
|
11
|
+
import PowerConsumptionChart from '../../../../commons/Device/PowerConsumptionChart';
|
|
12
12
|
import { axiosGet } from '../../../../utils/Apis/axios';
|
|
13
13
|
import { AccessibilityLabel } from '../../../../configs/Constants';
|
|
14
14
|
import { useWatchConfigs } from '../../../../hooks/IoT';
|
|
@@ -114,10 +114,6 @@ const ThreePhasePowerConsumption = memo(({ summaryDetail }) => {
|
|
|
114
114
|
return !!listConfigs;
|
|
115
115
|
}, [listConfigs]);
|
|
116
116
|
|
|
117
|
-
const [startDate, setStartDate] = useState(
|
|
118
|
-
moment().subtract(6, 'days').valueOf()
|
|
119
|
-
);
|
|
120
|
-
const [endDate, setEndDate] = useState(moment().valueOf());
|
|
121
117
|
const [groupBy, setGroupBy] = useState('date');
|
|
122
118
|
const [getData, setData] = useState({});
|
|
123
119
|
const [chartConfig, setChartConfig] = useState({
|
|
@@ -125,8 +121,8 @@ const ThreePhasePowerConsumption = memo(({ summaryDetail }) => {
|
|
|
125
121
|
price: '',
|
|
126
122
|
});
|
|
127
123
|
|
|
128
|
-
|
|
129
|
-
|
|
124
|
+
const fetchData = useCallback(
|
|
125
|
+
async (startDate, endDate) => {
|
|
130
126
|
let params = new URLSearchParams();
|
|
131
127
|
params.append('config', total_power);
|
|
132
128
|
params.append('group_by', groupBy);
|
|
@@ -143,11 +139,9 @@ const ThreePhasePowerConsumption = memo(({ summaryDetail }) => {
|
|
|
143
139
|
if (success) {
|
|
144
140
|
setData(data);
|
|
145
141
|
}
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
}
|
|
150
|
-
}, [startDate, endDate, total_power, groupBy]);
|
|
142
|
+
},
|
|
143
|
+
[groupBy, total_power]
|
|
144
|
+
);
|
|
151
145
|
|
|
152
146
|
const dataTotal = useMemo(() => {
|
|
153
147
|
return total_power
|
|
@@ -191,21 +185,14 @@ const ThreePhasePowerConsumption = memo(({ summaryDetail }) => {
|
|
|
191
185
|
</Text>
|
|
192
186
|
|
|
193
187
|
<PMSensorIndicator data={dataTotal} style={styles.styleTotalPower} />
|
|
194
|
-
{
|
|
195
|
-
<
|
|
188
|
+
{total_power && (
|
|
189
|
+
<PowerConsumptionChart
|
|
190
|
+
onChangeDate={fetchData}
|
|
196
191
|
datas={getData}
|
|
197
192
|
chartConfig={chartConfig}
|
|
198
193
|
setChartConfig={setChartConfig}
|
|
199
|
-
formatType={'date'}
|
|
200
|
-
startDate={startDate}
|
|
201
|
-
setEndDate={setEndDate}
|
|
202
|
-
setStartDate={setStartDate}
|
|
203
194
|
groupBy={groupBy}
|
|
204
195
|
setGroupBy={setGroupBy}
|
|
205
|
-
configuration={{
|
|
206
|
-
type: 'horizontal_bar_chart',
|
|
207
|
-
config: 'power_consumption',
|
|
208
|
-
}}
|
|
209
196
|
/>
|
|
210
197
|
)}
|
|
211
198
|
</Section>
|
package/src/screens/UnitSummary/components/PowerConsumption/__test__/PowerConsumption.test.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import renderer, { act } from 'react-test-renderer';
|
|
2
|
+
import renderer, { act, create } from 'react-test-renderer';
|
|
3
3
|
import MockAdapter from 'axios-mock-adapter';
|
|
4
4
|
|
|
5
5
|
import { AccessibilityLabel } from '../../../../../configs/Constants';
|
|
@@ -104,13 +104,67 @@ describe('Test PowerConsumption', () => {
|
|
|
104
104
|
},
|
|
105
105
|
};
|
|
106
106
|
|
|
107
|
-
|
|
107
|
+
const data = [
|
|
108
|
+
{
|
|
109
|
+
config: 207,
|
|
110
|
+
data: [
|
|
111
|
+
{
|
|
112
|
+
x: 'Thu-20.06',
|
|
113
|
+
y: 7.94,
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
x: 'Wed-19.06',
|
|
117
|
+
y: 9.73,
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
x: 'Tue-18.06',
|
|
121
|
+
y: 4.11,
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
x: 'Mon-17.06',
|
|
125
|
+
y: 8.52,
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
x: 'Sun-16.06',
|
|
129
|
+
y: 5.72,
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
x: 'Sat-15.06',
|
|
133
|
+
y: 9.53,
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
x: 'Fri-14.06',
|
|
137
|
+
y: 11.83,
|
|
138
|
+
},
|
|
139
|
+
],
|
|
140
|
+
},
|
|
141
|
+
];
|
|
142
|
+
mock.onGet(API.VALUE_CONSUME.DISPLAY_HISTORY()).reply(200, data);
|
|
108
143
|
await act(async () => {
|
|
109
|
-
tree = await
|
|
144
|
+
tree = await create(wrapComponent(summaryDetail));
|
|
110
145
|
});
|
|
111
146
|
const instance = tree.root;
|
|
112
147
|
const Todays = instance.findByType(Today);
|
|
113
148
|
expect(Todays).toBeDefined();
|
|
149
|
+
|
|
150
|
+
const input_calculate_cost = instance.find(
|
|
151
|
+
(el) =>
|
|
152
|
+
el.props.accessibilityLabel === AccessibilityLabel.INPUT_CALCULATE_COST
|
|
153
|
+
);
|
|
154
|
+
await act(async () => {
|
|
155
|
+
input_calculate_cost.props.onChangeText('1000');
|
|
156
|
+
});
|
|
157
|
+
const button_calculate_cost = instance.find(
|
|
158
|
+
(el) =>
|
|
159
|
+
el.props.accessibilityLabel === AccessibilityLabel.BUTTON_CALCULATE_COST
|
|
160
|
+
);
|
|
161
|
+
await act(async () => {
|
|
162
|
+
button_calculate_cost.props.onPress();
|
|
163
|
+
});
|
|
164
|
+
const totalPrice = instance.find(
|
|
165
|
+
(el) => el.props.accessibilityLabel === AccessibilityLabel.TOTAL_PRICE
|
|
166
|
+
);
|
|
167
|
+
expect(totalPrice.props.children).toEqual('57.380 đ');
|
|
114
168
|
});
|
|
115
169
|
|
|
116
170
|
it('render with unsuccess fetch', async () => {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React, { memo, useMemo,
|
|
1
|
+
import React, { memo, useMemo, useState, useCallback } from 'react';
|
|
2
2
|
import { StyleSheet } from 'react-native';
|
|
3
3
|
import { useTranslations } from '../../../../hooks/Common/useTranslations';
|
|
4
4
|
import moment from 'moment';
|
|
@@ -8,7 +8,7 @@ import Text from '../../../../commons/Text';
|
|
|
8
8
|
import { Section, Today } from '../../../../commons';
|
|
9
9
|
import ListQualityIndicator from '../../../../commons/Device/WaterQualitySensor/ListQualityIndicator';
|
|
10
10
|
import PMSensorIndicator from '../../../../commons/Device/PMSensor/PMSensorIndicator';
|
|
11
|
-
import
|
|
11
|
+
import PowerConsumptionChart from '../../../../commons/Device/PowerConsumptionChart';
|
|
12
12
|
import { AccessibilityLabel } from '../../../../configs/Constants';
|
|
13
13
|
import { axiosGet } from '../../../../utils/Apis/axios';
|
|
14
14
|
import VisualChart from '../../../Device/components/VisualChart';
|
|
@@ -20,8 +20,7 @@ const PowerConsumption = memo(({ summaryDetail }) => {
|
|
|
20
20
|
const { volt, current, active_power, power_factor, total_power } =
|
|
21
21
|
listConfigs || {};
|
|
22
22
|
useWatchConfigs([volt, current, active_power, power_factor, total_power]);
|
|
23
|
-
|
|
24
|
-
const [endDate, setEndDate] = useState(moment());
|
|
23
|
+
|
|
25
24
|
const [groupBy, setGroupBy] = useState('date');
|
|
26
25
|
const [getData, setData] = useState([]);
|
|
27
26
|
const [chartConfig, setChartConfig] = useState({
|
|
@@ -32,13 +31,15 @@ const PowerConsumption = memo(({ summaryDetail }) => {
|
|
|
32
31
|
return !!listConfigs;
|
|
33
32
|
}, [listConfigs]);
|
|
34
33
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
34
|
+
const createDataItem = useCallback(
|
|
35
|
+
(id, color, title, measure) => ({
|
|
36
|
+
id,
|
|
37
|
+
color,
|
|
38
|
+
title,
|
|
39
|
+
measure,
|
|
40
|
+
}),
|
|
41
|
+
[]
|
|
42
|
+
);
|
|
42
43
|
|
|
43
44
|
const configs = useMemo(() => {
|
|
44
45
|
const data = [];
|
|
@@ -77,10 +78,10 @@ const PowerConsumption = memo(({ summaryDetail }) => {
|
|
|
77
78
|
),
|
|
78
79
|
]
|
|
79
80
|
: [];
|
|
80
|
-
}, [total_power]);
|
|
81
|
+
}, [createDataItem, total_power]);
|
|
81
82
|
|
|
82
|
-
|
|
83
|
-
|
|
83
|
+
const fetchData = useCallback(
|
|
84
|
+
async (startDate, endDate) => {
|
|
84
85
|
let params = new URLSearchParams();
|
|
85
86
|
params.append('config', total_power);
|
|
86
87
|
params.append('group_by', groupBy);
|
|
@@ -97,11 +98,9 @@ const PowerConsumption = memo(({ summaryDetail }) => {
|
|
|
97
98
|
if (success) {
|
|
98
99
|
setData(data);
|
|
99
100
|
}
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
}
|
|
104
|
-
}, [startDate, endDate, total_power, groupBy]);
|
|
101
|
+
},
|
|
102
|
+
[groupBy, total_power]
|
|
103
|
+
);
|
|
105
104
|
|
|
106
105
|
return (
|
|
107
106
|
<>
|
|
@@ -123,22 +122,14 @@ const PowerConsumption = memo(({ summaryDetail }) => {
|
|
|
123
122
|
</Text>
|
|
124
123
|
|
|
125
124
|
<PMSensorIndicator data={dataTotal} style={styles.styleTotalPower} />
|
|
126
|
-
{
|
|
127
|
-
<
|
|
125
|
+
{total_power && (
|
|
126
|
+
<PowerConsumptionChart
|
|
127
|
+
onChangeDate={fetchData}
|
|
128
128
|
datas={getData}
|
|
129
129
|
chartConfig={chartConfig}
|
|
130
130
|
setChartConfig={setChartConfig}
|
|
131
|
-
formatType={'date'}
|
|
132
|
-
startDate={startDate}
|
|
133
|
-
endDate={endDate}
|
|
134
|
-
setEndDate={setEndDate}
|
|
135
|
-
setStartDate={setStartDate}
|
|
136
131
|
groupBy={groupBy}
|
|
137
132
|
setGroupBy={setGroupBy}
|
|
138
|
-
configuration={{
|
|
139
|
-
type: 'horizontal_bar_chart',
|
|
140
|
-
config: 'power_consumption',
|
|
141
|
-
}}
|
|
142
133
|
/>
|
|
143
134
|
)}
|
|
144
135
|
</Section>
|