@eohjsc/react-native-smart-city 0.2.97 → 0.3.0

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 (197) hide show
  1. package/README.md +35 -14
  2. package/package.json +4 -2
  3. package/src/commons/Action/ItemQuickAction.js +5 -2
  4. package/src/commons/ActionGroup/ColorPickerTemplate.js +1 -1
  5. package/src/commons/ActionGroup/CurtainButtonTemplate.js +10 -5
  6. package/src/commons/ActionGroup/NumberUpDownActionTemplate.js +12 -4
  7. package/src/commons/ActionGroup/OnOffSmartLock/AutoLock/__test__/index.test.js +4 -0
  8. package/src/commons/ActionGroup/OnOffSmartLock/OnOffSmartLock.js +7 -4
  9. package/src/commons/ActionGroup/OnOffSmartLock/PasscodeList/ItemPasscode.js +1 -1
  10. package/src/commons/ActionGroup/OnOffSmartLock/PasscodeList/__test__/ItemPasscode.test.js +24 -0
  11. package/src/commons/ActionGroup/OnOffSmartLock/SetupGeneratePasscode/__test__/index.test.js +14 -0
  12. package/src/commons/ActionGroup/OnOffSmartLock/SetupGeneratePasscode/index.js +1 -0
  13. package/src/commons/ActionGroup/OnOffTemplate/OnOffSimpleTemplate.js +10 -10
  14. package/src/commons/ActionGroup/OnOffTemplate/index.js +18 -15
  15. package/src/commons/ActionGroup/OptionsDropdownActionTemplate.js +9 -3
  16. package/src/commons/ActionGroup/SliderRangeTemplate.js +1 -1
  17. package/src/commons/ActionGroup/SmartTiviActionTemplate/SmartTiviActionTemplate.js +4 -1
  18. package/src/commons/ActionGroup/StatesGridActionTemplate.js +22 -8
  19. package/src/commons/ActionGroup/TimerActionTemplate.js +11 -3
  20. package/src/commons/ActionGroup/TwoButtonTemplate/index.js +13 -9
  21. package/src/commons/ActionGroup/__test__/CurtainButtonTemplate.test.js +53 -4
  22. package/src/commons/ActionGroup/__test__/OnOffButtonTemplate.test.js +14 -14
  23. package/src/commons/ActionGroup/__test__/OnOffTemplate.test.js +53 -78
  24. package/src/commons/ActionGroup/__test__/OneBigButtonTemplate.test.js +36 -20
  25. package/src/commons/ActionGroup/__test__/StatesGridActionTemplate.test.js +77 -0
  26. package/src/commons/ActionGroup/__test__/TimerActionTemplate.test.js +58 -6
  27. package/src/commons/ActionGroup/__test__/TwoButtonTemplate.test.js +49 -1
  28. package/src/commons/ActionGroup/__test__/index.test.js +135 -0
  29. package/src/commons/Auth/AccountList.js +1 -1
  30. package/src/commons/Automate/ItemAutomate.js +1 -3
  31. package/src/commons/Calendar/__test__/Calendar.test.js +33 -0
  32. package/src/commons/Connecting/__test__/Connecting.test.js +19 -2
  33. package/src/commons/ConnectingProcess/__test__/Connecting.test.js +136 -3
  34. package/src/commons/ConnectingProcess/index.js +1 -1
  35. package/src/commons/Dashboard/MyPinnedSharedUnit/__test__/MyPinnedSharedUnit.test.js +16 -13
  36. package/src/commons/Dashboard/MyPinnedSharedUnit/index.js +1 -1
  37. package/src/commons/Dashboard/MyUnit/__test__/MyUnit.test.js +0 -5
  38. package/src/commons/Device/Hanet/ItemHanetDevice.test.js +58 -0
  39. package/src/commons/Device/HistoryChart.js +4 -0
  40. package/src/commons/Device/LinearChart.js +15 -0
  41. package/src/commons/Device/PMSensor/PMSensorIndicatior.js +16 -12
  42. package/src/commons/Device/PMSensor/PMSensorIndicatorStyles.js +3 -0
  43. package/src/commons/Device/WaterQualitySensor/ListQualityIndicator.js +1 -0
  44. package/src/commons/Explore/__test__/CityItem.test.js +33 -54
  45. package/src/commons/FieldTemplate/ChooseUserField/ChooseFieldStyles.js +25 -0
  46. package/src/commons/FieldTemplate/ChooseUserField/ChoosePopup.js +96 -0
  47. package/src/commons/FieldTemplate/ChooseUserField/ChoosePopupStyles.js +39 -0
  48. package/src/commons/FieldTemplate/ChooseUserField/__test__/index.test.js +118 -0
  49. package/src/commons/FieldTemplate/ChooseUserField/index.js +62 -0
  50. package/src/commons/FieldTemplate/PasscodeField/PasscodeFieldStyles.js +30 -0
  51. package/src/commons/FieldTemplate/PasscodeField/__test__/index.test.js +90 -0
  52. package/src/commons/FieldTemplate/PasscodeField/index.js +43 -0
  53. package/src/commons/FieldTemplate/ScheduleField/ScheduleFieldStyles.js +13 -0
  54. package/src/commons/FieldTemplate/ScheduleField/__test__/index.test.js +179 -0
  55. package/src/commons/FieldTemplate/ScheduleField/index.js +176 -0
  56. package/src/commons/FullLoading/index.js +2 -1
  57. package/src/commons/MenuActionAddnew/index.js +1 -0
  58. package/src/commons/MenuActionList/index.js +1 -0
  59. package/src/commons/MenuActionMore/index.js +1 -1
  60. package/src/commons/PreventAccess/__test__/PreventAccess.test.js +62 -0
  61. package/src/commons/PreventAccess/index.js +9 -1
  62. package/src/commons/Sharing/__test__/DevicePermissionsCheckbox.test.js +0 -1
  63. package/src/commons/SubUnit/OneTap/__test__/SubUnitAutomate.test.js +8 -35
  64. package/src/commons/SubUnit/OneTap/index.js +1 -2
  65. package/src/commons/Unit/SharedUnit.js +1 -0
  66. package/src/commons/Unit/__test__/SharedUnit.test.js +38 -183
  67. package/src/commons/WheelDateTimePicker/index.js +2 -1
  68. package/src/configs/API.js +87 -138
  69. package/src/configs/Constants.js +27 -1
  70. package/src/configs/SCConfig.js +2 -0
  71. package/src/iot/RemoteControl/__test__/GoogleHome.test.js +8 -30
  72. package/src/iot/RemoteControl/__test__/Internet.test.js +18 -7
  73. package/src/iot/RemoteControl/__test__/LgThinq.test.js +36 -177
  74. package/src/navigations/UnitStack.js +8 -0
  75. package/src/screens/AQIGuide/index.js +1 -1
  76. package/src/screens/ActivityLog/FilterPopup.js +2 -0
  77. package/src/screens/ActivityLog/__test__/index.test.js +38 -23
  78. package/src/screens/ActivityLog/hooks/__test__/index.test.js +51 -90
  79. package/src/screens/ActivityLog/index.js +2 -2
  80. package/src/screens/AddCommon/SelectSubUnit.js +1 -0
  81. package/src/screens/AddCommon/SelectUnit.js +1 -0
  82. package/src/screens/AddCommon/__test__/SelectSubUnit.test.js +13 -24
  83. package/src/screens/AddCommon/__test__/SelectUnit.test.js +9 -33
  84. package/src/screens/AddLocationMaps/index.js +4 -1
  85. package/src/screens/AddNewAction/SelectSensorDevices.js +8 -2
  86. package/src/screens/AddNewAction/__test__/SelectAction.test.js +10 -91
  87. package/src/screens/AddNewAction/__test__/SelectSensorDevices.test.js +40 -26
  88. package/src/screens/AddNewAutoSmart/__test__/AddNewAutoSmart.test.js +3 -1
  89. package/src/screens/AddNewAutoSmart/index.js +5 -2
  90. package/src/screens/AddNewDevice/ConnectingDevices.js +3 -3
  91. package/src/screens/AddNewDevice/__test__/AddNewDevice.test.js +34 -33
  92. package/src/screens/AddNewDevice/__test__/ConnectDevices.test.js +0 -4
  93. package/src/screens/AddNewDevice/__test__/ConnectingDevices.test.js +21 -21
  94. package/src/screens/AddNewDevice/index.js +1 -0
  95. package/src/screens/AddNewGateway/PlugAndPlay/GatewayWifiList.js +4 -1
  96. package/src/screens/AddNewGateway/SelectGateway.js +1 -0
  97. package/src/screens/AddNewGateway/SetupGatewayWifi.js +1 -0
  98. package/src/screens/AddNewGateway/__test__/AddNewGateway.test.js +4 -6
  99. package/src/screens/AddNewGateway/__test__/ConnectedGateway.test.js +0 -4
  100. package/src/screens/AddNewGateway/__test__/ConnectingGateway.test.js +5 -29
  101. package/src/screens/AddNewGateway/__test__/SelectGateway.test.js +0 -4
  102. package/src/screens/AddNewGateway/__test__/SetupGateway.test.js +0 -4
  103. package/src/screens/AddNewGateway/index.js +1 -0
  104. package/src/screens/AddNewOneTap/__test__/AddNewOneTap.test.js +10 -24
  105. package/src/screens/AddNewOneTap/index.js +3 -2
  106. package/src/screens/Automate/__test__/MultiUnits.test.js +6 -9
  107. package/src/screens/Automate/__test__/index.test.js +7 -12
  108. package/src/screens/Automate/index.js +2 -0
  109. package/src/screens/ConfirmUnitDeletion/__test__/ConfirmUnitDeletion.test.js +36 -8
  110. package/src/screens/ConfirmUnitDeletion/index.js +7 -1
  111. package/src/screens/Device/EditDevice/__test__/EditDevice.test.js +71 -22
  112. package/src/screens/Device/__test__/detail.test.js +23 -84
  113. package/src/screens/Device/detail.js +31 -8
  114. package/src/screens/Device/hooks/useFavoriteDevice.js +5 -9
  115. package/src/screens/DeviceInfo/__test__/index.test.js +0 -2
  116. package/src/screens/EmergencyContacts/EmergencyContactsSelectContacts.js +6 -3
  117. package/src/screens/EmergencyContacts/__test__/EmergencyContactAddNew.test.js +7 -19
  118. package/src/screens/EmergencyContacts/__test__/EmergencyContactList.test.js +20 -2
  119. package/src/screens/EmergencyContacts/__test__/EmergencyContactsSelectContacts.test.js +40 -23
  120. package/src/screens/EmergencySetting/index.js +4 -1
  121. package/src/screens/EnterPassword/__test__/EnterPassword.test.js +41 -25
  122. package/src/screens/Explore/index.js +2 -0
  123. package/src/screens/GuestInfo/__test__/index.test.js +14 -41
  124. package/src/screens/GuestInfo/components/RecurringDetail.js +1 -0
  125. package/src/screens/GuestInfo/components/TemporaryDetail.js +2 -2
  126. package/src/screens/HanetCamera/__test__/CaptureFaceID.test.js +8 -12
  127. package/src/screens/HanetCamera/__test__/Detail.test.js +27 -42
  128. package/src/screens/HanetCamera/__test__/ManageAccess.test.js +8 -5
  129. package/src/screens/HanetCamera/__test__/MemberInfo.test.js +10 -32
  130. package/src/screens/HanetCamera/hooks/__test__/useHanetCheckinData.test.js +43 -35
  131. package/src/screens/HanetCamera/hooks/__test__/useHanetPlaceMembers.test.js +10 -21
  132. package/src/screens/ManageAccess/__test__/ManageAccess.test.js +33 -22
  133. package/src/screens/ManageAccess/hooks/__test__/useManageAccess.test.js +44 -45
  134. package/src/screens/ManageAccess/index.js +2 -1
  135. package/src/screens/MoveToAnotherSubUnit/__test__/index.test.js +35 -12
  136. package/src/screens/MoveToAnotherSubUnit/index.js +5 -5
  137. package/src/screens/Notification/__test__/Notification.test.js +14 -25
  138. package/src/screens/Notification/__test__/NotificationItem.test.js +4 -3
  139. package/src/screens/PlayBackCamera/__test__/index.test.js +87 -2
  140. package/src/screens/PlayBackCamera/index.js +19 -3
  141. package/src/screens/ScanChipQR/__test__/ScanChipQR.test.js +7 -20
  142. package/src/screens/ScanChipQR/components/QRScan/index.js +1 -0
  143. package/src/screens/ScanSensorQR/__test__/ScanSensorQR.test.js +8 -24
  144. package/src/screens/ScriptDetail/__test__/index.test.js +17 -86
  145. package/src/screens/ScriptDetail/index.js +5 -4
  146. package/src/screens/SelectUnit/__test__/index.test.js +12 -55
  147. package/src/screens/SelectUnit/index.js +5 -2
  148. package/src/screens/SetSchedule/index.js +6 -2
  149. package/src/screens/SharedUnit/__test__/TabHeader.test.js +0 -2
  150. package/src/screens/SharedUnit/index.js +2 -0
  151. package/src/screens/Sharing/InfoMemberUnit.js +1 -1
  152. package/src/screens/Sharing/MemberList.js +12 -11
  153. package/src/screens/Sharing/SelectPermission.js +107 -70
  154. package/src/screens/Sharing/__test__/InfoMemberUnit.test.js +47 -29
  155. package/src/screens/Sharing/__test__/MemberList.test.js +13 -127
  156. package/src/screens/Sharing/__test__/MemberList2.test.js +80 -0
  157. package/src/screens/Sharing/__test__/SelectPermission.test.js +28 -38
  158. package/src/screens/Sharing/__test__/SelectUser.test.js +17 -38
  159. package/src/screens/Sharing/hooks/index.js +3 -0
  160. package/src/screens/SideMenuDetail/SideMenuDetailStyles.js +28 -0
  161. package/src/screens/SideMenuDetail/__test__/index.test.js +154 -0
  162. package/src/screens/SideMenuDetail/index.js +149 -0
  163. package/src/screens/SmartIr/components/SelectBrand.js +1 -1
  164. package/src/screens/SubUnit/ManageSubUnit.js +1 -0
  165. package/src/screens/SubUnit/__test__/AddSubUnit.test.js +21 -67
  166. package/src/screens/SubUnit/__test__/Detail.test.js +31 -8
  167. package/src/screens/SubUnit/__test__/EditSubUnit.test.js +21 -89
  168. package/src/screens/SubUnit/hooks/__test__/useManageSubUnit.test.js +47 -44
  169. package/src/screens/SyncLGDevice/AddLGDevice.js +1 -0
  170. package/src/screens/SyncLGDevice/__test__/AddLGDevice.test.js +14 -90
  171. package/src/screens/TDSGuide/index.js +4 -1
  172. package/src/screens/UVIndexGuide/index.js +1 -1
  173. package/src/screens/Unit/ChooseLocation.js +1 -1
  174. package/src/screens/Unit/ManageUnit.js +1 -0
  175. package/src/screens/Unit/SelectAddress.js +4 -1
  176. package/src/screens/Unit/Station/index.js +1 -0
  177. package/src/screens/Unit/Summaries.js +1 -1
  178. package/src/screens/Unit/__test__/CheckSendEmail.test.js +15 -28
  179. package/src/screens/Unit/__test__/ChooseLocation.test.js +27 -14
  180. package/src/screens/Unit/__test__/Detail.test.js +83 -185
  181. package/src/screens/Unit/__test__/ManageUnit.test.js +18 -42
  182. package/src/screens/Unit/__test__/SelectAddress.test.js +13 -39
  183. package/src/screens/Unit/__test__/SmartAccount.test.js +17 -9
  184. package/src/screens/Unit/__test__/SmartAccountItem.test.js +0 -1
  185. package/src/screens/Unit/components/MyAllUnit/__test__/MyAllUnit.test.js +36 -0
  186. package/src/screens/Unit/components/MyAllUnit/__test__/index.test.js +54 -0
  187. package/src/screens/Unit/components/SharedUnit/index.js +1 -0
  188. package/src/screens/Unit/components/__test__/SharedUnit.test.js +31 -34
  189. package/src/screens/UnitSummary/__test__/index.test.js +38 -31
  190. package/src/screens/UnitSummary/components/PowerConsumeHistoryChart/__test__/index.test.js +7 -4
  191. package/src/screens/UnitSummary/components/PowerConsumption/__test__/PowerConsumption.test.js +14 -16
  192. package/src/screens/WaterQualityGuide/index.js +1 -1
  193. package/src/utils/Apis/axios.js +37 -13
  194. package/src/utils/I18n/translations/en.json +1 -0
  195. package/src/utils/I18n/translations/vi.json +1 -0
  196. package/src/utils/Route/index.js +1 -0
  197. package/src/utils/Utils.js +6 -6
