@eohjsc/react-native-smart-city 0.7.3-rc9 → 0.7.4

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 (166) hide show
  1. package/assets/images/Map/LocationPin.svg +10 -0
  2. package/package.json +4 -2
  3. package/src/commons/Action/__test__/ItemQuickAction.test.js +2 -2
  4. package/src/commons/ActionGroup/NumberUpDownActionTemplate.js +3 -3
  5. package/src/commons/ActionGroup/OnOffSmartLock/AutoLock/ButtonWrapper.js +3 -3
  6. package/src/commons/ActionGroup/OnOffSmartLock/PasscodeList/index.js +3 -3
  7. package/src/commons/ActionGroup/OnOffSmartLock/SetupGeneratePasscode/ButtonWrapper.js +2 -2
  8. package/src/commons/ActionGroup/OnOffTemplate/OnOffSimpleTemplate.js +2 -2
  9. package/src/commons/ActionGroup/OptionsDropdownActionTemplate.js +2 -2
  10. package/src/commons/ActionGroup/SliderRangeTemplate.js +7 -7
  11. package/src/commons/ActionGroup/SmartTiviActionTemplate/SmartTiviActionTemplate.js +2 -2
  12. package/src/commons/ActionGroup/SmartTiviActionTemplate/component/CircleButton.js +5 -5
  13. package/src/commons/ActionGroup/SmartTiviActionTemplate/component/ControlPlay.js +5 -5
  14. package/src/commons/ActionGroup/TerminalBoxTemplate.js +2 -2
  15. package/src/commons/ActionGroup/TextBoxTemplate.js +2 -2
  16. package/src/commons/ActionGroup/TimerActionTemplate.js +6 -3
  17. package/src/commons/ActionGroup/TwoButtonTemplate/index.js +2 -2
  18. package/src/commons/ActionGroup/__test__/index.test.js +2 -2
  19. package/src/commons/ActionGroup/index.js +2 -2
  20. package/src/commons/Automate/ItemAutomate.js +9 -41
  21. package/src/commons/Automate/ItemConditionScriptDetail.js +109 -0
  22. package/src/commons/Automate/ItemConditionScriptDetailStyles.js +46 -0
  23. package/src/commons/Automate/__test__/ItemAutomate.test.js +0 -21
  24. package/src/commons/BackDefault/index.js +2 -2
  25. package/src/commons/BottomButtonView/index.js +1 -0
  26. package/src/commons/ButtonPopup/index.js +3 -2
  27. package/src/commons/DateTimeRangeChange/DateTimeButton.js +3 -3
  28. package/src/commons/Device/ConnectedViewHeader.js +2 -2
  29. package/src/commons/Device/Emergency/EmergencyDetail.js +3 -3
  30. package/src/commons/Device/FlatListItems.js +3 -3
  31. package/src/commons/Device/Hanet/ItemHanetDevice.js +3 -3
  32. package/src/commons/Device/HorizontalBarChart.js +54 -34
  33. package/src/commons/Device/ItemAddNew/index.js +2 -2
  34. package/src/commons/Device/ItemDevice.js +2 -2
  35. package/src/commons/Device/SonosSpeaker/index.js +3 -3
  36. package/src/commons/Device/WaterPurifierStatus/AlertStatusMachine.js +2 -2
  37. package/src/commons/Device/WaterQualitySensor/QualityIndicatorsItem.js +6 -2
  38. package/src/commons/DisplayChecking/index.js +2 -2
  39. package/src/commons/EmergencyButton/AlertSendConfirm.js +2 -2
  40. package/src/commons/FieldTemplate/ChooseUserField/index.js +2 -2
  41. package/src/commons/FlatListDnD/index.js +12 -9
  42. package/src/commons/Grid/GridItem.js +10 -2
  43. package/src/commons/Header/HeaderCustom.js +2 -2
  44. package/src/commons/HeaderAni/index.js +2 -2
  45. package/src/commons/IconComponent/index.js +4 -4
  46. package/src/commons/NavBar/index.js +2 -2
  47. package/src/commons/OneTapTemplate/NumberUpDownActionTemplate.js +3 -3
  48. package/src/commons/OneTapTemplate/__test__/StatesGridActionTemplate.test.js +4 -4
  49. package/src/commons/SearchLocation/index.js +3 -3
  50. package/src/commons/SelectActionCard/index.js +2 -2
  51. package/src/commons/SelectSubUnit/index.js +6 -2
  52. package/src/commons/Sharing/BtnRemoveMember.js +2 -2
  53. package/src/commons/Sharing/StationDevicePermissions.js +2 -2
  54. package/src/commons/SubUnit/DeviceTemplate/ConfigAndEvaluation/ConfigAndEvaluation.js +2 -2
  55. package/src/commons/SubUnit/DeviceTemplate/ConfigValue/ConfigValue.js +2 -2
  56. package/src/commons/SubUnit/DeviceTemplate/EvaluationOverConfig/EvaluationOverConfig.js +2 -2
  57. package/src/commons/SubUnit/OneTap/ItemOneTap.js +3 -4
  58. package/src/commons/SubUnit/OneTap/__test__/SubUnitAutomate.test.js +0 -2
  59. package/src/commons/SubUnit/OneTap/index.js +9 -8
  60. package/src/commons/Unit/HeaderUnit/index.js +3 -3
  61. package/src/commons/Unit/SharedUnit.js +7 -7
  62. package/src/commons/Widgets/IFrameWithConfig/IFrameWithConfig.js +4 -15
  63. package/src/commons/Widgets/IFrameWithConfig/__tests__/IFrameWithConfig.test.js +29 -18
  64. package/src/configs/API.js +1 -1
  65. package/src/configs/AccessibilityLabel.js +1 -0
  66. package/src/configs/Theme.js +1 -1
  67. package/src/hooks/IoT/__test__/useRemoteControl.test.js +14 -7
  68. package/src/hooks/IoT/useRemoteControl.js +18 -7
  69. package/src/hooks/useMqtt.js +2 -2
  70. package/src/iot/RemoteControl/Bluetooth.js +19 -22
  71. package/src/iot/RemoteControl/Internet.js +11 -3
  72. package/src/navigations/EmergencyContactsStack.js +4 -3
  73. package/src/navigations/SharedStack.js +2 -0
  74. package/src/navigations/UnitStack.js +56 -57
  75. package/src/screens/AQIGuide/index.js +0 -2
  76. package/src/screens/ActivityLog/index.js +2 -2
  77. package/src/screens/AddLocationMaps/index.js +16 -19
  78. package/src/screens/AddLocationMaps/indexStyle.js +1 -0
  79. package/src/screens/AddNewGateway/RenameNewDevices.js +2 -2
  80. package/src/screens/AddNewGateway/SelectDeviceType.js +1 -1
  81. package/src/screens/AllGateway/GatewayInfo/__test__/index.test.js +25 -9
  82. package/src/screens/Automate/AddNewAction/ChooseAction.js +17 -3
  83. package/src/screens/Automate/AddNewAction/ChooseConfig.js +7 -6
  84. package/src/screens/Automate/AddNewAction/NewActionWrapper.js +8 -8
  85. package/src/screens/Automate/AddNewAction/SelectControlDevices.js +30 -20
  86. package/src/screens/Automate/AddNewAction/SelectMonitorDevices.js +17 -10
  87. package/src/screens/Automate/AddNewAction/SetupConfigCondition.js +58 -44
  88. package/src/screens/Automate/AddNewAction/SetupScriptDelay.js +1 -1
  89. package/src/screens/Automate/AddNewAction/SetupScriptNotify.js +3 -3
  90. package/src/screens/Automate/AddNewAction/Styles/SetupSensorStyles.js +20 -4
  91. package/src/screens/Automate/AddNewAction/__test__/ChooseAction.test.js +1 -1
  92. package/src/screens/Automate/AddNewAction/__test__/SelectControlDevices.test.js +14 -8
  93. package/src/screens/Automate/AddNewAction/__test__/SelectMonitorDevices.test.js +13 -7
  94. package/src/screens/Automate/AddNewAction/__test__/SetupConfigCondition.test.js +54 -15
  95. package/src/screens/Automate/AddNewAction/__test__/SetupScriptNotify.test.js +29 -0
  96. package/src/screens/Automate/AddNewAutoSmart/AddTypeSmart.js +10 -10
  97. package/src/screens/Automate/AddNewAutoSmart/__test__/AddNewAutoSmart.test.js +2 -0
  98. package/src/screens/Automate/Components/InputName.js +10 -7
  99. package/src/screens/Automate/EditActionsList/index.js +19 -17
  100. package/src/screens/Automate/MultiUnits.js +19 -22
  101. package/src/screens/Automate/OneTap/__test__/AddNewOneTap.test.js +12 -2
  102. package/src/screens/Automate/Scenario/__test__/AddNewOneTap.test.js +9 -1
  103. package/src/screens/Automate/ScriptDetail/Components/AddActionScript.js +14 -6
  104. package/src/screens/Automate/ScriptDetail/Components/RenameScript.js +4 -7
  105. package/src/screens/Automate/ScriptDetail/__test__/index.test.js +42 -17
  106. package/src/screens/Automate/ScriptDetail/index.js +33 -22
  107. package/src/screens/Automate/SetSchedule/__test__/index.test.js +21 -10
  108. package/src/screens/Automate/SetSchedule/components/RowItem.js +5 -5
  109. package/src/screens/Automate/SetSchedule/index.js +8 -7
  110. package/src/screens/Automate/Styles/indexStyles.js +1 -1
  111. package/src/screens/Automate/__test__/MultiUnits.test.js +1 -4
  112. package/src/screens/Automate/__test__/index.test.js +0 -1
  113. package/src/screens/Automate/index.js +36 -34
  114. package/src/screens/ChangePosition/index.js +2 -1
  115. package/src/screens/Device/EditDevice/__test__/EditDevice.test.js +4 -4
  116. package/src/screens/Device/EditDevice/index.js +4 -4
  117. package/src/screens/Device/__test__/BluetoothDevice.test.js +300 -0
  118. package/src/screens/Device/__test__/detail.test.js +3 -3
  119. package/src/screens/Device/components/BluetoothDevice.js +135 -0
  120. package/src/screens/Device/components/SensorDisplayItem.js +4 -3
  121. package/src/screens/Device/detail.js +70 -62
  122. package/src/screens/Device/hooks/useEvaluateValue.js +1 -1
  123. package/src/screens/Drawer/index.js +3 -3
  124. package/src/screens/EmergencyContacts/EmergencyContactsList.js +8 -4
  125. package/src/screens/EmergencyContacts/EmergencyContactsSelectContacts.js +3 -3
  126. package/src/screens/EmergencySetting/components/DropDownItem.js +2 -2
  127. package/src/screens/GuestInfo/components/RowGuestInfo.js +2 -2
  128. package/src/screens/GuestInfo/index.js +2 -2
  129. package/src/screens/HanetCamera/ManageAccess.js +3 -3
  130. package/src/screens/HanetCamera/MemberInfo.js +2 -2
  131. package/src/screens/HanetCamera/components/RequestFaceIDPopup.js +2 -2
  132. package/src/screens/ManageAccess/index.js +3 -3
  133. package/src/screens/Notification/components/NotificationItem.js +3 -3
  134. package/src/screens/Notification/index.js +3 -3
  135. package/src/screens/ScanChipQR/components/QRScan/index.js +3 -3
  136. package/src/screens/SelectUnit/__test__/index.test.js +1 -1
  137. package/src/screens/SelectUnit/index.js +4 -4
  138. package/src/screens/SharedUnit/TabHeader.js +2 -2
  139. package/src/screens/Sharing/Components/EndDevice.js +3 -3
  140. package/src/screens/Sharing/UnitMemberList.js +2 -2
  141. package/src/screens/SmartAccount/SuccessfullyConnected/index.js +2 -2
  142. package/src/screens/SmartIr/__test__/GroupButtonByType.test.js +3 -2
  143. package/src/screens/SmartIr/components/GroupButtonByType/GroupButtonByType.js +2 -2
  144. package/src/screens/SmartIr/components/SelectBrand.js +2 -2
  145. package/src/screens/SubUnit/AddSubUnit.js +28 -24
  146. package/src/screens/SubUnit/AddSubUnitStyles.js +10 -4
  147. package/src/screens/SubUnit/EditSubUnit.js +12 -11
  148. package/src/screens/SubUnit/ManageSubUnit.js +3 -3
  149. package/src/screens/SubUnit/__test__/AddSubUnit.test.js +13 -13
  150. package/src/screens/SubUnit/__test__/EditSubUnit.test.js +3 -3
  151. package/src/screens/Template/EditTemplate.js +6 -4
  152. package/src/screens/UVIndexGuide/index.js +2 -4
  153. package/src/screens/Unit/SelectAddToFavorites.js +2 -2
  154. package/src/screens/Unit/SelectAddress.js +16 -12
  155. package/src/screens/Unit/components/AutomateScript/index.js +2 -2
  156. package/src/screens/Unit/components/ButtonWrapper/index.js +3 -3
  157. package/src/screens/Unit/components/Header/index.js +2 -2
  158. package/src/screens/Unit/components/SharedUnit/index.js +5 -5
  159. package/src/screens/UnitSummary/components/AirQuality/index.js +6 -11
  160. package/src/screens/UnitSummary/components/WaterQuality/Item/index.js +6 -6
  161. package/src/screens/UnitSummary/index.js +3 -3
  162. package/src/utils/Apis/axios.js +5 -5
  163. package/src/utils/Functions/ShortEmail.js +1 -0
  164. package/src/utils/I18n/translations/en.js +6 -3
  165. package/src/utils/I18n/translations/vi.js +8 -4
  166. package/src/utils/bluetooth.js +3 -0
