@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.
- package/README.md +35 -14
- package/package.json +4 -2
- package/src/commons/Action/ItemQuickAction.js +5 -2
- package/src/commons/ActionGroup/ColorPickerTemplate.js +1 -1
- package/src/commons/ActionGroup/CurtainButtonTemplate.js +10 -5
- package/src/commons/ActionGroup/NumberUpDownActionTemplate.js +12 -4
- package/src/commons/ActionGroup/OnOffSmartLock/AutoLock/__test__/index.test.js +4 -0
- package/src/commons/ActionGroup/OnOffSmartLock/OnOffSmartLock.js +7 -4
- package/src/commons/ActionGroup/OnOffSmartLock/PasscodeList/ItemPasscode.js +1 -1
- package/src/commons/ActionGroup/OnOffSmartLock/PasscodeList/__test__/ItemPasscode.test.js +24 -0
- package/src/commons/ActionGroup/OnOffSmartLock/SetupGeneratePasscode/__test__/index.test.js +14 -0
- package/src/commons/ActionGroup/OnOffSmartLock/SetupGeneratePasscode/index.js +1 -0
- package/src/commons/ActionGroup/OnOffTemplate/OnOffSimpleTemplate.js +10 -10
- package/src/commons/ActionGroup/OnOffTemplate/index.js +18 -15
- package/src/commons/ActionGroup/OptionsDropdownActionTemplate.js +9 -3
- package/src/commons/ActionGroup/SliderRangeTemplate.js +1 -1
- package/src/commons/ActionGroup/SmartTiviActionTemplate/SmartTiviActionTemplate.js +4 -1
- package/src/commons/ActionGroup/StatesGridActionTemplate.js +22 -8
- package/src/commons/ActionGroup/TimerActionTemplate.js +11 -3
- package/src/commons/ActionGroup/TwoButtonTemplate/index.js +13 -9
- package/src/commons/ActionGroup/__test__/CurtainButtonTemplate.test.js +53 -4
- package/src/commons/ActionGroup/__test__/OnOffButtonTemplate.test.js +14 -14
- package/src/commons/ActionGroup/__test__/OnOffTemplate.test.js +53 -78
- package/src/commons/ActionGroup/__test__/OneBigButtonTemplate.test.js +36 -20
- package/src/commons/ActionGroup/__test__/StatesGridActionTemplate.test.js +77 -0
- package/src/commons/ActionGroup/__test__/TimerActionTemplate.test.js +58 -6
- package/src/commons/ActionGroup/__test__/TwoButtonTemplate.test.js +49 -1
- package/src/commons/ActionGroup/__test__/index.test.js +135 -0
- package/src/commons/Auth/AccountList.js +1 -1
- package/src/commons/Automate/ItemAutomate.js +1 -3
- package/src/commons/Calendar/__test__/Calendar.test.js +33 -0
- package/src/commons/Connecting/__test__/Connecting.test.js +19 -2
- package/src/commons/ConnectingProcess/__test__/Connecting.test.js +136 -3
- package/src/commons/ConnectingProcess/index.js +1 -1
- package/src/commons/Dashboard/MyPinnedSharedUnit/__test__/MyPinnedSharedUnit.test.js +16 -13
- package/src/commons/Dashboard/MyPinnedSharedUnit/index.js +1 -1
- package/src/commons/Dashboard/MyUnit/__test__/MyUnit.test.js +0 -5
- package/src/commons/Device/Hanet/ItemHanetDevice.test.js +58 -0
- package/src/commons/Device/HistoryChart.js +4 -0
- package/src/commons/Device/LinearChart.js +15 -0
- package/src/commons/Device/PMSensor/PMSensorIndicatior.js +16 -12
- package/src/commons/Device/PMSensor/PMSensorIndicatorStyles.js +3 -0
- package/src/commons/Device/WaterQualitySensor/ListQualityIndicator.js +1 -0
- package/src/commons/Explore/__test__/CityItem.test.js +33 -54
- package/src/commons/FieldTemplate/ChooseUserField/ChooseFieldStyles.js +25 -0
- package/src/commons/FieldTemplate/ChooseUserField/ChoosePopup.js +96 -0
- package/src/commons/FieldTemplate/ChooseUserField/ChoosePopupStyles.js +39 -0
- package/src/commons/FieldTemplate/ChooseUserField/__test__/index.test.js +118 -0
- package/src/commons/FieldTemplate/ChooseUserField/index.js +62 -0
- package/src/commons/FieldTemplate/PasscodeField/PasscodeFieldStyles.js +30 -0
- package/src/commons/FieldTemplate/PasscodeField/__test__/index.test.js +90 -0
- package/src/commons/FieldTemplate/PasscodeField/index.js +43 -0
- package/src/commons/FieldTemplate/ScheduleField/ScheduleFieldStyles.js +13 -0
- package/src/commons/FieldTemplate/ScheduleField/__test__/index.test.js +179 -0
- package/src/commons/FieldTemplate/ScheduleField/index.js +176 -0
- package/src/commons/FullLoading/index.js +2 -1
- package/src/commons/MenuActionAddnew/index.js +1 -0
- package/src/commons/MenuActionList/index.js +1 -0
- package/src/commons/MenuActionMore/index.js +1 -1
- package/src/commons/PreventAccess/__test__/PreventAccess.test.js +62 -0
- package/src/commons/PreventAccess/index.js +9 -1
- package/src/commons/Sharing/__test__/DevicePermissionsCheckbox.test.js +0 -1
- package/src/commons/SubUnit/OneTap/__test__/SubUnitAutomate.test.js +8 -35
- package/src/commons/SubUnit/OneTap/index.js +1 -2
- package/src/commons/Unit/SharedUnit.js +1 -0
- package/src/commons/Unit/__test__/SharedUnit.test.js +38 -183
- package/src/commons/WheelDateTimePicker/index.js +2 -1
- package/src/configs/API.js +87 -138
- package/src/configs/Constants.js +27 -1
- package/src/configs/SCConfig.js +2 -0
- package/src/iot/RemoteControl/__test__/GoogleHome.test.js +8 -30
- package/src/iot/RemoteControl/__test__/Internet.test.js +18 -7
- package/src/iot/RemoteControl/__test__/LgThinq.test.js +36 -177
- package/src/navigations/UnitStack.js +8 -0
- package/src/screens/AQIGuide/index.js +1 -1
- package/src/screens/ActivityLog/FilterPopup.js +2 -0
- package/src/screens/ActivityLog/__test__/index.test.js +38 -23
- package/src/screens/ActivityLog/hooks/__test__/index.test.js +51 -90
- package/src/screens/ActivityLog/index.js +2 -2
- package/src/screens/AddCommon/SelectSubUnit.js +1 -0
- package/src/screens/AddCommon/SelectUnit.js +1 -0
- package/src/screens/AddCommon/__test__/SelectSubUnit.test.js +13 -24
- package/src/screens/AddCommon/__test__/SelectUnit.test.js +9 -33
- package/src/screens/AddLocationMaps/index.js +4 -1
- package/src/screens/AddNewAction/SelectSensorDevices.js +8 -2
- package/src/screens/AddNewAction/__test__/SelectAction.test.js +10 -91
- package/src/screens/AddNewAction/__test__/SelectSensorDevices.test.js +40 -26
- package/src/screens/AddNewAutoSmart/__test__/AddNewAutoSmart.test.js +3 -1
- package/src/screens/AddNewAutoSmart/index.js +5 -2
- package/src/screens/AddNewDevice/ConnectingDevices.js +3 -3
- package/src/screens/AddNewDevice/__test__/AddNewDevice.test.js +34 -33
- package/src/screens/AddNewDevice/__test__/ConnectDevices.test.js +0 -4
- package/src/screens/AddNewDevice/__test__/ConnectingDevices.test.js +21 -21
- package/src/screens/AddNewDevice/index.js +1 -0
- package/src/screens/AddNewGateway/PlugAndPlay/GatewayWifiList.js +4 -1
- package/src/screens/AddNewGateway/SelectGateway.js +1 -0
- package/src/screens/AddNewGateway/SetupGatewayWifi.js +1 -0
- package/src/screens/AddNewGateway/__test__/AddNewGateway.test.js +4 -6
- package/src/screens/AddNewGateway/__test__/ConnectedGateway.test.js +0 -4
- package/src/screens/AddNewGateway/__test__/ConnectingGateway.test.js +5 -29
- package/src/screens/AddNewGateway/__test__/SelectGateway.test.js +0 -4
- package/src/screens/AddNewGateway/__test__/SetupGateway.test.js +0 -4
- package/src/screens/AddNewGateway/index.js +1 -0
- package/src/screens/AddNewOneTap/__test__/AddNewOneTap.test.js +10 -24
- package/src/screens/AddNewOneTap/index.js +3 -2
- package/src/screens/Automate/__test__/MultiUnits.test.js +6 -9
- package/src/screens/Automate/__test__/index.test.js +7 -12
- package/src/screens/Automate/index.js +2 -0
- package/src/screens/ConfirmUnitDeletion/__test__/ConfirmUnitDeletion.test.js +36 -8
- package/src/screens/ConfirmUnitDeletion/index.js +7 -1
- package/src/screens/Device/EditDevice/__test__/EditDevice.test.js +71 -22
- package/src/screens/Device/__test__/detail.test.js +23 -84
- package/src/screens/Device/detail.js +31 -8
- package/src/screens/Device/hooks/useFavoriteDevice.js +5 -9
- package/src/screens/DeviceInfo/__test__/index.test.js +0 -2
- package/src/screens/EmergencyContacts/EmergencyContactsSelectContacts.js +6 -3
- package/src/screens/EmergencyContacts/__test__/EmergencyContactAddNew.test.js +7 -19
- package/src/screens/EmergencyContacts/__test__/EmergencyContactList.test.js +20 -2
- package/src/screens/EmergencyContacts/__test__/EmergencyContactsSelectContacts.test.js +40 -23
- package/src/screens/EmergencySetting/index.js +4 -1
- package/src/screens/EnterPassword/__test__/EnterPassword.test.js +41 -25
- package/src/screens/Explore/index.js +2 -0
- package/src/screens/GuestInfo/__test__/index.test.js +14 -41
- package/src/screens/GuestInfo/components/RecurringDetail.js +1 -0
- package/src/screens/GuestInfo/components/TemporaryDetail.js +2 -2
- package/src/screens/HanetCamera/__test__/CaptureFaceID.test.js +8 -12
- package/src/screens/HanetCamera/__test__/Detail.test.js +27 -42
- package/src/screens/HanetCamera/__test__/ManageAccess.test.js +8 -5
- package/src/screens/HanetCamera/__test__/MemberInfo.test.js +10 -32
- package/src/screens/HanetCamera/hooks/__test__/useHanetCheckinData.test.js +43 -35
- package/src/screens/HanetCamera/hooks/__test__/useHanetPlaceMembers.test.js +10 -21
- package/src/screens/ManageAccess/__test__/ManageAccess.test.js +33 -22
- package/src/screens/ManageAccess/hooks/__test__/useManageAccess.test.js +44 -45
- package/src/screens/ManageAccess/index.js +2 -1
- package/src/screens/MoveToAnotherSubUnit/__test__/index.test.js +35 -12
- package/src/screens/MoveToAnotherSubUnit/index.js +5 -5
- package/src/screens/Notification/__test__/Notification.test.js +14 -25
- package/src/screens/Notification/__test__/NotificationItem.test.js +4 -3
- package/src/screens/PlayBackCamera/__test__/index.test.js +87 -2
- package/src/screens/PlayBackCamera/index.js +19 -3
- package/src/screens/ScanChipQR/__test__/ScanChipQR.test.js +7 -20
- package/src/screens/ScanChipQR/components/QRScan/index.js +1 -0
- package/src/screens/ScanSensorQR/__test__/ScanSensorQR.test.js +8 -24
- package/src/screens/ScriptDetail/__test__/index.test.js +17 -86
- package/src/screens/ScriptDetail/index.js +5 -4
- package/src/screens/SelectUnit/__test__/index.test.js +12 -55
- package/src/screens/SelectUnit/index.js +5 -2
- package/src/screens/SetSchedule/index.js +6 -2
- package/src/screens/SharedUnit/__test__/TabHeader.test.js +0 -2
- package/src/screens/SharedUnit/index.js +2 -0
- package/src/screens/Sharing/InfoMemberUnit.js +1 -1
- package/src/screens/Sharing/MemberList.js +12 -11
- package/src/screens/Sharing/SelectPermission.js +107 -70
- package/src/screens/Sharing/__test__/InfoMemberUnit.test.js +47 -29
- package/src/screens/Sharing/__test__/MemberList.test.js +13 -127
- package/src/screens/Sharing/__test__/MemberList2.test.js +80 -0
- package/src/screens/Sharing/__test__/SelectPermission.test.js +28 -38
- package/src/screens/Sharing/__test__/SelectUser.test.js +17 -38
- package/src/screens/Sharing/hooks/index.js +3 -0
- package/src/screens/SideMenuDetail/SideMenuDetailStyles.js +28 -0
- package/src/screens/SideMenuDetail/__test__/index.test.js +154 -0
- package/src/screens/SideMenuDetail/index.js +149 -0
- package/src/screens/SmartIr/components/SelectBrand.js +1 -1
- package/src/screens/SubUnit/ManageSubUnit.js +1 -0
- package/src/screens/SubUnit/__test__/AddSubUnit.test.js +21 -67
- package/src/screens/SubUnit/__test__/Detail.test.js +31 -8
- package/src/screens/SubUnit/__test__/EditSubUnit.test.js +21 -89
- package/src/screens/SubUnit/hooks/__test__/useManageSubUnit.test.js +47 -44
- package/src/screens/SyncLGDevice/AddLGDevice.js +1 -0
- package/src/screens/SyncLGDevice/__test__/AddLGDevice.test.js +14 -90
- package/src/screens/TDSGuide/index.js +4 -1
- package/src/screens/UVIndexGuide/index.js +1 -1
- package/src/screens/Unit/ChooseLocation.js +1 -1
- package/src/screens/Unit/ManageUnit.js +1 -0
- package/src/screens/Unit/SelectAddress.js +4 -1
- package/src/screens/Unit/Station/index.js +1 -0
- package/src/screens/Unit/Summaries.js +1 -1
- package/src/screens/Unit/__test__/CheckSendEmail.test.js +15 -28
- package/src/screens/Unit/__test__/ChooseLocation.test.js +27 -14
- package/src/screens/Unit/__test__/Detail.test.js +83 -185
- package/src/screens/Unit/__test__/ManageUnit.test.js +18 -42
- package/src/screens/Unit/__test__/SelectAddress.test.js +13 -39
- package/src/screens/Unit/__test__/SmartAccount.test.js +17 -9
- package/src/screens/Unit/__test__/SmartAccountItem.test.js +0 -1
- package/src/screens/Unit/components/MyAllUnit/__test__/MyAllUnit.test.js +36 -0
- package/src/screens/Unit/components/MyAllUnit/__test__/index.test.js +54 -0
- package/src/screens/Unit/components/SharedUnit/index.js +1 -0
- package/src/screens/Unit/components/__test__/SharedUnit.test.js +31 -34
- package/src/screens/UnitSummary/__test__/index.test.js +38 -31
- package/src/screens/UnitSummary/components/PowerConsumeHistoryChart/__test__/index.test.js +7 -4
- package/src/screens/UnitSummary/components/PowerConsumption/__test__/PowerConsumption.test.js +14 -16
- package/src/screens/WaterQualityGuide/index.js +1 -1
- package/src/utils/Apis/axios.js +37 -13
- package/src/utils/I18n/translations/en.json +1 -0
- package/src/utils/I18n/translations/vi.json +1 -0
- package/src/utils/Route/index.js +1 -0
- 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
|
-
|
|
6
|
+
|
|
7
|
+
- Using [Yarn](https://yarnpkg.com/): `yarn add react-native-reanimated@^1.10.1`
|
|
6
8
|
|
|
7
9
|
2. Install:
|
|
8
|
-
|
|
9
|
-
|
|
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
|
-
|
|
97
|
-
|
|
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
|
|
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
|
-
|
|
145
|
-
- `
|
|
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.
|
|
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": "
|
|
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 &&
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
-
{
|
|
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
|
-
{
|
|
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 &&
|
|
57
|
+
config &&
|
|
58
|
+
sensor.device_type !== 'GOOGLE_HOME' &&
|
|
59
|
+
watchMultiConfigs([config]);
|
|
58
60
|
},
|
|
59
|
-
[
|
|
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 &&
|
|
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(() => {
|
|
@@ -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
|
});
|
|
@@ -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
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
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
|
|
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 &&
|
|
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
|
|
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
|
|
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
|
|
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 &&
|
|
48
|
+
config &&
|
|
49
|
+
sensor.device_type !== 'GOOGLE_HOME' &&
|
|
50
|
+
watchMultiConfigs([config]);
|
|
49
51
|
}
|
|
50
52
|
},
|
|
51
|
-
[
|
|
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 = ({
|
|
99
|
-
|
|
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
|
|
106
|
-
if (configValues[option
|
|
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}>
|