package/README.md CHANGED
@@ -1,19 +1,26 @@
1
1
  ## react-native-smart-city
2
2
 
3
3
  ## Getting started
4
+
4
5
  1. Install package dependencies:
5
- - Using [Yarn](https://yarnpkg.com/): `yarn add react-native-reanimated@^1.10.1`
6
+
7
+ - Using [Yarn](https://yarnpkg.com/): `yarn add react-native-reanimated@^1.10.1`
6
8
 
7
9
  2. Install:
8
- - Using [npm](https://www.npmjs.com/#getting-started): `npm install @eohjsc/react-native-smart-city --save`
9
- - Using [Yarn](https://yarnpkg.com/): `yarn add @eohjsc/react-native-smart-city`
10
+
11
+ - Using [npm](https://www.npmjs.com/#getting-started): `npm install @eohjsc/react-native-smart-city --save`
12
+ - Using [Yarn](https://yarnpkg.com/): `yarn add @eohjsc/react-native-smart-city`
10
13
 
11
14
  3. Compile application using react-native run-android
15
+
12
16
  ### Mostly automatic installation
17
+
13
18
  `$ react-native link @eohjsc/react-native-smart-city`
14
19
 
15
20
  ## Usage
21
+
16
22
  1. StackNavigator
23
+
17
24
  ```javascript
18
25
  import {
19
26
  UnitStack,
@@ -30,7 +37,7 @@ import {
30
37
  } from '@eohjsc/react-native-smart-city';
31
38
  import { createStackNavigator } from '@react-navigation/stack';
32
39
 
33
- // TODO: What to do with the module?
40
+ // TODO: What to do with the module?
34
41
  const Stack = createStackNavigator();
35
42
 
36
43
  const YourStack = () => {
@@ -84,7 +91,9 @@ const MainTab = () => {
84
91
  );
85
92
  };
86
93
  ```
94
+
87
95
  2. Use components
96
+
88
97
  ```javascript
89
98
  import React from 'react';
90
99
  import { View } from 'react-native';
@@ -93,13 +102,15 @@ import { MyPinnedSharedUnit, MyUnit } from '@eohjsc/react-native-smart-city';
93
102
  const MyScreen = () => {
94
103
  return (
95
104
  <View>
96
- <MyUnit />
97
- <MyPinnedSharedUnit />
105
+ <MyUnit />
106
+ <MyPinnedSharedUnit />
98
107
  </View>
99
108
  );
100
109
  };
101
110
  ```
111
+
102
112
  3. Trigger quick action
113
+
103
114
  ```javascript
104
115
  import React from 'react';
105
116
  import { View, Button } from 'react-native';
@@ -126,23 +137,33 @@ export const MyFunctionalComponent = () => {
126
137
  lg_actions: [],
127
138
  name: 'Garage Up',
128
139
  };
129
- const handleQuickAction = async() => {
140
+ const handleQuickAction = async () => {
130
141
  const result = await sendRemoteCommand(sensor, action); // Action Garage Up
131
- if (result){
132
- console.log('Successful control')
133
- }else {
134
- console.log('Control failed')
142
+ if (result) {
143
+ console.log('Successful control');
144
+ } else {
145
+ console.log('Control failed');
135
146
  }
136
147
  };
137
148
  return (
138
149
  <View>
139
- <Button onPress={handleQuickAction} title="Example trigger quick action control Garage Up" />
150
+ <Button
151
+ onPress={handleQuickAction}
152
+ title="Example trigger quick action control Garage Up"
153
+ />
140
154
  </View>
141
155
  );
142
156
  };
143
157
  ```
144
- - sendRemoteCommand user needs to `have permission to control the device`, you pass in the `sensor and action` to it and it will run after calling render.
145
- - `sensor` is a device in your Unit and action is the `action` key of the device..
158
+
159
+ - sendRemoteCommand user needs to `have permission to control the device`, you pass in the `sensor and action` to it and it will run after calling render.
160
+ - `sensor` is a device in your Unit and action is the `action` key of the device..
146
161
  - You can take out the sensor and action from your Unit when calling the `API.UNIT.UNIT_DETAIL(unitId)` it will return all devices in 1 unit.
147
162
  - Or get sensor from `API.SENSOR.DISPLAY(sensor.id)` returns all actions of 1 device.
148
163
  - Refer YourProjectPath /node_modules/@eohjsc/react-native-smart-city/src/screens/Unit/Detail.js
164
+
165
+ ## Sync file to EoH source
166
+
167
+ ```
168
+ yarn install && yarn watch
169
+ ```
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@eohjsc/react-native-smart-city",
3
3
  "title": "React Native Smart Home",
4
- "version": "0.2.97",
4
+ "version": "0.3.0",
5
5
  "description": "TODO",
6
6
  "main": "index.js",
7
7
  "files": [
@@ -74,6 +74,7 @@
74
74
  "@types/react": "^17.0.0",
75
75
  "@types/react-native": "^0.63.43",
76
76
  "@types/react-test-renderer": "^17.0.0",
77
+ "axios-mock-adapter": "^1.21.1",
77
78
  "babel-jest": "^26.6.3",
78
79
  "detox": "^18.3.1",
79
80
  "eslint": "7.14.0",
@@ -124,6 +125,7 @@
124
125
  "@react-navigation/stack": "^5.7.0",
125
126
  "@sentry/react-native": "^1.7.1",
126
127
  "@testing-library/react-hooks": "^6.0.0",
128
+ "apisauce": "^2.1.5",
127
129
  "axios": "^0.19.2",
128
130
  "dotenv": "^8.2.0",
129
131
  "google-libphonenumber": "^3.2.10",
@@ -190,7 +192,7 @@
190
192
  "react-native-unimodules": "^0.11.0",
191
193
  "react-native-version-check": "^3.4.2",
192
194
  "react-native-vlc-media-player": "^1.0.39",
193
- "react-native-webview": "^10.9.3",
195
+ "react-native-webview": "11.17.2",
194
196
  "react-native-wheel-color-picker": "^1.2.0",
195
197
  "react-native-wheel-scrollview-picker": "^1.2.2",
196
198
  "react-native-wifi-reborn": "^4.5.0",
@@ -43,8 +43,9 @@ const ItemQuickAction = memo(({ sensor, wrapperStyle, setStatus, unit }) => {
43
43
  useEffect(() => {
44
44
  sensor.quick_action &&
45
45
  sensor.quick_action.config_id &&
46
+ sensor.device_type !== 'GOOGLE_HOME' &&
46
47
  watchMultiConfigs([sensor.quick_action.config_id]);
47
- }, [sensor.quick_action]);
48
+ }, [sensor.quick_action, sensor?.device_type]);
48
49
 
49
50
  useEffect(() => {
50
51
  if (!sensor.quick_action) {
@@ -59,7 +60,9 @@ const ItemQuickAction = memo(({ sensor, wrapperStyle, setStatus, unit }) => {
59
60
  const userId = useSCContextSelector((state) => state?.auth.account.user.id);
60
61
  const onActionPress = useCallback(() => {
61
62
  sendRemoteCommand(sensor, action, null, userId);
62
- sensor.quick_action && watchMultiConfigs([sensor.quick_action.config_id]);
63
+ sensor.quick_action &&
64
+ sensor.device_type !== 'GOOGLE_HOME' &&
65
+ watchMultiConfigs([sensor.quick_action.config_id]);
63
66
  setIsSendingCommand(true);
64
67
 
65
68
  if (!sensor.quick_action) {
@@ -35,7 +35,7 @@ const ColorPickerTemplate = memo(({ actionGroup, doAction, sensor }) => {
35
35
  }, [configuration.config, configValues, configuration]);
36
36
 
37
37
  useEffect(() => {
38
- if (sensor?.is_managed_by_backend) {
38
+ if (sensor?.is_managed_by_backend && sensor.device_type !== 'GOOGLE_HOME') {
39
39
  watchMultiConfigs([configuration.config]);
40
40
  }
41
41
  }, [sensor, configuration.config]);
@@ -17,6 +17,11 @@ const CurtainButtonTemplate = memo(({ actionGroup, doAction, sensor }) => {
17
17
  close_action_data,
18
18
  action_off_data,
19
19
  action_on_data,
20
+ is_display_lock,
21
+ text1,
22
+ text2,
23
+ text3,
24
+ text_door_lock,
20
25
  } = configuration || {};
21
26
  const [lock, setLock] = useState(false);
22
27
 
@@ -52,21 +57,21 @@ const CurtainButtonTemplate = memo(({ actionGroup, doAction, sensor }) => {
52
57
  {
53
58
  style: styles.buttonActionCurtain,
54
59
  icon: Images.buttonLeftCurtain,
55
- text: configuration.text1,
60
+ text: text1,
56
61
  onPress: onButtonOpenPress,
57
62
  testID: TESTID.BUTTON_TEMPLATE_1,
58
63
  },
59
64
  {
60
65
  style: styles.buttonActionCurtainCenter,
61
66
  icon: Images.buttonPauseCurtain,
62
- text: configuration.text2,
67
+ text: text2,
63
68
  onPress: onButtonStopPress,
64
69
  testID: TESTID.BUTTON_TEMPLATE_2,
65
70
  },
66
71
  {
67
72
  style: styles.buttonActionCurtain,
68
73
  icon: Images.buttonRightCurtain,
69
- text: configuration.text3,
74
+ text: text3,
70
75
  onPress: onButtonClosePress,
71
76
  testID: TESTID.BUTTON_TEMPLATE_3,
72
77
  },
@@ -96,7 +101,7 @@ const CurtainButtonTemplate = memo(({ actionGroup, doAction, sensor }) => {
96
101
  style={styles.textLockDoor}
97
102
  testID={TESTID.TEXT_DOOR_LOOK_ON_OFF}
98
103
  >
99
- {configuration.text_door_lock}{' '}
104
+ {text_door_lock}{' '}
100
105
  </Text>
101
106
  </View>
102
107
  <Switch
@@ -115,7 +120,7 @@ const CurtainButtonTemplate = memo(({ actionGroup, doAction, sensor }) => {
115
120
  <RenderThreeButtonActions />
116
121
  </View>
117
122
  <View style={styles.lockSwitch}>
118
- {configuration.is_display_lock &&
123
+ {is_display_lock &&
119
124
  itemLock(
120
125
  lock ? 'lock' : 'unlock',
121
126
  lock ? Colors.Primary : Colors.Gray6
@@ -38,8 +38,8 @@ const NumberUpDownActionTemplate = ({ actionGroup, doAction, sensor }) => {
38
38
  }, [configValues, config, keep_track_config]);
39
39
 
40
40
  const doActionAndWatchConfig = useCallback(
41
- (actionData, actionValue, actionName) => {
42
- doAction(
41
+ async (actionData, actionValue, actionName) => {
42
+ await doAction(
43
43
  actionData,
44
44
  JSON.stringify({ temperature: actionValue }),
45
45
  actionName
@@ -54,9 +54,17 @@ const NumberUpDownActionTemplate = ({ actionGroup, doAction, sensor }) => {
54
54
  return;
55
55
  }
56
56
 
57
- config && watchMultiConfigs([config]);
57
+ config &&
58
+ sensor.device_type !== 'GOOGLE_HOME' &&
59
+ watchMultiConfigs([config]);
58
60
  },
59
- [config, doAction, keep_track_config, sensor.is_managed_by_backend]
61
+ [
62
+ config,
63
+ doAction,
64
+ keep_track_config,
65
+ sensor.is_managed_by_backend,
66
+ sensor.device_type,
67
+ ]
60
68
  );
61
69
 
62
70
  const doActionUp = useCallback(async () => {
@@ -1,5 +1,6 @@
1
1
  import React from 'react';
2
2
  import { act, create } from 'react-test-renderer';
3
+ import { Switch } from 'react-native';
3
4
 
4
5
  import AutoLock from '../index';
5
6
  import { mockSCStore } from '../../../../../context/mockStore';
@@ -38,6 +39,9 @@ describe('Test AutoLock', () => {
38
39
  });
39
40
 
40
41
  const instance = tree.root;
42
+ const switchs = instance.findByType(Switch);
43
+ await switchs.props.onValueChange();
44
+
41
45
  const { buttonEnable, buttonInstant, buttonRelockTiming } =
42
46
  getElement(instance);
43
47
 
@@ -17,7 +17,7 @@ const OnOffSmartLock = memo(({ actionGroup, doAction, sensor }) => {
17
17
  const [isUnlock, setisUnlock] = useState(true);
18
18
  const [configValues] = useConfigGlobalState('configValues');
19
19
 
20
- const handleActionSmartLock = useCallback(() => {
20
+ const handleActionSmartLock = useCallback(async () => {
21
21
  if (action_on_data && action_off_data) {
22
22
  if (isUnlock) {
23
23
  let actionName = `${
@@ -25,17 +25,19 @@ const OnOffSmartLock = memo(({ actionGroup, doAction, sensor }) => {
25
25
  } ${actionGroup?.title?.toLowerCase()} lock`;
26
26
  actionName = actionName.replace(/\s+/g, ' ').trim();
27
27
  const dataLock = { door_lock: 0 };
28
- doAction(action_on_data, JSON.stringify(dataLock), actionName);
28
+ await doAction(action_on_data, JSON.stringify(dataLock), actionName);
29
29
  } else {
30
30
  let actionName = `${
31
31
  sensor?.name
32
32
  } ${actionGroup?.title?.toLowerCase()} unlock`;
33
33
  actionName = actionName.replace(/\s+/g, ' ').trim();
34
34
  const dataUnlock = { door_lock: 1 };
35
- doAction(action_off_data, JSON.stringify(dataUnlock), actionName);
35
+ await doAction(action_off_data, JSON.stringify(dataUnlock), actionName);
36
36
  }
37
37
  if (sensor?.is_managed_by_backend) {
38
- configuration.config && watchMultiConfigs([configuration.config]);
38
+ configuration.config &&
39
+ sensor.device_type !== 'GOOGLE_HOME' &&
40
+ watchMultiConfigs([configuration.config]);
39
41
  }
40
42
  }
41
43
  }, [
@@ -47,6 +49,7 @@ const OnOffSmartLock = memo(({ actionGroup, doAction, sensor }) => {
47
49
  sensor?.name,
48
50
  configuration,
49
51
  sensor?.is_managed_by_backend,
52
+ sensor?.device_type,
50
53
  ]);
51
54
 
52
55
  useEffect(() => {
@@ -19,7 +19,7 @@ const ButtonWrapper = ({ item, textHeadline }) => {
19
19
  };
20
20
 
21
21
  const ItemPasscode = memo(({ route }) => {
22
- const { item } = route.params;
22
+ const { item = {} } = route.params || {};
23
23
 
24
24
  return (
25
25
  <SafeAreaView style={styles.container}>
@@ -0,0 +1,24 @@
1
+ import React from 'react';
2
+ import { TouchableOpacity } from 'react-native';
3
+ import { act, create } from 'react-test-renderer';
4
+ import { SCProvider } from '../../../../../context';
5
+ import { mockSCStore } from '../../../../../context/mockStore';
6
+ import ItemPasscode from '../ItemPasscode';
7
+
8
+ const wrapComponent = (route = {}) => (
9
+ <SCProvider initState={mockSCStore({})}>
10
+ <ItemPasscode route={route} />
11
+ </SCProvider>
12
+ );
13
+
14
+ describe('Test ItemPasscode', () => {
15
+ let tree;
16
+ test('test render without params', async () => {
17
+ await act(async () => {
18
+ tree = await create(wrapComponent());
19
+ });
20
+ const instance = tree.root;
21
+ const TouchableOpacities = instance.findAllByType(TouchableOpacity);
22
+ expect(TouchableOpacities).toHaveLength(2);
23
+ });
24
+ });
@@ -40,6 +40,7 @@ describe('Test SetupGeneratePasscode', () => {
40
40
  const changeDuration = instance.findAll(
41
41
  (item) => item.props.testID === TESTID.GENERATE_PASSCODE_SET_DURATION
42
42
  );
43
+
43
44
  return {
44
45
  changeName,
45
46
  changeTime,
@@ -58,5 +59,18 @@ describe('Test SetupGeneratePasscode', () => {
58
59
  expect(changeName[0]).toBeDefined();
59
60
  expect(changeTime[0]).toBeDefined();
60
61
  expect(changeDuration[0]).toBeDefined();
62
+
63
+ await changeDuration[0].props.onPressSetMinute();
64
+ await changeDuration[0].props.onPressSelectCircle();
65
+ await changeTime[0].props.onPressSetTime();
66
+
67
+ const wheelDateTimePicker = instance.findAll(
68
+ (item) =>
69
+ item.props.testID ===
70
+ `${TESTID.WHEEL_DATE_TIME_PICKER_BUTTON}${TESTID.VIEW_BUTTON_BOTTOM_RIGHT_BUTTON}`
71
+ );
72
+ await wheelDateTimePicker[5].props.onClick();
73
+ await wheelDateTimePicker[11].props.onClick();
74
+ await wheelDateTimePicker[17].props.onClick();
61
75
  });
62
76
  });
@@ -180,6 +180,7 @@ const SetupGeneratePasscode = memo(() => {
180
180
  showsVerticalScrollIndicator={false}
181
181
  showsHorizontalScrollIndicator={false}
182
182
  style={styles.scrollview}
183
+ scrollIndicatorInsets={{ right: 1 }}
183
184
  >
184
185
  <View style={styles.wrap}>
185
186
  <ButtonWrapper
@@ -12,22 +12,22 @@ const OnOffSimpleTemplate = ({
12
12
  actionGroup,
13
13
  disabled,
14
14
  }) => {
15
- const isEnabled = !!isOn;
16
-
17
15
  return (
18
16
  <View style={styles.wrap}>
19
17
  <View style={styles.iconAndText}>
20
18
  <IconOutline name="poweroff" size={20} style={styles.marginRight} />
21
19
  <Text type="H4">{actionGroup.title}</Text>
22
20
  </View>
23
- <Switch
24
- trackColor={{ false: Colors.Gray4, true: Colors.Primary }}
25
- thumbColor={isEnabled ? Colors.White : Colors.Gray6}
26
- ios_backgroundColor={Colors.Gray4}
27
- onValueChange={triggerAction}
28
- value={isEnabled}
29
- disabled={disabled}
30
- />
21
+ {isOn !== null && (
22
+ <Switch
23
+ trackColor={{ false: Colors.Gray4, true: Colors.Primary }}
24
+ thumbColor={isOn ? Colors.White : Colors.Gray6}
25
+ ios_backgroundColor={Colors.Gray4}
26
+ onValueChange={triggerAction}
27
+ value={!!isOn}
28
+ disabled={disabled}
29
+ />
30
+ )}
31
31
  </View>
32
32
  );
33
33
  };
@@ -20,7 +20,8 @@ const getComponent = (template) => {
20
20
  const OnOffTemplate = memo(({ actionGroup, doAction, sensor }) => {
21
21
  const { configuration } = actionGroup;
22
22
  const { action_data, action_on_data, action_off_data } = configuration;
23
- const [isOn, setIsOn] = useState(true);
23
+ const [isOn, setIsOn] = useState(null);
24
+
24
25
  // eslint-disable-next-line no-unused-vars
25
26
  const [configValues, _] = useConfigGlobalState('configValues');
26
27
 
@@ -33,51 +34,53 @@ const OnOffTemplate = memo(({ actionGroup, doAction, sensor }) => {
33
34
  },
34
35
  [actionGroup?.title, sensor?.name]
35
36
  );
36
- const triggerAction = useCallback(() => {
37
+ const triggerAction = useCallback(async () => {
37
38
  switch (sensor?.device_type) {
38
39
  case DEVICE_TYPE.ZIGBEE:
39
40
  if (action_on_data && action_off_data) {
40
41
  if (isOn) {
41
- doAction(
42
+ await doAction(
42
43
  action_off_data,
43
44
  JSON.stringify({ state: 0 }),
44
45
  actionName('off')
45
46
  );
46
47
  } else {
47
- doAction(
48
+ await doAction(
48
49
  action_on_data,
49
50
  JSON.stringify({ state: 1 }),
50
51
  actionName('on')
51
52
  );
52
53
  }
53
54
  }
54
- return;
55
+ break;
55
56
  default:
56
57
  if (action_data) {
57
58
  if (isOn) {
58
- doAction(action_data, false);
59
+ await doAction(action_data, false);
59
60
  } else {
60
- doAction(action_data, true);
61
+ await doAction(action_data, true);
61
62
  }
62
63
  }
63
64
  if (action_on_data && action_off_data) {
64
65
  if (isOn) {
65
- doAction(action_off_data, null, actionName('off'));
66
+ await doAction(action_off_data, null, actionName('off'));
66
67
  } else {
67
- doAction(action_on_data, null, actionName('on'));
68
+ await doAction(action_on_data, null, actionName('on'));
68
69
  }
69
70
  }
70
- if (sensor?.is_managed_by_backend) {
71
- configuration.config && watchMultiConfigs([configuration.config]);
72
- }
73
- return;
71
+ break;
72
+ }
73
+ if (sensor?.is_managed_by_backend) {
74
+ configuration?.config &&
75
+ sensor?.device_type !== 'GOOGLE_HOME' &&
76
+ watchMultiConfigs([configuration?.config]);
74
77
  }
75
78
  }, [
76
79
  actionName,
77
80
  action_data,
78
81
  action_off_data,
79
82
  action_on_data,
80
- configuration.config,
83
+ configuration?.config,
81
84
  doAction,
82
85
  isOn,
83
86
  sensor?.device_type,
@@ -103,7 +106,7 @@ const OnOffTemplate = memo(({ actionGroup, doAction, sensor }) => {
103
106
  if (sensor?.device_type === DEVICE_TYPE.LG_THINQ) {
104
107
  return;
105
108
  }
106
- if (sensor?.is_managed_by_backend) {
109
+ if (sensor?.is_managed_by_backend && sensor.device_type !== 'GOOGLE_HOME') {
107
110
  watchMultiConfigs([configuration.config]);
108
111
  }
109
112
  }, [sensor, configuration.config]);
@@ -67,7 +67,9 @@ const OptionsDropdownActionTemplate = ({ actionGroup, doAction, sensor }) => {
67
67
  actionName
68
68
  );
69
69
  if (sensor?.is_managed_by_backend) {
70
- configuration.config && watchMultiConfigs([configuration.config]);
70
+ configuration.config &&
71
+ sensor.device_type !== 'GOOGLE_HOME' &&
72
+ watchMultiConfigs([configuration.config]);
71
73
  }
72
74
  hideAlertAction();
73
75
  }, [
@@ -79,6 +81,7 @@ const OptionsDropdownActionTemplate = ({ actionGroup, doAction, sensor }) => {
79
81
  selectedIndex,
80
82
  sensor?.is_managed_by_backend,
81
83
  sensor?.name,
84
+ sensor?.device_type,
82
85
  title,
83
86
  ]);
84
87
 
@@ -89,7 +92,7 @@ const OptionsDropdownActionTemplate = ({ actionGroup, doAction, sensor }) => {
89
92
  return t('not_available');
90
93
  }
91
94
  return selectedOption.text;
92
- }, [configuration.config, selectedOption.text, t]);
95
+ }, [configuration?.config, selectedOption?.text, t]);
93
96
 
94
97
  const iconSvg = useMemo(() => {
95
98
  switch (icon) {
@@ -145,7 +148,10 @@ const OptionsDropdownActionTemplate = ({ actionGroup, doAction, sensor }) => {
145
148
  rightButtonClick={onDone}
146
149
  >
147
150
  <View style={styles.wrapRename}>
148
- <ScrollView style={styles.scrollView}>
151
+ <ScrollView
152
+ style={styles.scrollView}
153
+ scrollIndicatorInsets={{ right: 1 }}
154
+ >
149
155
  {!action_data && (
150
156
  <Text
151
157
  color={Colors.Gray6}
@@ -37,7 +37,7 @@ const SliderRangeTemplate = memo(({ actionGroup, doAction, sensor }) => {
37
37
  }, [configuration.config, configValues, configuration]);
38
38
 
39
39
  useEffect(() => {
40
- if (sensor?.is_managed_by_backend) {
40
+ if (sensor?.is_managed_by_backend && sensor.device_type !== 'GOOGLE_HOME') {
41
41
  watchMultiConfigs([configuration.config]);
42
42
  }
43
43
  }, [sensor, configuration.config]);
@@ -91,7 +91,10 @@ const SmartTiviActionTemplate = memo(
91
91
  }, []);
92
92
  return (
93
93
  <>
94
- <ScrollView scrollEnabled={scrollEnabled}>
94
+ <ScrollView
95
+ scrollEnabled={scrollEnabled}
96
+ scrollIndicatorInsets={{ right: 1 }}
97
+ >
95
98
  <View style={styles.wrap}>
96
99
  <View style={styles.rowOnOff}>
97
100
  <CircleButton
@@ -45,10 +45,20 @@ const GridItem = ({ item, index, length, doAction, sensor, title }) => {
45
45
  actionName = actionName.replace(/\s+/g, ' ').trim();
46
46
  doAction(actionData, null, actionName);
47
47
  if (sensor?.is_managed_by_backend) {
48
- config && watchMultiConfigs([config]);
48
+ config &&
49
+ sensor.device_type !== 'GOOGLE_HOME' &&
50
+ watchMultiConfigs([config]);
49
51
  }
50
52
  },
51
- [config, doAction, sensor?.is_managed_by_backend, sensor?.name, text, title]
53
+ [
54
+ config,
55
+ doAction,
56
+ sensor?.is_managed_by_backend,
57
+ sensor?.name,
58
+ sensor?.device_type,
59
+ text,
60
+ title,
61
+ ]
52
62
  );
53
63
 
54
64
  const iconKit = !!icon_kit_data && icon_kit_data.icon;
@@ -95,15 +105,19 @@ const GridItem = ({ item, index, length, doAction, sensor, title }) => {
95
105
  );
96
106
  };
97
107
 
98
- const StatesGridActionTemplate = ({ actionGroup, doAction, sensor }) => {
99
- const { configuration, title } = actionGroup;
108
+ const StatesGridActionTemplate = ({
109
+ actionGroup = {},
110
+ doAction,
111
+ sensor = {},
112
+ }) => {
113
+ const { configuration = {}, title } = actionGroup;
100
114
 
101
115
  // eslint-disable-next-line no-unused-vars
102
116
  const [configValues, setConfigValues] = useConfigGlobalState('configValues');
103
117
 
104
118
  const options = useMemo(() => {
105
- return configuration.options.map((option) => {
106
- if (configValues[option.config] === option.is_on_value) {
119
+ return (configuration?.options || []).map((option) => {
120
+ if (configValues[option?.config] === option?.is_on_value) {
107
121
  return {
108
122
  ...option,
109
123
  active: true,
@@ -114,10 +128,10 @@ const StatesGridActionTemplate = ({ actionGroup, doAction, sensor }) => {
114
128
  }, [configuration, configValues]);
115
129
 
116
130
  useEffect(() => {
117
- if (sensor?.is_managed_by_backend) {
131
+ if (sensor?.is_managed_by_backend && sensor.device_type !== 'GOOGLE_HOME') {
118
132
  watchMultiConfigs(configuration.options.map((option) => option.config));
119
133
  }
120
- }, [sensor.is_managed_by_backend, configuration.options]);
134
+ }, [sensor.is_managed_by_backend, sensor.device_type, configuration.options]);
121
135
 
122
136
  return (
123
137
  <View style={styles.wrap}>