@@ -14,7 +14,13 @@ import RenderActionItem from './RenderActionItem';
14
14
  const ChooseAction = ({ route }) => {
15
15
  const t = useTranslations();
16
16
  const { navigate } = useNavigation();
17
- const { unitId, device, automateId, numberActionCanAdd } = route?.params;
17
+ const {
18
+ unitId,
19
+ device,
20
+ automateId,
21
+ numberActionCanAdd,
22
+ multiUnit = {},
23
+ } = route.params;
18
24
  const [data, setData] = useState([]);
19
25
  const [actions, setActions] = useState([]);
20
26
 
@@ -48,7 +54,7 @@ const ChooseAction = ({ route }) => {
48
54
  API.AUTOMATE.ADD_SCRIPT_ACTION(automateId),
49
55
  {
50
56
  list_action,
51
- unit: unitId,
57
+ unit: unitId || multiUnit.id,
52
58
  }
53
59
  );
54
60
 
@@ -58,7 +64,15 @@ const ChooseAction = ({ route }) => {
58
64
  merge: true,
59
65
  params: { saveAt: moment().valueOf() },
60
66
  });
61
- }, [actions, numberActionCanAdd, automateId, unitId, navigate, t]);
67
+ }, [
68
+ actions,
69
+ numberActionCanAdd,
70
+ automateId,
71
+ unitId,
72
+ multiUnit.id,
73
+ navigate,
74
+ t,
75
+ ]);
62
76
 
