@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.
Files changed (35) hide show
  1. package/assets/images/SonosSpeaker/buttonpause-active.svg +3 -0
  2. package/assets/images/SonosSpeaker/buttonpause-notactive.svg +3 -0
  3. package/assets/images/SonosSpeaker/picture-main-notactive.svg +5 -0
  4. package/assets/images/SonosSpeaker/picture-main.svg +6 -0
  5. package/assets/images/SonosSpeaker/picture-volume.svg +3 -0
  6. package/package.json +2 -1
  7. package/src/commons/DateTimeRangeChange/index.js +2 -2
  8. package/src/commons/Device/HistoryChart.js +9 -39
  9. package/src/commons/Device/HorizontalBarChart.js +1 -1
  10. package/src/commons/Device/PMSensor/PMSensorIndicatior.js +1 -1
  11. package/src/commons/Device/PMSensor/PMSensorIndicatorStyles.js +2 -1
  12. package/src/commons/Device/SonosSpeaker/__test__/SonosSpeaker.test.js +57 -0
  13. package/src/commons/Device/SonosSpeaker/index.js +88 -0
  14. package/src/commons/Device/SonosSpeaker/styles.js +57 -0
  15. package/src/commons/Form/CurrencyInput.js +163 -0
  16. package/src/commons/Form/__test__/CurrencyInput.test.js +65 -0
  17. package/src/commons/Sharing/RowMember.js +3 -0
  18. package/src/commons/ThreeButtonHistory/__test__/ThreeButtonHistory.test.js +17 -8
  19. package/src/commons/ThreeButtonHistory/index.js +52 -23
  20. package/src/configs/Constants.js +2 -2
  21. package/src/screens/ActivityLog/ItemLog.js +9 -0
  22. package/src/screens/ActivityLog/__test__/ItemLog.test.js +43 -0
  23. package/src/screens/AddCommon/SelectSubUnit.js +1 -1
  24. package/src/screens/SubUnit/AddSubUnit.js +78 -59
  25. package/src/screens/Unit/Detail.js +7 -1
  26. package/src/screens/Unit/ManageUnit.js +3 -4
  27. package/src/screens/Unit/SmartAccountItem.js +1 -1
  28. package/src/screens/Unit/Summaries.js +5 -1
  29. package/src/screens/Unit/hook/useStateAlertRemove.js +3 -1
  30. package/src/screens/UnitSummary/components/3PPowerConsumption/index.js +1 -1
  31. package/src/screens/UnitSummary/components/PowerConsumption/index.js +1 -1
  32. package/src/screens/UnitSummary/components/WaterQuality/Item/index.js +1 -3
  33. package/src/screens/UnitSummary/index.js +3 -2
  34. package/src/utils/I18n/translations/en.json +6 -2
  35. 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 [isShowDate, setIsShowDate] = useState(false);
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 onPressCancel = useCallback(() => {
60
+ const onCalendarCancel = useCallback(() => {
61
61
  if (showSelectMonth) {
62
62
  setShowSelectMonth(false);
63
63
  return;
64
64
  }
65
- setIsShowDate(false);
65
+ setShowCalendar(false);
66
66
  }, [showSelectMonth, setShowSelectMonth]);
67
67
 
68
- const onPressDone = useCallback(() => {
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
- setIsShowDate(false);
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 onDayPress = useCallback(
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
- if (selectedStart !== null && selectedEnd !== null) {
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
- if (selectedEnd === null) {
103
- setSelectedEnd(selectedDate);
104
- } else {
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
- if (selectedIndex === 2) {
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={() => onPressItemButton(index)}
260
+ onPress={onPressItemButton(index)}
232
261
  isSelected={selectedIndex === index}
233
262
  />
234
263
  );
235
264
  })}
236
265
  </View>
237
266
  <BottomSheet
238
- isVisible={isShowDate}
239
- onBackdropPress={onPressCancel}
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={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={onPressCancel}
299
+ onLeftClick={onCalendarCancel}
271
300
  rightTitle={t('done')}
272
- onRightClick={onPressDone}
301
+ onRightClick={onCalendarDone}
273
302
  />
274
303
  </View>
275
304
  </BottomSheet>
@@ -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: 'short_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: 'short_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, { useState, useCallback, useMemo, useEffect } from '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 navigation = useNavigation();
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
- const dataObj = {
55
- name: roomName,
56
- address: location,
57
- background: wallpaper,
58
- };
59
- dataObj.background = await prepareImageToUpload(dataObj.background);
60
- const formData = createFormData(dataObj, ['background']);
61
- const { success, data } = await axiosPost(
62
- API.UNIT.CREATE_UNIT(),
63
- formData,
64
- {
65
- headers: { 'Content-Type': 'multipart/form-data' },
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
- const dataObj = { name: roomName, background: wallpaper };
80
- dataObj.background = await prepareImageToUpload(dataObj.background);
81
- const formData = createFormData(dataObj, ['background']);
82
- const { success, data } = await axiosPost(
83
- API.SUB_UNIT.CREATE_SUB_UNIT(unit.id),
84
- formData,
85
- {
86
- headers: { 'Content-Type': 'multipart/form-data' },
87
- }
88
- );
89
- if (success) {
90
- ToastBottomHelper.success(t('text_create_sub_unit_success'));
91
-
92
- if (addType === 'AddNewGateway') {
93
- navigation.navigate(Routes.AddCommonSelectSubUnit, {
94
- ...route.params,
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
- return;
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
- addType,
111
- navigation,
128
+ isAddUnit,
112
129
  roomName,
113
- route.params,
130
+ location,
131
+ wallpaper,
132
+ navigate,
114
133
  t,
115
134
  unit,
116
- wallpaper,
117
- isAddUnit,
118
- location,
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
- navigation.navigate(Routes.AddLocationMaps);
148
- }, [navigation]);
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={() => navigation.goBack()}
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
- setHideEdit(true);
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, setHideEdit, t]);
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(API.UNIT.UNIT_SUMMARY(unit.id));
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', { text: brand })}`,
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} size={20}>
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} size={20}>
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 size={12} color={Colors.Gray8}>
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
- "short_explanation": "Short explanation",
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
- "short_explanation": "Giải thích ngắn gọn",
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": "từ",
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
  }