@eohjsc/react-native-smart-city 0.2.56 → 0.2.57
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/assets/images/SonosSpeaker/buttonpause-active.svg +3 -0
- package/assets/images/SonosSpeaker/buttonpause-notactive.svg +3 -0
- package/assets/images/SonosSpeaker/picture-main-notactive.svg +5 -0
- package/assets/images/SonosSpeaker/picture-main.svg +6 -0
- package/assets/images/SonosSpeaker/picture-volume.svg +3 -0
- package/package.json +2 -1
- package/src/commons/DateTimeRangeChange/index.js +2 -2
- package/src/commons/Device/HistoryChart.js +9 -39
- package/src/commons/Device/HorizontalBarChart.js +1 -1
- package/src/commons/Device/PMSensor/PMSensorIndicatior.js +1 -1
- package/src/commons/Device/PMSensor/PMSensorIndicatorStyles.js +2 -1
- package/src/commons/Device/SonosSpeaker/__test__/SonosSpeaker.test.js +57 -0
- package/src/commons/Device/SonosSpeaker/index.js +88 -0
- package/src/commons/Device/SonosSpeaker/styles.js +57 -0
- package/src/commons/Form/CurrencyInput.js +163 -0
- package/src/commons/Form/__test__/CurrencyInput.test.js +65 -0
- package/src/commons/Sharing/RowMember.js +3 -0
- package/src/commons/ThreeButtonHistory/__test__/ThreeButtonHistory.test.js +17 -8
- package/src/commons/ThreeButtonHistory/index.js +52 -23
- package/src/configs/Constants.js +2 -2
- package/src/screens/ActivityLog/ItemLog.js +9 -0
- package/src/screens/ActivityLog/__test__/ItemLog.test.js +43 -0
- package/src/screens/AddCommon/SelectSubUnit.js +1 -1
- package/src/screens/SubUnit/AddSubUnit.js +78 -59
- package/src/screens/Unit/Detail.js +7 -1
- package/src/screens/Unit/ManageUnit.js +3 -4
- package/src/screens/Unit/SmartAccountItem.js +1 -1
- package/src/screens/Unit/Summaries.js +5 -1
- package/src/screens/Unit/hook/useStateAlertRemove.js +3 -1
- package/src/screens/UnitSummary/components/3PPowerConsumption/index.js +1 -1
- package/src/screens/UnitSummary/components/PowerConsumption/index.js +1 -1
- package/src/screens/UnitSummary/components/WaterQuality/Item/index.js +1 -3
- package/src/screens/UnitSummary/index.js +3 -2
- package/src/utils/I18n/translations/en.json +6 -2
- package/src/utils/I18n/translations/vi.json +7 -3
|
@@ -20,7 +20,7 @@ const ThreeButtonHistory = memo(
|
|
|
20
20
|
const t = useTranslations();
|
|
21
21
|
const calendarRef = useRef();
|
|
22
22
|
const [selectedIndex, setSelectedIndex] = useState(2);
|
|
23
|
-
const [
|
|
23
|
+
const [showCalendar, setShowCalendar] = useState(false);
|
|
24
24
|
const [selectedStart, setSelectedStart] = useState(
|
|
25
25
|
moment(startDate).format('YYYY-MM-DD')
|
|
26
26
|
);
|
|
@@ -57,15 +57,15 @@ const ThreeButtonHistory = memo(
|
|
|
57
57
|
[selectedIndex]
|
|
58
58
|
);
|
|
59
59
|
|
|
60
|
-
const
|
|
60
|
+
const onCalendarCancel = useCallback(() => {
|
|
61
61
|
if (showSelectMonth) {
|
|
62
62
|
setShowSelectMonth(false);
|
|
63
63
|
return;
|
|
64
64
|
}
|
|
65
|
-
|
|
65
|
+
setShowCalendar(false);
|
|
66
66
|
}, [showSelectMonth, setShowSelectMonth]);
|
|
67
67
|
|
|
68
|
-
const
|
|
68
|
+
const onCalendarDone = useCallback(() => {
|
|
69
69
|
if (showSelectMonth) {
|
|
70
70
|
setShowSelectMonth(false);
|
|
71
71
|
return;
|
|
@@ -73,7 +73,7 @@ const ThreeButtonHistory = memo(
|
|
|
73
73
|
if (selectedStart === null || selectedEnd === null) {
|
|
74
74
|
return;
|
|
75
75
|
}
|
|
76
|
-
|
|
76
|
+
setShowCalendar(false);
|
|
77
77
|
setStartDate(moment(selectedStart).valueOf());
|
|
78
78
|
setEndDate(moment(selectedEnd).valueOf());
|
|
79
79
|
}, [
|
|
@@ -85,9 +85,12 @@ const ThreeButtonHistory = memo(
|
|
|
85
85
|
setShowSelectMonth,
|
|
86
86
|
]);
|
|
87
87
|
|
|
88
|
-
const
|
|
88
|
+
const onDateSelected = useCallback(
|
|
89
89
|
(date) => {
|
|
90
90
|
const selectedDate = date.dateString;
|
|
91
|
+
const mmSelectedDate = moment(selectedDate);
|
|
92
|
+
onMonthSelected(mmSelectedDate);
|
|
93
|
+
|
|
91
94
|
if (selectedDate === selectedStart) {
|
|
92
95
|
setSelectedStart(null);
|
|
93
96
|
return;
|
|
@@ -96,25 +99,54 @@ const ThreeButtonHistory = memo(
|
|
|
96
99
|
setSelectedEnd(null);
|
|
97
100
|
return;
|
|
98
101
|
}
|
|
99
|
-
|
|
102
|
+
|
|
103
|
+
if (!!selectedStart && !!selectedEnd) {
|
|
104
|
+
if (mmSelectedDate.isAfter(selectedEnd, 'date')) {
|
|
105
|
+
setSelectedEnd(selectedDate);
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
if (mmSelectedDate.isBefore(selectedStart, 'date')) {
|
|
109
|
+
setSelectedStart(selectedDate);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
if (
|
|
113
|
+
Math.abs(mmSelectedDate.diff(selectedStart, 'days')) <=
|
|
114
|
+
Math.abs(mmSelectedDate.diff(selectedEnd, 'days'))
|
|
115
|
+
) {
|
|
116
|
+
setSelectedStart(selectedDate);
|
|
117
|
+
} else {
|
|
118
|
+
setSelectedEnd(selectedDate);
|
|
119
|
+
}
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
if (selectedStart) {
|
|
124
|
+
if (mmSelectedDate.isBefore(selectedStart, 'date')) {
|
|
125
|
+
setSelectedStart(selectedDate);
|
|
126
|
+
setSelectedEnd(selectedStart);
|
|
127
|
+
} else {
|
|
128
|
+
setSelectedEnd(selectedDate);
|
|
129
|
+
}
|
|
100
130
|
return;
|
|
101
131
|
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
if (moment(selectedDate).isAfter(selectedEnd, 'date')) {
|
|
132
|
+
|
|
133
|
+
if (selectedEnd) {
|
|
134
|
+
if (mmSelectedDate.isAfter(selectedEnd, 'date')) {
|
|
106
135
|
setSelectedStart(selectedEnd);
|
|
107
136
|
setSelectedEnd(selectedDate);
|
|
108
137
|
} else {
|
|
109
138
|
setSelectedStart(selectedDate);
|
|
110
139
|
}
|
|
140
|
+
return;
|
|
111
141
|
}
|
|
142
|
+
|
|
143
|
+
setSelectedStart(selectedDate);
|
|
112
144
|
},
|
|
113
|
-
[selectedStart, selectedEnd]
|
|
145
|
+
[selectedStart, selectedEnd, onMonthSelected]
|
|
114
146
|
);
|
|
115
147
|
|
|
116
148
|
const onPressItemButton = useCallback(
|
|
117
|
-
(index) => {
|
|
149
|
+
(index) => () => {
|
|
118
150
|
switch (index) {
|
|
119
151
|
case 0:
|
|
120
152
|
setGroupBy('week');
|
|
@@ -124,9 +156,7 @@ const ThreeButtonHistory = memo(
|
|
|
124
156
|
break;
|
|
125
157
|
case 2:
|
|
126
158
|
setGroupBy('date');
|
|
127
|
-
|
|
128
|
-
setIsShowDate(true);
|
|
129
|
-
}
|
|
159
|
+
selectedIndex === 2 && setShowCalendar(true);
|
|
130
160
|
}
|
|
131
161
|
setSelectedIndex(index);
|
|
132
162
|
},
|
|
@@ -212,7 +242,6 @@ const ThreeButtonHistory = memo(
|
|
|
212
242
|
},
|
|
213
243
|
},
|
|
214
244
|
selected: true,
|
|
215
|
-
disableTouchEvent: true,
|
|
216
245
|
color: Colors.Gray4,
|
|
217
246
|
};
|
|
218
247
|
}
|
|
@@ -228,15 +257,15 @@ const ThreeButtonHistory = memo(
|
|
|
228
257
|
<ItemButton
|
|
229
258
|
key={index}
|
|
230
259
|
dateTitle={item.dateTitle}
|
|
231
|
-
onPress={
|
|
260
|
+
onPress={onPressItemButton(index)}
|
|
232
261
|
isSelected={selectedIndex === index}
|
|
233
262
|
/>
|
|
234
263
|
);
|
|
235
264
|
})}
|
|
236
265
|
</View>
|
|
237
266
|
<BottomSheet
|
|
238
|
-
isVisible={
|
|
239
|
-
onBackdropPress={
|
|
267
|
+
isVisible={showCalendar}
|
|
268
|
+
onBackdropPress={onCalendarCancel}
|
|
240
269
|
style={styles.modal}
|
|
241
270
|
>
|
|
242
271
|
<View style={styles.calendar}>
|
|
@@ -257,7 +286,7 @@ const ThreeButtonHistory = memo(
|
|
|
257
286
|
current={currentMonth.format('YYYY-MM-DD')}
|
|
258
287
|
style={showSelectMonth && styles.displayNone}
|
|
259
288
|
markingType={'custom'}
|
|
260
|
-
onDayPress={
|
|
289
|
+
onDayPress={onDateSelected}
|
|
261
290
|
maxDate={moment().format('YYYY-MM-DD')}
|
|
262
291
|
markedDates={markedDates}
|
|
263
292
|
hideArrows={true}
|
|
@@ -267,9 +296,9 @@ const ThreeButtonHistory = memo(
|
|
|
267
296
|
<View style={styles.separator} />
|
|
268
297
|
<ViewButtonBottom
|
|
269
298
|
leftTitle={t('cancel')}
|
|
270
|
-
onLeftClick={
|
|
299
|
+
onLeftClick={onCalendarCancel}
|
|
271
300
|
rightTitle={t('done')}
|
|
272
|
-
onRightClick={
|
|
301
|
+
onRightClick={onCalendarDone}
|
|
273
302
|
/>
|
|
274
303
|
</View>
|
|
275
304
|
</BottomSheet>
|
package/src/configs/Constants.js
CHANGED
|
@@ -116,13 +116,13 @@ export const AUTOMATES = {
|
|
|
116
116
|
value_change: {
|
|
117
117
|
value: AUTOMATE_TYPE.VALUE_CHANGE,
|
|
118
118
|
title: 'value_change',
|
|
119
|
-
explanation: '
|
|
119
|
+
explanation: 'setup_the_conditions',
|
|
120
120
|
icon: ValueChange,
|
|
121
121
|
},
|
|
122
122
|
schedule: {
|
|
123
123
|
value: AUTOMATE_TYPE.SCHEDULE,
|
|
124
124
|
title: 'schedule',
|
|
125
|
-
explanation: '
|
|
125
|
+
explanation: 'setup_the_schedule',
|
|
126
126
|
icon: Schedule,
|
|
127
127
|
},
|
|
128
128
|
};
|
|
@@ -39,6 +39,15 @@ const DetailLog = ({ item }) => {
|
|
|
39
39
|
<Text style={styles.name}>{item.name || item.params?.username}</Text>
|
|
40
40
|
</Text>
|
|
41
41
|
);
|
|
42
|
+
default:
|
|
43
|
+
return (
|
|
44
|
+
<Text style={styles.text}>
|
|
45
|
+
{item.action_name
|
|
46
|
+
? `${item.action_name} ${t('by')} `
|
|
47
|
+
: `${t('activated_by')} `}
|
|
48
|
+
<Text style={styles.name}>{item.name || item.params?.username}</Text>
|
|
49
|
+
</Text>
|
|
50
|
+
);
|
|
42
51
|
}
|
|
43
52
|
};
|
|
44
53
|
|
|
@@ -60,6 +60,49 @@ test('test ItemLog one tap', () => {
|
|
|
60
60
|
expect(texts[2].props.children).toBe(props.item.params.username);
|
|
61
61
|
});
|
|
62
62
|
|
|
63
|
+
test('test ItemLog script update', () => {
|
|
64
|
+
let tree;
|
|
65
|
+
let props = {
|
|
66
|
+
item: {
|
|
67
|
+
content_code: 'SCRIPT_UPDATED_BY',
|
|
68
|
+
params: {
|
|
69
|
+
username: 'username',
|
|
70
|
+
},
|
|
71
|
+
created_at: '2021-07-02T15:48:24.917932Z',
|
|
72
|
+
},
|
|
73
|
+
type: 'automate',
|
|
74
|
+
length: 2,
|
|
75
|
+
index: 1,
|
|
76
|
+
};
|
|
77
|
+
act(() => {
|
|
78
|
+
tree = create(wrapComponent(props));
|
|
79
|
+
});
|
|
80
|
+
const instance = tree.root;
|
|
81
|
+
const texts = instance.findAllByType(Text);
|
|
82
|
+
expect(texts[2].props.children).toBe(props.item.params.username);
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
test('test ItemLog no content_code', () => {
|
|
86
|
+
let tree;
|
|
87
|
+
let props = {
|
|
88
|
+
item: {
|
|
89
|
+
params: {
|
|
90
|
+
username: 'username',
|
|
91
|
+
},
|
|
92
|
+
created_at: '2021-07-02T15:48:24.917932Z',
|
|
93
|
+
},
|
|
94
|
+
type: 'action',
|
|
95
|
+
length: 2,
|
|
96
|
+
index: 1,
|
|
97
|
+
};
|
|
98
|
+
act(() => {
|
|
99
|
+
tree = create(wrapComponent(props));
|
|
100
|
+
});
|
|
101
|
+
const instance = tree.root;
|
|
102
|
+
const texts = instance.findAllByType(Text);
|
|
103
|
+
expect(texts[2].props.children).toBe(props.item.params.username);
|
|
104
|
+
});
|
|
105
|
+
|
|
63
106
|
describe('test ItemLog emergency event', () => {
|
|
64
107
|
let tree;
|
|
65
108
|
let props;
|
|
@@ -86,7 +86,7 @@ const AddCommonSelectSubUnit = ({ route }) => {
|
|
|
86
86
|
const addSubUnit = useCallback(() => {
|
|
87
87
|
navigation.navigate(Routes.AddSubUnitStack, {
|
|
88
88
|
screen: Routes.AddSubUnit,
|
|
89
|
-
params: { unit, ...route.params },
|
|
89
|
+
params: { unit, ...route.params, addType: 'AddHassiDevice' },
|
|
90
90
|
});
|
|
91
91
|
}, [navigation, unit, route.params]);
|
|
92
92
|
|
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
import React, {
|
|
1
|
+
import React, {
|
|
2
|
+
useState,
|
|
3
|
+
useCallback,
|
|
4
|
+
useMemo,
|
|
5
|
+
useEffect,
|
|
6
|
+
useRef,
|
|
7
|
+
} from 'react';
|
|
2
8
|
import {
|
|
3
9
|
View,
|
|
4
10
|
Image,
|
|
@@ -42,80 +48,93 @@ const prepareImageToUpload = async (image) => {
|
|
|
42
48
|
|
|
43
49
|
const AddSubUnit = ({ route }) => {
|
|
44
50
|
const t = useTranslations();
|
|
45
|
-
const
|
|
51
|
+
const { navigate, goBack } = useNavigation();
|
|
46
52
|
const { unit, addType, isAddUnit, location = '' } = route?.params;
|
|
47
53
|
const [roomName, setRoomName] = useState('');
|
|
48
54
|
const [wallpaper, setWallpaper] = useState('');
|
|
49
55
|
const [imageUrl, setImageUrl] = useState('');
|
|
50
56
|
const [showImagePicker, setShowImagePicker] = useState(false);
|
|
57
|
+
let awaitCreate = useRef(false);
|
|
51
58
|
|
|
52
59
|
const goDone = useCallback(async () => {
|
|
53
60
|
if (isAddUnit) {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
61
|
+
if (!awaitCreate.current) {
|
|
62
|
+
awaitCreate.current = true;
|
|
63
|
+
const dataObj = {
|
|
64
|
+
name: roomName,
|
|
65
|
+
address: location,
|
|
66
|
+
background: wallpaper,
|
|
67
|
+
};
|
|
68
|
+
dataObj.background = await prepareImageToUpload(dataObj.background);
|
|
69
|
+
const formData = createFormData(dataObj, ['background']);
|
|
70
|
+
const { success, data } = await axiosPost(
|
|
71
|
+
API.UNIT.CREATE_UNIT(),
|
|
72
|
+
formData,
|
|
73
|
+
{
|
|
74
|
+
headers: { 'Content-Type': 'multipart/form-data' },
|
|
75
|
+
}
|
|
76
|
+
);
|
|
77
|
+
if (success) {
|
|
78
|
+
navigate(Routes.UnitStack, {
|
|
79
|
+
screen: Routes.UnitDetail,
|
|
80
|
+
params: {
|
|
81
|
+
unitId: data?.id,
|
|
82
|
+
routeName: Routes.DashboardStack,
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
} else {
|
|
86
|
+
awaitCreate.current = false;
|
|
87
|
+
ToastBottomHelper.error(t('text_create_unit_fail'));
|
|
66
88
|
}
|
|
67
|
-
);
|
|
68
|
-
if (success) {
|
|
69
|
-
navigation.navigate(Routes.UnitStack, {
|
|
70
|
-
screen: Routes.UnitDetail,
|
|
71
|
-
params: {
|
|
72
|
-
unitId: data?.id,
|
|
73
|
-
},
|
|
74
|
-
});
|
|
75
|
-
} else {
|
|
76
|
-
ToastBottomHelper.error(t('text_create_unit_fail'));
|
|
77
89
|
}
|
|
78
90
|
} else {
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
91
|
+
if (!awaitCreate.current) {
|
|
92
|
+
awaitCreate.current = true;
|
|
93
|
+
const dataObj = { name: roomName, background: wallpaper };
|
|
94
|
+
dataObj.background = await prepareImageToUpload(dataObj.background);
|
|
95
|
+
const formData = createFormData(dataObj, ['background']);
|
|
96
|
+
const { success, data } = await axiosPost(
|
|
97
|
+
API.SUB_UNIT.CREATE_SUB_UNIT(unit.id),
|
|
98
|
+
formData,
|
|
99
|
+
{
|
|
100
|
+
headers: { 'Content-Type': 'multipart/form-data' },
|
|
101
|
+
}
|
|
102
|
+
);
|
|
103
|
+
if (success) {
|
|
104
|
+
ToastBottomHelper.success(t('text_create_sub_unit_success'));
|
|
105
|
+
if (addType === 'AddHassiDevice') {
|
|
106
|
+
goBack();
|
|
107
|
+
return;
|
|
108
|
+
} else if (addType === 'AddNewGateway') {
|
|
109
|
+
navigate(Routes.AddCommonSelectSubUnit, {
|
|
110
|
+
...route.params,
|
|
111
|
+
});
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
navigate(Routes.UnitStack, {
|
|
115
|
+
screen: Routes.SubUnitDetail,
|
|
116
|
+
params: {
|
|
117
|
+
unit: unit,
|
|
118
|
+
station: data,
|
|
119
|
+
},
|
|
95
120
|
});
|
|
96
|
-
|
|
121
|
+
} else {
|
|
122
|
+
awaitCreate.current = false;
|
|
123
|
+
ToastBottomHelper.error(t('text_create_sub_unit_fail'));
|
|
97
124
|
}
|
|
98
|
-
navigation.navigate(Routes.UnitStack, {
|
|
99
|
-
screen: Routes.SubUnitDetail,
|
|
100
|
-
params: {
|
|
101
|
-
unit: unit,
|
|
102
|
-
station: data,
|
|
103
|
-
},
|
|
104
|
-
});
|
|
105
|
-
} else {
|
|
106
|
-
ToastBottomHelper.error(t('text_create_sub_unit_fail'));
|
|
107
125
|
}
|
|
108
126
|
}
|
|
109
127
|
}, [
|
|
110
|
-
|
|
111
|
-
navigation,
|
|
128
|
+
isAddUnit,
|
|
112
129
|
roomName,
|
|
113
|
-
|
|
130
|
+
location,
|
|
131
|
+
wallpaper,
|
|
132
|
+
navigate,
|
|
114
133
|
t,
|
|
115
134
|
unit,
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
135
|
+
addType,
|
|
136
|
+
goBack,
|
|
137
|
+
route.params,
|
|
119
138
|
]);
|
|
120
139
|
|
|
121
140
|
const onChoosePhoto = useCallback(() => {
|
|
@@ -144,8 +163,8 @@ const AddSubUnit = ({ route }) => {
|
|
|
144
163
|
}, [roomName, wallpaper, location, isAddUnit]);
|
|
145
164
|
|
|
146
165
|
const onChooseLocation = useCallback(() => {
|
|
147
|
-
|
|
148
|
-
}, [
|
|
166
|
+
navigate(Routes.AddLocationMaps);
|
|
167
|
+
}, [navigate]);
|
|
149
168
|
|
|
150
169
|
return (
|
|
151
170
|
<SafeAreaView style={styles.wrap}>
|
|
@@ -211,7 +230,7 @@ const AddSubUnit = ({ route }) => {
|
|
|
211
230
|
</View>
|
|
212
231
|
<ViewButtonBottom
|
|
213
232
|
leftTitle={t('cancel')}
|
|
214
|
-
onLeftClick={() =>
|
|
233
|
+
onLeftClick={() => goBack()}
|
|
215
234
|
rightTitle={t('done')}
|
|
216
235
|
rightDisabled={validateData}
|
|
217
236
|
onRightClick={goDone}
|
|
@@ -30,7 +30,7 @@ import { AUTOMATE_TYPE } from '../../configs/Constants';
|
|
|
30
30
|
|
|
31
31
|
const UnitDetail = ({ route }) => {
|
|
32
32
|
const t = useTranslations();
|
|
33
|
-
const { unitId, unitData, isOneTap } = route.params;
|
|
33
|
+
const { unitId, unitData, isOneTap, routeName } = route.params;
|
|
34
34
|
const isFocused = useIsFocused();
|
|
35
35
|
const { stateData, setAction } = useContext(SCContext);
|
|
36
36
|
const { navigate } = useNavigation();
|
|
@@ -274,6 +274,11 @@ const UnitDetail = ({ route }) => {
|
|
|
274
274
|
);
|
|
275
275
|
}
|
|
276
276
|
};
|
|
277
|
+
|
|
278
|
+
const onBack = useCallback(() => {
|
|
279
|
+
navigate(routeName);
|
|
280
|
+
}, [navigate, routeName]);
|
|
281
|
+
|
|
277
282
|
return (
|
|
278
283
|
<WrapParallaxScrollView
|
|
279
284
|
uriImg={unit.background}
|
|
@@ -286,6 +291,7 @@ const UnitDetail = ({ route }) => {
|
|
|
286
291
|
onAdd={setShowAdd}
|
|
287
292
|
onMore={showPopoverWithRef}
|
|
288
293
|
hideRightPlus={!isOwner}
|
|
294
|
+
onBack={routeName && onBack}
|
|
289
295
|
>
|
|
290
296
|
<View style={styles.container}>
|
|
291
297
|
<Summaries unit={unit} />
|
|
@@ -11,7 +11,6 @@ import {
|
|
|
11
11
|
axiosPatch,
|
|
12
12
|
axiosDelete,
|
|
13
13
|
} from '../../utils/Apis/axios';
|
|
14
|
-
import { navigate } from '../../navigations/utils';
|
|
15
14
|
import useBoolean from '../../hooks/Common/useBoolean';
|
|
16
15
|
import useKeyboardAnimated from '../../hooks/Explore/useKeyboardAnimated';
|
|
17
16
|
|
|
@@ -134,11 +133,11 @@ const ManageUnit = ({ route }) => {
|
|
|
134
133
|
const goRemove = useCallback(async () => {
|
|
135
134
|
const { success } = await axiosDelete(API.UNIT.MANAGE_UNIT(unit.id));
|
|
136
135
|
if (success) {
|
|
137
|
-
|
|
136
|
+
setHideRemove(true);
|
|
138
137
|
ToastBottomHelper.success(t('unit_deleted_successfully'));
|
|
139
|
-
navigate(Routes.Dashboard);
|
|
138
|
+
navigation.navigate(Routes.Dashboard);
|
|
140
139
|
}
|
|
141
|
-
}, [unit.id,
|
|
140
|
+
}, [unit.id, setHideRemove, t, navigation]);
|
|
142
141
|
|
|
143
142
|
const goToManageSubUnit = useCallback(() => {
|
|
144
143
|
navigation.navigate(Routes.UnitStack, {
|
|
@@ -31,7 +31,7 @@ export const SmartAccountItem = memo(
|
|
|
31
31
|
/>
|
|
32
32
|
<View style={styles.wrap}>
|
|
33
33
|
<Text numberOfLines={1} type="H4">
|
|
34
|
-
{item?.brand}
|
|
34
|
+
{item?.brand === 'google_home' ? 'Điện Quang' : item?.brand}
|
|
35
35
|
</Text>
|
|
36
36
|
<Text numberOfLines={2} type="Body" color={Colors.Gray7}>
|
|
37
37
|
{item?.username}
|
|
@@ -20,7 +20,11 @@ const Summaries = memo(({ unit }) => {
|
|
|
20
20
|
return;
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
-
const { success, data } = await axiosGet(
|
|
23
|
+
const { success, data } = await axiosGet(
|
|
24
|
+
API.UNIT.UNIT_SUMMARY(unit.id),
|
|
25
|
+
{},
|
|
26
|
+
true
|
|
27
|
+
);
|
|
24
28
|
if (success && data.length) {
|
|
25
29
|
setUnitSummaries(data);
|
|
26
30
|
}
|
|
@@ -22,7 +22,9 @@ export const useStateAlertRemove = () => {
|
|
|
22
22
|
setStateAlertRemove((state) => ({
|
|
23
23
|
...state,
|
|
24
24
|
visible: true,
|
|
25
|
-
message: `${t('are_you_sure_want_to_delete', {
|
|
25
|
+
message: `${t('are_you_sure_want_to_delete', {
|
|
26
|
+
text: brand === 'google_home' ? 'Điện Quang' : brand,
|
|
27
|
+
})}`,
|
|
26
28
|
}));
|
|
27
29
|
},
|
|
28
30
|
[t]
|
|
@@ -239,7 +239,7 @@ const ThreePhasePowerConsumption = memo(({ unit, summary, summaryDetail }) => {
|
|
|
239
239
|
</Section>
|
|
240
240
|
|
|
241
241
|
<Section type={'border'}>
|
|
242
|
-
<Text semibold style={styles.textIndoor}
|
|
242
|
+
<Text type="H3" semibold style={styles.textIndoor}>
|
|
243
243
|
{t('text_total_power_consumption')}
|
|
244
244
|
</Text>
|
|
245
245
|
|
|
@@ -145,7 +145,7 @@ const PowerConsumption = memo(({ summaryDetail }) => {
|
|
|
145
145
|
</Section>
|
|
146
146
|
|
|
147
147
|
<Section type={'border'}>
|
|
148
|
-
<Text semibold style={styles.textIndoor}
|
|
148
|
+
<Text type="H3" semibold style={styles.textIndoor}>
|
|
149
149
|
{t('text_total_power_consumption')}
|
|
150
150
|
</Text>
|
|
151
151
|
|
|
@@ -35,9 +35,7 @@ const Item = memo((props) => {
|
|
|
35
35
|
<Text size={24} color={color || Colors.Gray9} style={styles.textValue}>
|
|
36
36
|
{value}
|
|
37
37
|
</Text>
|
|
38
|
-
<Text
|
|
39
|
-
{des}
|
|
40
|
-
</Text>
|
|
38
|
+
<Text color={Colors.Gray8}>{des}</Text>
|
|
41
39
|
<View style={styles.boxSvg}>
|
|
42
40
|
<Text>{svgMain}</Text>
|
|
43
41
|
</View>
|
|
@@ -68,7 +68,9 @@ const UnitSummary = memo(({ route }) => {
|
|
|
68
68
|
|
|
69
69
|
const fetchSummaryDetail = useCallback(async () => {
|
|
70
70
|
const { success, data } = await axiosGet(
|
|
71
|
-
API.UNIT.UNIT_SUMMARY_DETAIL(unit.id, summary.id)
|
|
71
|
+
API.UNIT.UNIT_SUMMARY_DETAIL(unit.id, summary.id),
|
|
72
|
+
{},
|
|
73
|
+
true
|
|
72
74
|
);
|
|
73
75
|
setLoading(false);
|
|
74
76
|
if (success) {
|
|
@@ -136,7 +138,6 @@ const styles = StyleSheet.create({
|
|
|
136
138
|
container: {
|
|
137
139
|
flex: 1,
|
|
138
140
|
backgroundColor: Colors.Gray2,
|
|
139
|
-
paddingBottom: 60,
|
|
140
141
|
},
|
|
141
142
|
textHeader: {
|
|
142
143
|
color: Colors.Gray9,
|
|
@@ -186,7 +186,8 @@
|
|
|
186
186
|
"explanation": "Do everything with just one button",
|
|
187
187
|
"value_change": "Value change",
|
|
188
188
|
"schedule": "Schedule",
|
|
189
|
-
"
|
|
189
|
+
"setup_the_conditions": "Setup the conditions",
|
|
190
|
+
"setup_the_schedule": "Setup the Schedule",
|
|
190
191
|
"des_launch_one_tap": "Quick button create at the dashboard",
|
|
191
192
|
"active_list": "Actions List",
|
|
192
193
|
"text_very_good_level": "Very good",
|
|
@@ -839,5 +840,8 @@
|
|
|
839
840
|
"connected_via_internet": "Connected via Internet",
|
|
840
841
|
"name_your_unit": "Name your unit",
|
|
841
842
|
"script_updated_by": "Script updated by",
|
|
842
|
-
"qr_scan_guidelines": "The QR code will be detected automatically when it’s positioned within the guide lines."
|
|
843
|
+
"qr_scan_guidelines": "The QR code will be detected automatically when it’s positioned within the guide lines.",
|
|
844
|
+
"now_playing": "Now Playing",
|
|
845
|
+
"pause": "Pause",
|
|
846
|
+
"volume": "Volume"
|
|
843
847
|
}
|
|
@@ -43,7 +43,8 @@
|
|
|
43
43
|
"launch_one_tap": "Khởi chạy một lần chạm",
|
|
44
44
|
"explanation": "Làm mọi thứ chỉ với một nút",
|
|
45
45
|
"value_change": "Thay đổi giá trị",
|
|
46
|
-
"
|
|
46
|
+
"setup_the_conditions": "Cài đặt điều kiện",
|
|
47
|
+
"setup_the_schedule": "Cài đặt thời gian ",
|
|
47
48
|
"schedule": "Lịch trình",
|
|
48
49
|
"des_launch_one_tap": "Tạo nút nhanh trên trang tổng quan",
|
|
49
50
|
"active_list": "Danh sách hành động",
|
|
@@ -341,7 +342,7 @@
|
|
|
341
342
|
"current_wind_speed": "Tốc độ gió hiện tại",
|
|
342
343
|
"history": "Lịch sử",
|
|
343
344
|
"wind_speed": "Tốc độ gió",
|
|
344
|
-
"from": "
|
|
345
|
+
"from": "Từ",
|
|
345
346
|
"to": "đến",
|
|
346
347
|
"condition": "Điều kiện",
|
|
347
348
|
"shared_unit": "Khu vực được chia sẻ",
|
|
@@ -840,5 +841,8 @@
|
|
|
840
841
|
"connected_via_internet": "Đã kết nối điều khiển thông qua Internet",
|
|
841
842
|
"name_your_unit": "Đặt tên cho khu vực của bạn",
|
|
842
843
|
"script_updated_by": "Kịch bản được cập nhật bởi",
|
|
843
|
-
"qr_scan_guidelines": "Mã QR sẽ được phát hiện tự động khi nó được định vị trong các dòng hướng dẫn."
|
|
844
|
+
"qr_scan_guidelines": "Mã QR sẽ được phát hiện tự động khi nó được định vị trong các dòng hướng dẫn.",
|
|
845
|
+
"now_playing": "Đang chạy",
|
|
846
|
+
"pause": "Tạm dừng",
|
|
847
|
+
"volume": "Âm lượng"
|
|
844
848
|
}
|