@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.
Files changed (36) hide show
  1. package/README.md +44 -6
  2. package/package.json +1 -1
  3. package/src/commons/Device/HorizontalBarChart.js +1 -1
  4. package/src/commons/Device/PowerConsumptionChart.js +159 -0
  5. package/src/commons/Device/ProgressBar/__test__/ProgressBar.test.js +2 -3
  6. package/src/commons/Device/ProgressBar/index.js +36 -38
  7. package/src/commons/Device/ProgressBar/styles.js +18 -24
  8. package/src/commons/Form/CurrencyInput.js +2 -0
  9. package/src/commons/UnitSummary/ConfigHistoryChart/index.js +6 -61
  10. package/src/commons/Widgets/IFrame/IFrame.js +54 -0
  11. package/src/commons/Widgets/IFrame/IFrameStyles.js +35 -0
  12. package/src/commons/Widgets/IFrame/__tests__/IFrame.test.js +74 -0
  13. package/src/commons/Widgets/IFrame/index.js +0 -0
  14. package/src/commons/Widgets/IFrameWithConfig/IFrameWithConfig.js +163 -0
  15. package/src/commons/Widgets/IFrameWithConfig/IFrameWithConfigStyles.js +9 -0
  16. package/src/commons/Widgets/IFrameWithConfig/__tests__/IFrameWithConfig.test.js +284 -0
  17. package/src/commons/Widgets/IFrameWithConfig/index.js +0 -0
  18. package/src/commons/Widgets/Widget.js +0 -0
  19. package/src/commons/Widgets/index.js +0 -0
  20. package/src/configs/AccessibilityLabel.js +3 -0
  21. package/src/configs/Constants.js +5 -0
  22. package/src/hooks/Common/useDevicesStatus.js +23 -23
  23. package/src/screens/Device/__test__/sensorDisplayItem.test.js +3 -3
  24. package/src/screens/Device/components/SensorDisplayItem.js +23 -5
  25. package/src/screens/Device/components/__test__/VisualChart.test.js +2 -9
  26. package/src/screens/PlayBackCamera/Styles/index.js +2 -4
  27. package/src/screens/PlayBackCamera/Timer.js +65 -47
  28. package/src/screens/PlayBackCamera/__test__/index.test.js +27 -19
  29. package/src/screens/PlayBackCamera/index.js +114 -111
  30. package/src/screens/UnitSummary/components/3PPowerConsumption/index.js +10 -23
  31. package/src/screens/UnitSummary/components/PowerConsumption/__test__/PowerConsumption.test.js +57 -3
  32. package/src/screens/UnitSummary/components/PowerConsumption/index.js +21 -30
  33. package/src/commons/Device/HistoryChart.js +0 -225
  34. package/src/commons/UnitSummary/ConfigHistoryChart/__test__/ConfigHistoryChart.test.js +0 -289
  35. package/src/screens/Device/__test__/DetailHistoryChart.test.js +0 -69
  36. package/src/screens/Device/components/DetailHistoryChart.js +0 -118
@@ -1,5 +1,11 @@
1
1
  import moment from 'moment';
2
- import React, { useState, useCallback, useEffect, useMemo } from '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 = {}, thumbnail } = params;
28
- const [selected, setSelected] = useState(dateTemp);
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: arrHourTemp[0],
32
- m: arrHourTemp[1],
33
- s: arrHourTemp[2],
37
+ h: initialHour[0],
38
+ m: initialHour[1],
39
+ s: initialHour[2],
34
40
  });
35
- const [uri, setUri] = useState(item?.configuration?.uri);
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(dateTemp);
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
- dateTemp = selected;
50
- }, [selected]);
67
+ updateCameraPlayback(selected);
68
+ }, [selected, setIsShowDate, updateCameraPlayback]);
51
69
 
52
70
  const onAddDate = useCallback(() => {
53
- setPaused(true);
54
- if (selected !== now) {
55
- const date = moment(selected).add(1, 'days').format(DATE_TIME_FORMAT.YMD);
56
- setSelected(date);
57
- dateTemp = date;
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
- setPaused(true);
63
- const date = moment(selected)
79
+ const prevDate = moment(selected)
64
80
  .subtract(1, 'days')
65
81
  .format(DATE_TIME_FORMAT.YMD);
66
- setSelected(date);
67
- dateTemp = date;
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(item?.configuration?.time_zone || 0, 10);
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
- [item?.configuration?.time_zone]
95
+ [time_zone]
81
96
  );
82
97
 
83
98
  const onScrollEndDrag = useCallback(() => {
84
- setMainURI(uri);
85
99
  setPaused(false);
86
- }, [uri]);
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
- if (value + 0.5 > currentTime * 96 && selectedTime === now) {
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((direction) => {
142
- return (
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 to = setTimeout(() => {
183
- isFirstTime = false;
184
- clearTimeout(to);
181
+ const timeoutId = setTimeout(() => {
182
+ isFirstTime.current = false;
185
183
  }, 2000);
184
+
186
185
  return () => {
187
- dateTemp = moment().format(DATE_TIME_FORMAT.YMD);
188
- isFirstTime = true;
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={mainURI}
195
+ uri={uriCamera}
197
196
  isPaused={paused}
198
197
  thumbnail={thumbnail}
199
198
  isShowFullScreenIcon
200
- cameraName={item?.configuration?.name}
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
- <Text
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.commonButton}
215
+ style={styles.row}
223
216
  >
224
- <Image source={Images.file} style={styles.iconDate} />
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(arrHourTemp[0]) +
242
- parseFloat(arrHourTemp[1] / 60) +
243
- parseFloat(arrHourTemp[2] / 3600)) *
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 isVisible={isShowDate} style={styles.modal}>
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={moment().format(DATE_TIME_FORMAT.YMD)}
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={true}
281
+ enableSwipeMonths
279
282
  renderArrow={renderArrow}
280
283
  headerStyle={styles.headerStyle}
281
284
  />
@@ -1,4 +1,4 @@
1
- import React, { memo, useEffect, useMemo, useState } from 'react';
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 HistoryChart from '../../../../commons/Device/HistoryChart';
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
- useEffect(() => {
129
- const fetchData = async () => {
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
- if (total_power) {
148
- fetchData();
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
- {!!getData?.length && (
195
- <HistoryChart
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>
@@ -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
- mock.onGet(API.VALUE_CONSUME.DISPLAY_HISTORY()).reply(200);
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 renderer.create(wrapComponent(summaryDetail));
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, useEffect, useState } from 'react';
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 HistoryChart from '../../../../commons/Device/HistoryChart';
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
- const [startDate, setStartDate] = useState(moment().subtract(6, 'days'));
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
- // eslint-disable-next-line react-hooks/exhaustive-deps
36
- const createDataItem = (id, color, title, measure) => ({
37
- id,
38
- color,
39
- title,
40
- measure,
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
- useEffect(() => {
83
- const fetchData = async () => {
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
- if (total_power) {
102
- fetchData();
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
- {!!getData?.length && (
127
- <HistoryChart
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>