63
77
  const handleOnSelectAction = (action) => {
64
78
  setActions((prevActions) => {
@@ -1,17 +1,17 @@
1
+ import { useNavigation } from '@react-navigation/native';
1
2
  import React, { useCallback, useEffect, useState } from 'react';
2
3
  import { View } from 'react-native';
3
- import { useNavigation } from '@react-navigation/native';
4
4
 
5
- import { useTranslations } from '../../../hooks/Common/useTranslations';
5
+ import GridItem from '../../../commons/Grid/GridItem';
6
6
  import Text from '../../../commons/Text';
7
- import { axiosGet } from '../../../utils/Apis/axios';
8
7
  import { API, Colors } from '../../../configs';
8
+ import { AUTOMATE_TYPE } from '../../../configs/Constants';
9
+ import { useTranslations } from '../../../hooks/Common/useTranslations';
10
+ import { axiosGet } from '../../../utils/Apis/axios';
9
11
  import Routes from '../../../utils/Route';
10
- import styles from './Styles/SelectActionStyles';
11
12
  import { LoadingSelectAction } from './Components';
12
- import { AUTOMATE_TYPE } from '../../../configs/Constants';
13
13
  import NewActionWrapper from './NewActionWrapper';
14
- import GridItem from '../../../commons/Grid/GridItem';
14
+ import styles from './Styles/SelectActionStyles';
15
15
 
16
16
  const ChooseConfig = ({ route }) => {
17
17
  const t = useTranslations();
@@ -44,6 +44,7 @@ const ChooseConfig = ({ route }) => {
44
44
  config,
45
45
  automate,
46
46
  closeScreen,
47
+ unitId: automate?.unit,
47
48
  });
48
49
  },
49
50
  [automate, closeScreen, navigate]
@@ -1,14 +1,14 @@
1
+ import { KeyboardAwareScrollView } from '@eohjsc/react-native-keyboard-aware-scroll-view';
1
2
  import React, { useCallback, useMemo } from 'react';
2
3
  import { TouchableOpacity, View } from 'react-native';
3
- import { KeyboardAwareScrollView } from '@eohjsc/react-native-keyboard-aware-scroll-view';
4
4
 
5
- import styles from './Styles/SelectActionStyles';
6
- import AntDesign from 'react-native-vector-icons/AntDesign';
7
- import { Colors } from '../../../configs';
8
5
  import { useNavigation, useRoute } from '@react-navigation/native';
6
+ import { IconOutline } from '@ant-design/icons-react-native';
7
+ import { FullLoading, HeaderCustom } from '../../../commons';
9
8
  import BottomButtonView from '../../../commons/BottomButtonView';
9
+ import { Colors } from '../../../configs';
10
10
  import { AccessibilityLabel } from '../../../configs/Constants';
11
- import { FullLoading, HeaderCustom } from '../../../commons';
11
+ import styles from './Styles/SelectActionStyles';
12
12
 
13
13
  const NewActionWrapper = ({
14
14
  name,
@@ -25,8 +25,8 @@ const NewActionWrapper = ({
25
25
  const { closeScreen } = params;
26
26
 
27
27
  const handleClose = useCallback(() => {
28
- navigate(closeScreen);
29
- }, [closeScreen, navigate]);
28
+ navigate(closeScreen, params);
29
+ }, [closeScreen, navigate, params]);
30
30
 
31
31
  const rightComponent = useMemo(
32
32
  () => (
@@ -35,7 +35,7 @@ const NewActionWrapper = ({
35
35
  onPress={handleClose}
36
36
  accessibilityLabel={AccessibilityLabel.ICON_CLOSE}
37
37
  >
38
- <AntDesign name={'close'} size={24} color={Colors.Black} />
38
+ <IconOutline name={'close'} size={24} color={Colors.Black} />
39
39
  </TouchableOpacity>
40
40
  ),
41
41
  [handleClose]
@@ -1,15 +1,20 @@
1
- import React, { useCallback, useEffect, useState } from 'react';
2
1
  import { useNavigation } from '@react-navigation/native';
3
- import { fetchWithCache } from '../../../utils/Apis/axios';
2
+ import React, { useCallback, useEffect, useState } from 'react';
4
3
  import { API } from '../../../configs';
4
+ import { useTranslations } from '../../../hooks/Common/useTranslations';
5
+ import { fetchWithCache } from '../../../utils/Apis/axios';
5
6
  import Routes from '../../../utils/Route';
6
7
  import SelectDevices from './Components/SelectDevices';
7
- import { useTranslations } from '../../../hooks/Common/useTranslations';
8
8
 
9
9
  const SelectControlDevices = ({ route }) => {
10
10
  const t = useTranslations();
11
- const { unitId, closeScreen, automateId, numberActionCanAdd } =
12
- route?.params || {};
11
+ const {
12
+ unitId,
13
+ closeScreen,
14
+ automateId,
15
+ numberActionCanAdd,
16
+ multiUnit = {},
17
+ } = route.params || {};
13
18
 
14
19
  const [stations, setStations] = useState([]);
15
20
  const [listStation, setListStation] = useState([]);
@@ -19,22 +24,26 @@ const SelectControlDevices = ({ route }) => {
19
24
  const [loading, setLoading] = useState(true);
20
25
 
21
26
  const fetchDetails = useCallback(async () => {
22
- await fetchWithCache(API.UNIT.DEVICE_CONTROL(unitId), {}, (response) => {
23
- const { success, data } = response;
24
- if (success) {
25
- const newData = data.filter((item) => item.sensors.length > 0);
26
- const listMenu = newData.map((item, index) => ({
27
- text: item.name,
28
- station: item,
29
- index: index,
30
- }));
31
- setStations(newData);
32
- setListMenuItem(listMenu);
33
- setListStation(listMenu);
27
+ await fetchWithCache(
28
+ API.UNIT.DEVICE_CONTROL(unitId || multiUnit.id),
29
+ {},
30
+ (response) => {
31
+ const { success, data } = response;
32
+ if (success) {
33
+ const newData = data.filter((item) => item.sensors.length > 0);
34
+ const listMenu = newData.map((item, index) => ({
35
+ text: item.name,
36
+ station: item,
37
+ index: index,
38
+ }));
39
+ setStations(newData);
40
+ setListMenuItem(listMenu);
41
+ setListStation(listMenu);
42
+ }
34
43
  }
35
- });
44
+ );
36
45
  setLoading(false);
37
- }, [unitId]);
46
+ }, [multiUnit.id, unitId]);
38
47
 
39
48
  useEffect(() => {
40
49
  fetchDetails();
@@ -48,9 +57,10 @@ const SelectControlDevices = ({ route }) => {
48
57
  device: selectedDevice,
49
58
  closeScreen,
50
59
  numberActionCanAdd,
60
+ multiUnit,
51
61
  });
52
62
  },
53
- [navigate, unitId, automateId, closeScreen, numberActionCanAdd]
63
+ [navigate, unitId, automateId, closeScreen, numberActionCanAdd, multiUnit]
54
64
  );
55
65
 
56
66
  if (loading) {
@@ -1,16 +1,22 @@
1
- import React, { useCallback, useEffect, useState } from 'react';
2
1
  import { useNavigation } from '@react-navigation/native';
2
+ import React, { useCallback, useEffect, useState } from 'react';
3
3
 
4
+ import { API } from '../../../configs';
5
+ import { AUTOMATE_TYPE } from '../../../configs/Constants';
4
6
  import { useTranslations } from '../../../hooks/Common/useTranslations';
5
7
  import { fetchWithCache } from '../../../utils/Apis/axios';
6
- import { API } from '../../../configs';
7
8
  import Routes from '../../../utils/Route';
8
9
  import SelectDevices from './Components/SelectDevices';
9
- import { AUTOMATE_TYPE } from '../../../configs/Constants';
10
10
 
11
11
  const SelectMonitorDevices = ({ route }) => {
12
12
  const t = useTranslations();
13
- const { automate = {}, isCreateNewAction, closeScreen } = route?.params || {};
13
+ const {
14
+ automate = {},
15
+ isCreateNewAction,
16
+ closeScreen,
17
+ multiUnit = {},
18
+ } = route.params || {};
19
+ const { type, unit, sensor_id } = automate;
14
20
 
15
21
  const [stations, setStations] = useState([]);
16
22
  const [listStation, setListStation] = useState([]);
@@ -22,11 +28,11 @@ const SelectMonitorDevices = ({ route }) => {
22
28
 
23
29
  const fetchDetails = useCallback(async () => {
24
30
  const configs = { params: {} };
25
- if (automate?.type === AUTOMATE_TYPE.EVENT) {
31
+ if (type === AUTOMATE_TYPE.EVENT) {
26
32
  configs.params.type = 'event';
27
33
  }
28
34
  await fetchWithCache(
29
- API.UNIT.DEVICE_SENSOR(automate?.unit),
35
+ API.UNIT.DEVICE_SENSOR(unit || multiUnit.id),
30
36
  configs,
31
37
  (response) => {
32
38
  const { success, data } = response;
@@ -46,17 +52,17 @@ const SelectMonitorDevices = ({ route }) => {
46
52
  }
47
53
  );
48
54
  setLoading(false);
49
- }, [automate?.type, automate?.unit]);
55
+ }, [multiUnit.id, type, unit]);
50
56
 
51
57
  useEffect(() => {
52
- if (!automate?.sensor_id) {
58
+ if (!sensor_id) {
53
59
  return;
54
60
  }
55
61
  let selectSensor = {};
56
62
  let found = false;
57
63
  for (let i = 0; i < stations.length; i++) {
58
64
  for (let j = 0; j < stations[i].sensors.length; j++) {
59
- if (stations[i].sensors[j].id === automate.sensor_id) {
65
+ if (stations[i].sensors[j].id === sensor_id) {
60
66
  selectSensor = stations[i].sensors[j];
61
67
  found = true;
62
68
  break;
@@ -67,7 +73,7 @@ const SelectMonitorDevices = ({ route }) => {
67
73
  }
68
74
  }
69
75
  setDefaultSelectedDevice(selectSensor);
70
- }, [automate?.sensor_id, stations]);
76
+ }, [sensor_id, stations]);
71
77
 
72
78
  useEffect(() => {
73
79
  fetchDetails();
@@ -86,6 +92,7 @@ const SelectMonitorDevices = ({ route }) => {
86
92
  stationName: stations[indexStation]?.name,
87
93
  isCreateNewAction,
88
94
  closeScreen,
95
+ unitId: automate?.unit,
89
96
  });
90
97
  },
91
98
  [navigate, automate, stations, isCreateNewAction, closeScreen]
@@ -1,17 +1,21 @@
1
- import React, { useMemo, useState } from 'react';
2
- import { View, TouchableOpacity, FlatList } from 'react-native';
1
+ import React, { useCallback, useMemo, useState } from 'react';
2
+ import { View } from 'react-native';
3
3
 
4
- import styles from './Styles/SetupSensorStyles';
5
- import { useTranslations } from '../../../hooks/Common/useTranslations';
6
- import Text from '../../../commons/Text';
7
- import { useNavigation, useRoute } from '@react-navigation/native';
8
- import NewActionWrapper from './NewActionWrapper';
4
+ import {
5
+ useFocusEffect,
6
+ useNavigation,
7
+ useRoute,
8
+ } from '@react-navigation/native';
9
+ import { Button } from '../../../commons';
10
+ import TextInput from '../../../commons/Form/TextInput';
9
11
  import GridItem from '../../../commons/Grid/GridItem';
10
- import Routes from '../../../utils/Route';
11
12
  import ModalCustom from '../../../commons/Modal/ModalCustom';
13
+ import Text from '../../../commons/Text';
14
+ import { useTranslations } from '../../../hooks/Common/useTranslations';
15
+ import Routes from '../../../utils/Route';
12
16
  import { ToastBottomHelper } from '../../../utils/Utils';
13
- import CheckBox from '@react-native-community/checkbox';
14
- import TextInput from '../../../commons/Form/TextInput';
17
+ import NewActionWrapper from './NewActionWrapper';
18
+ import styles from './Styles/SetupSensorStyles';
15
19
 
16
20
  const valueEvaluationToOptions = (valueEvaluation) => {
17
21
  if (valueEvaluation.template === 'range') {
@@ -43,7 +47,7 @@ const SetupConfigCondition = () => {
43
47
  const t = useTranslations();
44
48
  const { navigate } = useNavigation();
45
49
  const { params = {} } = useRoute();
46
- const { config, automate, closeScreen } = params;
50
+ const { config, automate, closeScreen, unitId } = params;
47
51
  const [selectedCondition, setSelectedCondition] = useState(undefined);
48
52
  const [customCondition, setCustomCondition] = useState(undefined);
49
53
  const [isShowModal, setIsShowModal] = useState(false);
@@ -54,7 +58,7 @@ const SetupConfigCondition = () => {
54
58
  value: '<',
55
59
  },
56
60
  {
57
- label: `${t('is')} (=)`,
61
+ label: `${t('is_equal')} (=)`,
58
62
  value: '=',
59
63
  },
60
64
  {
@@ -88,15 +92,21 @@ const SetupConfigCondition = () => {
88
92
  navigate(Routes.ValueChangeName, {
89
93
  automate,
90
94
  closeScreen,
95
+ unitId,
91
96
  });
92
97
  };
93
98
 
94
- const resetCustomizeCondition = () => {
99
+ const resetCustomizeCondition = useCallback(() => {
95
100
  automate.condition = null;
96
101
  automate.value = null;
97
102
  setCustomCondition(undefined);
98
- setIsShowModal(false);
99
- };
103
+ }, [automate]);
104
+
105
+ useFocusEffect(
106
+ useCallback(() => {
107
+ resetCustomizeCondition();
108
+ }, [resetCustomizeCondition])
109
+ );
100
110
 
101
111
  return (
102
112
  <NewActionWrapper name={t('set_up {name}', { name: config?.name })}>
@@ -127,61 +137,65 @@ const SetupConfigCondition = () => {
127
137
  </GridItem>
128
138
  </View>
129
139
  <ModalCustom
130
- onBackdropPress={() => resetCustomizeCondition()}
140
+ onBackdropPress={() => setIsShowModal(false)}
131
141
  isVisible={isShowModal}
132
142
  style={styles.modal}
133
143
  >
134
144
  <View style={styles.modalContent}>
135
- <Text type="Body">
145
+ <Text type="Body" bold style={styles.titleCondition}>
136
146
  {t('when_value_is', { config_name: config.name })}
137
147
  </Text>
138
- <FlatList
139
- renderHeader={t('condition')}
140
- data={normalConditions}
141
- renderItem={({ item }) => {
148
+ <View style={styles.flatListCondition}>
149
+ {normalConditions.map((item) => {
142
150
  return (
143
- <View>
144
- <Text>{item.label}</Text>
145
- <CheckBox
146
- onChange={() => {
147
- automate.condition = item.value;
148
- setCustomCondition(item.value);
149
- }}
150
- value={item.value === customCondition}
151
- />
152
- </View>
151
+ <GridItem
152
+ onPress={() => {
153
+ automate.condition = item.value;
154
+ setCustomCondition(item.value);
155
+ }}
156
+ selected={item.value === customCondition}
157
+ style={styles.gridItem}
158
+ >
159
+ <Text type="Body">{item.label}</Text>
160
+ </GridItem>
153
161
  );
154
- }}
155
- />
162
+ })}
163
+ </View>
164
+
156
165
  <View style={styles.inputValue}>
157
- <Text>{t('value')}</Text>
158
166
  <TextInput
159
167
  keyboardType="decimal-pad"
160
168
  type="number"
161
169
  maxLength={10}
170
+ placeholder={t('value')}
162
171
  onChange={(value) => {
163
172
  const floatValue = parseFloat(value.replace(',', '.'));
164
173
  automate.value = floatValue;
165
174
  }}
166
- style={styles.numberInput}
175
+ textInputStyle={styles.numberInput}
176
+ wrapStyle={styles.wrapTextInput}
167
177
  />
168
178
  </View>
169
- <TouchableOpacity
179
+
180
+ <Button
181
+ type="primary"
182
+ title={t('continue')}
170
183
  testID={'continue_button'}
171
184
  onPress={() => {
172
- if (
173
- !automate.value ||
174
- automate.condition === 'value_evaluation'
175
- ) {
185
+ if (!automate.value || !automate.condition) {
176
186
  ToastBottomHelper.error(t('please_enter_a_number'), '', 3000);
177
187
  return;
178
188
  }
179
189
  setIsShowModal(false);
180
- navigate(Routes.ValueChangeName, { automate, closeScreen });
190
+ navigate(Routes.ValueChangeName, {
191
+ automate,
192
+ closeScreen,
193
+ unitId,
194
+ });
181
195
  }}
182
- >
183
- <Text>{t('continue')}</Text>
184
- </TouchableOpacity>
196
+ style={styles.buttonContinue}
197
+ textSemiBold={false}
198
+ />
185
199
  </View>
186
200
  </ModalCustom>
187
201
  </NewActionWrapper>
@@ -40,7 +40,7 @@ const SetupScriptDelay = ({ route }) => {
40
40
  params: { saveAt: moment().valueOf() },
41
41
  });
42
42
  } else {
43
- ToastBottomHelper.error(t('text_done'));
43
+ ToastBottomHelper.error(t('error_please_try_later'));
44
44
  }
45
45
  }, [automateId, navigate, delay, t]);
46
46
 
@@ -17,9 +17,9 @@ import moment from 'moment';
17
17
  const SetupScriptNotify = ({ route }) => {
18
18
  const t = useTranslations();
19
19
  const { goBack, navigate } = useNavigation();
20
- const { automate = {}, unitId } = route?.params || {};
20
+ const { automate = {}, unitId, multiUnit } = route.params || {};
21
21
  const { id: automateId } = automate;
22
- const [notify, setNotify] = useState({ unit: unitId });
22
+ const [notify, setNotify] = useState({ unit: unitId || multiUnit.id });
23
23
 
24
24
  const onChangeTitle = (value) => {
25
25
  setNotify((state) => ({
@@ -47,7 +47,7 @@ const SetupScriptNotify = ({ route }) => {
47
47
  params: { saveAt: moment().valueOf() },
48
48
  });
49
49
  } else {
50
- ToastBottomHelper.error(t('text_done'));
50
+ ToastBottomHelper.error(t('error_please_try_later'));
51
51
  }
52
52
  }, [automateId, navigate, notify, t]);
53
53
 
@@ -1,5 +1,5 @@
1
1
  import { StyleSheet } from 'react-native';
2
- import { Theme, Colors } from '../../../../configs';
2
+ import { Colors, Theme } from '../../../../configs';
3
3
 
4
4
  export default StyleSheet.create({
5
5
  ...Theme,
@@ -11,10 +11,9 @@ export default StyleSheet.create({
11
11
  },
12
12
  inputValue: { marginBottom: 10 },
13
13
  numberInput: {
14
- borderRadius: 5,
14
+ borderRadius: 8,
15
15
  borderWidth: 1,
16
- height: 38,
17
- marginTop: 10,
16
+ height: 50,
18
17
  },
19
18
  boxDevices: {
20
19
  flexWrap: 'wrap',
@@ -43,4 +42,21 @@ export default StyleSheet.create({
43
42
  width: '100%',
44
43
  borderRadius: 10,
45
44
  },
45
+ titleCondition: {
46
+ marginBottom: 16,
47
+ },
48
+ wrapTextInput: {
49
+ marginTop: 0,
50
+ },
51
+ flatListCondition: {
52
+ display: 'flex',
53
+ flexDirection: 'row',
54
+ justifyContent: 'space-between',
55
+ },
56
+ gridItem: {
57
+ width: 'fit-content',
58
+ },
59
+ buttonContinue: {
60
+ flex: 0,
61
+ },
46
62
  });
@@ -162,7 +162,7 @@ describe('Test ChooseAction', () => {
162
162
  is_on_value: 1,
163
163
  action: '800ff454-4e2a-4a38-bad6-1bded728193e',
164
164
  allow_config_store_value: true,
165
- icon: 'upcircle',
165
+ icon: 'up-circle',
166
166
  icon_kit: 41,
167
167
  text: 'Auto',
168
168
  },
@@ -1,17 +1,17 @@
1
+ import { useNavigation, useRoute } from '@react-navigation/native';
2
+ import MockAdapter from 'axios-mock-adapter';
1
3
  import React from 'react';
4
+ import { TouchableOpacity } from 'react-native';
2
5
  import renderer, { act } from 'react-test-renderer';
3
- import MockAdapter from 'axios-mock-adapter';
4
- import { SCProvider } from '../../../../context';
5
- import { mockSCStore } from '../../../../context/mockStore';
6
- import Device from '../Device';
7
6
  import NavBar from '../../../../commons/NavBar';
8
7
  import API from '../../../../configs/API';
9
8
  import { AccessibilityLabel } from '../../../../configs/Constants';
10
- import { TouchableOpacity } from 'react-native';
11
- import Routes from '../../../../utils/Route';
9
+ import { SCProvider } from '../../../../context';
10
+ import { mockSCStore } from '../../../../context/mockStore';
12
11
  import api from '../../../../utils/Apis/axios';
12
+ import Routes from '../../../../utils/Route';
13
+ import Device from '../Device';
13
14
  import SelectControlDevices from '../SelectControlDevices';
14
- import { useNavigation, useRoute } from '@react-navigation/native';
15
15
 
16
16
  const mock = new MockAdapter(api.axiosInstance);
17
17
 
@@ -108,6 +108,12 @@ describe('Test SelectMonitorDevices', () => {
108
108
  await act(async () => {
109
109
  iconClose[0].props.onPress();
110
110
  });
111
- expect(global.mockedNavigate).toHaveBeenCalledWith(Routes.ScriptDetail);
111
+ expect(global.mockedNavigate).toHaveBeenCalledWith(Routes.ScriptDetail, {
112
+ automate: { sensor_id: 1 },
113
+ automateId: 1,
114
+ closeScreen: 'ScriptDetail',
115
+ scriptName: 'scriptName test',
116
+ unitId: 1,
117
+ });
112
118
  });
113
119
  });
@@ -1,15 +1,15 @@
1
+ import MockAdapter from 'axios-mock-adapter';
1
2
  import React from 'react';
2
3
  import renderer, { act } from 'react-test-renderer';
3
- import MockAdapter from 'axios-mock-adapter';
4
4
 
5
- import SelectMonitorDevices from '../SelectMonitorDevices';
6
- import { SCProvider } from '../../../../context';
7
- import { mockSCStore } from '../../../../context/mockStore';
5
+ import { useRoute } from '@react-navigation/native';
6
+ import { TouchableOpacity } from 'react-native';
8
7
  import API from '../../../../configs/API';
9
8
  import { AccessibilityLabel } from '../../../../configs/Constants';
10
- import { TouchableOpacity } from 'react-native';
9
+ import { SCProvider } from '../../../../context';
10
+ import { mockSCStore } from '../../../../context/mockStore';
11
11
  import api from '../../../../utils/Apis/axios';
12
- import { useRoute } from '@react-navigation/native';
12
+ import SelectMonitorDevices from '../SelectMonitorDevices';
13
13
 
14
14
  const mock = new MockAdapter(api.axiosInstance);
15
15
 
@@ -70,6 +70,12 @@ describe('Test SelectMonitorDevices', () => {
70
70
  await act(async () => {
71
71
  iconClose[0].props.onPress();
72
72
  });
73
- expect(global.mockedNavigate).toHaveBeenCalledWith('closeScreen');
73
+ expect(global.mockedNavigate).toHaveBeenCalledWith('closeScreen', {
74
+ automate: { sensor_id: 1 },
75
+ automateId: null,
76
+ closeScreen: 'closeScreen',
77
+ scriptName: 'scriptName test',
78
+ unit: { id: 1, name: 'Unit test' },
79
+ });
74
80
  });
75
81
  });