@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.
- package/assets/images/Map/LocationPin.svg +10 -0
- package/package.json +4 -2
- package/src/commons/Action/__test__/ItemQuickAction.test.js +2 -2
- package/src/commons/ActionGroup/NumberUpDownActionTemplate.js +3 -3
- package/src/commons/ActionGroup/OnOffSmartLock/AutoLock/ButtonWrapper.js +3 -3
- package/src/commons/ActionGroup/OnOffSmartLock/PasscodeList/index.js +3 -3
- package/src/commons/ActionGroup/OnOffSmartLock/SetupGeneratePasscode/ButtonWrapper.js +2 -2
- package/src/commons/ActionGroup/OnOffTemplate/OnOffSimpleTemplate.js +2 -2
- package/src/commons/ActionGroup/OptionsDropdownActionTemplate.js +2 -2
- package/src/commons/ActionGroup/SliderRangeTemplate.js +7 -7
- package/src/commons/ActionGroup/SmartTiviActionTemplate/SmartTiviActionTemplate.js +2 -2
- package/src/commons/ActionGroup/SmartTiviActionTemplate/component/CircleButton.js +5 -5
- package/src/commons/ActionGroup/SmartTiviActionTemplate/component/ControlPlay.js +5 -5
- package/src/commons/ActionGroup/TerminalBoxTemplate.js +2 -2
- package/src/commons/ActionGroup/TextBoxTemplate.js +2 -2
- package/src/commons/ActionGroup/TimerActionTemplate.js +6 -3
- package/src/commons/ActionGroup/TwoButtonTemplate/index.js +2 -2
- package/src/commons/ActionGroup/__test__/index.test.js +2 -2
- package/src/commons/ActionGroup/index.js +2 -2
- package/src/commons/Automate/ItemAutomate.js +9 -41
- package/src/commons/Automate/ItemConditionScriptDetail.js +109 -0
- package/src/commons/Automate/ItemConditionScriptDetailStyles.js +46 -0
- package/src/commons/Automate/__test__/ItemAutomate.test.js +0 -21
- package/src/commons/BackDefault/index.js +2 -2
- package/src/commons/BottomButtonView/index.js +1 -0
- package/src/commons/ButtonPopup/index.js +3 -2
- package/src/commons/DateTimeRangeChange/DateTimeButton.js +3 -3
- package/src/commons/Device/ConnectedViewHeader.js +2 -2
- package/src/commons/Device/Emergency/EmergencyDetail.js +3 -3
- package/src/commons/Device/FlatListItems.js +3 -3
- package/src/commons/Device/Hanet/ItemHanetDevice.js +3 -3
- package/src/commons/Device/HorizontalBarChart.js +54 -34
- package/src/commons/Device/ItemAddNew/index.js +2 -2
- package/src/commons/Device/ItemDevice.js +2 -2
- package/src/commons/Device/SonosSpeaker/index.js +3 -3
- package/src/commons/Device/WaterPurifierStatus/AlertStatusMachine.js +2 -2
- package/src/commons/Device/WaterQualitySensor/QualityIndicatorsItem.js +6 -2
- package/src/commons/DisplayChecking/index.js +2 -2
- package/src/commons/EmergencyButton/AlertSendConfirm.js +2 -2
- package/src/commons/FieldTemplate/ChooseUserField/index.js +2 -2
- package/src/commons/FlatListDnD/index.js +12 -9
- package/src/commons/Grid/GridItem.js +10 -2
- package/src/commons/Header/HeaderCustom.js +2 -2
- package/src/commons/HeaderAni/index.js +2 -2
- package/src/commons/IconComponent/index.js +4 -4
- package/src/commons/NavBar/index.js +2 -2
- package/src/commons/OneTapTemplate/NumberUpDownActionTemplate.js +3 -3
- package/src/commons/OneTapTemplate/__test__/StatesGridActionTemplate.test.js +4 -4
- package/src/commons/SearchLocation/index.js +3 -3
- package/src/commons/SelectActionCard/index.js +2 -2
- package/src/commons/SelectSubUnit/index.js +6 -2
- package/src/commons/Sharing/BtnRemoveMember.js +2 -2
- package/src/commons/Sharing/StationDevicePermissions.js +2 -2
- package/src/commons/SubUnit/DeviceTemplate/ConfigAndEvaluation/ConfigAndEvaluation.js +2 -2
- package/src/commons/SubUnit/DeviceTemplate/ConfigValue/ConfigValue.js +2 -2
- package/src/commons/SubUnit/DeviceTemplate/EvaluationOverConfig/EvaluationOverConfig.js +2 -2
- package/src/commons/SubUnit/OneTap/ItemOneTap.js +3 -4
- package/src/commons/SubUnit/OneTap/__test__/SubUnitAutomate.test.js +0 -2
- package/src/commons/SubUnit/OneTap/index.js +9 -8
- package/src/commons/Unit/HeaderUnit/index.js +3 -3
- package/src/commons/Unit/SharedUnit.js +7 -7
- package/src/commons/Widgets/IFrameWithConfig/IFrameWithConfig.js +4 -15
- package/src/commons/Widgets/IFrameWithConfig/__tests__/IFrameWithConfig.test.js +29 -18
- package/src/configs/API.js +1 -1
- package/src/configs/AccessibilityLabel.js +1 -0
- package/src/configs/Theme.js +1 -1
- package/src/hooks/IoT/__test__/useRemoteControl.test.js +14 -7
- package/src/hooks/IoT/useRemoteControl.js +18 -7
- package/src/hooks/useMqtt.js +2 -2
- package/src/iot/RemoteControl/Bluetooth.js +19 -22
- package/src/iot/RemoteControl/Internet.js +11 -3
- package/src/navigations/EmergencyContactsStack.js +4 -3
- package/src/navigations/SharedStack.js +2 -0
- package/src/navigations/UnitStack.js +56 -57
- package/src/screens/AQIGuide/index.js +0 -2
- package/src/screens/ActivityLog/index.js +2 -2
- package/src/screens/AddLocationMaps/index.js +16 -19
- package/src/screens/AddLocationMaps/indexStyle.js +1 -0
- package/src/screens/AddNewGateway/RenameNewDevices.js +2 -2
- package/src/screens/AddNewGateway/SelectDeviceType.js +1 -1
- package/src/screens/AllGateway/GatewayInfo/__test__/index.test.js +25 -9
- package/src/screens/Automate/AddNewAction/ChooseAction.js +17 -3
- package/src/screens/Automate/AddNewAction/ChooseConfig.js +7 -6
- package/src/screens/Automate/AddNewAction/NewActionWrapper.js +8 -8
- package/src/screens/Automate/AddNewAction/SelectControlDevices.js +30 -20
- package/src/screens/Automate/AddNewAction/SelectMonitorDevices.js +17 -10
- package/src/screens/Automate/AddNewAction/SetupConfigCondition.js +58 -44
- package/src/screens/Automate/AddNewAction/SetupScriptDelay.js +1 -1
- package/src/screens/Automate/AddNewAction/SetupScriptNotify.js +3 -3
- package/src/screens/Automate/AddNewAction/Styles/SetupSensorStyles.js +20 -4
- package/src/screens/Automate/AddNewAction/__test__/ChooseAction.test.js +1 -1
- package/src/screens/Automate/AddNewAction/__test__/SelectControlDevices.test.js +14 -8
- package/src/screens/Automate/AddNewAction/__test__/SelectMonitorDevices.test.js +13 -7
- package/src/screens/Automate/AddNewAction/__test__/SetupConfigCondition.test.js +54 -15
- package/src/screens/Automate/AddNewAction/__test__/SetupScriptNotify.test.js +29 -0
- package/src/screens/Automate/AddNewAutoSmart/AddTypeSmart.js +10 -10
- package/src/screens/Automate/AddNewAutoSmart/__test__/AddNewAutoSmart.test.js +2 -0
- package/src/screens/Automate/Components/InputName.js +10 -7
- package/src/screens/Automate/EditActionsList/index.js +19 -17
- package/src/screens/Automate/MultiUnits.js +19 -22
- package/src/screens/Automate/OneTap/__test__/AddNewOneTap.test.js +12 -2
- package/src/screens/Automate/Scenario/__test__/AddNewOneTap.test.js +9 -1
- package/src/screens/Automate/ScriptDetail/Components/AddActionScript.js +14 -6
- package/src/screens/Automate/ScriptDetail/Components/RenameScript.js +4 -7
- package/src/screens/Automate/ScriptDetail/__test__/index.test.js +42 -17
- package/src/screens/Automate/ScriptDetail/index.js +33 -22
- package/src/screens/Automate/SetSchedule/__test__/index.test.js +21 -10
- package/src/screens/Automate/SetSchedule/components/RowItem.js +5 -5
- package/src/screens/Automate/SetSchedule/index.js +8 -7
- package/src/screens/Automate/Styles/indexStyles.js +1 -1
- package/src/screens/Automate/__test__/MultiUnits.test.js +1 -4
- package/src/screens/Automate/__test__/index.test.js +0 -1
- package/src/screens/Automate/index.js +36 -34
- package/src/screens/ChangePosition/index.js +2 -1
- package/src/screens/Device/EditDevice/__test__/EditDevice.test.js +4 -4
- package/src/screens/Device/EditDevice/index.js +4 -4
- package/src/screens/Device/__test__/BluetoothDevice.test.js +300 -0
- package/src/screens/Device/__test__/detail.test.js +3 -3
- package/src/screens/Device/components/BluetoothDevice.js +135 -0
- package/src/screens/Device/components/SensorDisplayItem.js +4 -3
- package/src/screens/Device/detail.js +70 -62
- package/src/screens/Device/hooks/useEvaluateValue.js +1 -1
- package/src/screens/Drawer/index.js +3 -3
- package/src/screens/EmergencyContacts/EmergencyContactsList.js +8 -4
- package/src/screens/EmergencyContacts/EmergencyContactsSelectContacts.js +3 -3
- package/src/screens/EmergencySetting/components/DropDownItem.js +2 -2
- package/src/screens/GuestInfo/components/RowGuestInfo.js +2 -2
- package/src/screens/GuestInfo/index.js +2 -2
- package/src/screens/HanetCamera/ManageAccess.js +3 -3
- package/src/screens/HanetCamera/MemberInfo.js +2 -2
- package/src/screens/HanetCamera/components/RequestFaceIDPopup.js +2 -2
- package/src/screens/ManageAccess/index.js +3 -3
- package/src/screens/Notification/components/NotificationItem.js +3 -3
- package/src/screens/Notification/index.js +3 -3
- package/src/screens/ScanChipQR/components/QRScan/index.js +3 -3
- package/src/screens/SelectUnit/__test__/index.test.js +1 -1
- package/src/screens/SelectUnit/index.js +4 -4
- package/src/screens/SharedUnit/TabHeader.js +2 -2
- package/src/screens/Sharing/Components/EndDevice.js +3 -3
- package/src/screens/Sharing/UnitMemberList.js +2 -2
- package/src/screens/SmartAccount/SuccessfullyConnected/index.js +2 -2
- package/src/screens/SmartIr/__test__/GroupButtonByType.test.js +3 -2
- package/src/screens/SmartIr/components/GroupButtonByType/GroupButtonByType.js +2 -2
- package/src/screens/SmartIr/components/SelectBrand.js +2 -2
- package/src/screens/SubUnit/AddSubUnit.js +28 -24
- package/src/screens/SubUnit/AddSubUnitStyles.js +10 -4
- package/src/screens/SubUnit/EditSubUnit.js +12 -11
- package/src/screens/SubUnit/ManageSubUnit.js +3 -3
- package/src/screens/SubUnit/__test__/AddSubUnit.test.js +13 -13
- package/src/screens/SubUnit/__test__/EditSubUnit.test.js +3 -3
- package/src/screens/Template/EditTemplate.js +6 -4
- package/src/screens/UVIndexGuide/index.js +2 -4
- package/src/screens/Unit/SelectAddToFavorites.js +2 -2
- package/src/screens/Unit/SelectAddress.js +16 -12
- package/src/screens/Unit/components/AutomateScript/index.js +2 -2
- package/src/screens/Unit/components/ButtonWrapper/index.js +3 -3
- package/src/screens/Unit/components/Header/index.js +2 -2
- package/src/screens/Unit/components/SharedUnit/index.js +5 -5
- package/src/screens/UnitSummary/components/AirQuality/index.js +6 -11
- package/src/screens/UnitSummary/components/WaterQuality/Item/index.js +6 -6
- package/src/screens/UnitSummary/index.js +3 -3
- package/src/utils/Apis/axios.js +5 -5
- package/src/utils/Functions/ShortEmail.js +1 -0
- package/src/utils/I18n/translations/en.js +6 -3
- package/src/utils/I18n/translations/vi.js +8 -4
- package/src/utils/bluetooth.js +3 -0
|
@@ -1,18 +1,17 @@
|
|
|
1
|
+
import { useRoute } from '@react-navigation/native';
|
|
1
2
|
import React from 'react';
|
|
3
|
+
import { TouchableWithoutFeedback } from 'react-native';
|
|
2
4
|
import { act, create } from 'react-test-renderer';
|
|
3
|
-
import { SCProvider } from '../../../../context';
|
|
4
|
-
import { mockSCStore } from '../../../../context/mockStore';
|
|
5
|
-
import SetupConfigCondition from '../SetupConfigCondition';
|
|
6
|
-
import { useRoute } from '@react-navigation/native';
|
|
7
|
-
import { ToastBottomHelper } from '../../../../utils/Utils';
|
|
8
5
|
import { Text } from '../../../../commons';
|
|
9
|
-
import GridItem from '../../../../commons/Grid/GridItem';
|
|
10
|
-
import { TouchableWithoutFeedback } from 'react-native';
|
|
11
|
-
import Routes from '../../../../utils/Route';
|
|
12
|
-
import { ModalCustom } from '../../../../commons/Modal';
|
|
13
6
|
import { showAllGridItems } from '../../../../commons/ActionTemplate/__test__/utils';
|
|
14
7
|
import TextInput from '../../../../commons/Form/TextInput';
|
|
15
|
-
import
|
|
8
|
+
import GridItem from '../../../../commons/Grid/GridItem';
|
|
9
|
+
import { ModalCustom } from '../../../../commons/Modal';
|
|
10
|
+
import { SCProvider } from '../../../../context';
|
|
11
|
+
import { mockSCStore } from '../../../../context/mockStore';
|
|
12
|
+
import Routes from '../../../../utils/Route';
|
|
13
|
+
import { ToastBottomHelper } from '../../../../utils/Utils';
|
|
14
|
+
import SetupConfigCondition from '../SetupConfigCondition';
|
|
16
15
|
|
|
17
16
|
jest.mock('react', () => {
|
|
18
17
|
return {
|
|
@@ -57,7 +56,6 @@ describe('Test SetupConfigCondition', () => {
|
|
|
57
56
|
name: 'config name',
|
|
58
57
|
decimal_behind: 0,
|
|
59
58
|
title: 'is below (<)',
|
|
60
|
-
sensor_type: 'air_quality',
|
|
61
59
|
value_evaluations: [
|
|
62
60
|
{
|
|
63
61
|
id: 1,
|
|
@@ -108,6 +106,7 @@ describe('Test SetupConfigCondition', () => {
|
|
|
108
106
|
},
|
|
109
107
|
],
|
|
110
108
|
},
|
|
109
|
+
automate: {},
|
|
111
110
|
sensorData: [],
|
|
112
111
|
},
|
|
113
112
|
});
|
|
@@ -130,9 +129,9 @@ describe('Test SetupConfigCondition', () => {
|
|
|
130
129
|
id: 1,
|
|
131
130
|
name: 'config name',
|
|
132
131
|
title: 'is below (<)',
|
|
133
|
-
sensor_type: 'air_quality',
|
|
134
132
|
value_evaluations: [BOOLEAN_VALUE_EVALUATION_CONFIGURATION],
|
|
135
133
|
},
|
|
134
|
+
automate: {},
|
|
136
135
|
sensorData: [],
|
|
137
136
|
},
|
|
138
137
|
});
|
|
@@ -158,7 +157,6 @@ describe('Test SetupConfigCondition', () => {
|
|
|
158
157
|
id: 1,
|
|
159
158
|
name: 'config name',
|
|
160
159
|
title: 'is below (<)',
|
|
161
|
-
sensor_type: 'air_quality',
|
|
162
160
|
value_evaluations: [BOOLEAN_VALUE_EVALUATION_CONFIGURATION],
|
|
163
161
|
},
|
|
164
162
|
sensorData: [],
|
|
@@ -214,8 +212,10 @@ describe('Test SetupConfigCondition', () => {
|
|
|
214
212
|
});
|
|
215
213
|
expect(modal.props.isVisible).toBeFalsy();
|
|
216
214
|
|
|
215
|
+
const modalGridItems = instance.findAllByType(GridItem);
|
|
216
|
+
|
|
217
217
|
await act(async () => {
|
|
218
|
-
|
|
218
|
+
modalGridItems[1].findByType(TouchableWithoutFeedback).props.onPress();
|
|
219
219
|
});
|
|
220
220
|
|
|
221
221
|
const input = instance.findByType(TextInput);
|
|
@@ -249,7 +249,6 @@ describe('Test SetupConfigCondition', () => {
|
|
|
249
249
|
name: 'config name',
|
|
250
250
|
decimal_behind: 0,
|
|
251
251
|
title: 'is below (<)',
|
|
252
|
-
sensor_type: 'air_quality',
|
|
253
252
|
},
|
|
254
253
|
automate: {},
|
|
255
254
|
},
|
|
@@ -286,4 +285,44 @@ describe('Test SetupConfigCondition', () => {
|
|
|
286
285
|
'Please enter a number and select a condition'
|
|
287
286
|
);
|
|
288
287
|
});
|
|
288
|
+
|
|
289
|
+
it('Test render when have input number but not select condition', async () => {
|
|
290
|
+
await testConditionValue(
|
|
291
|
+
'123',
|
|
292
|
+
'Please enter a number and select a condition'
|
|
293
|
+
);
|
|
294
|
+
});
|
|
295
|
+
|
|
296
|
+
it('Test render when have input empty', async () => {
|
|
297
|
+
await testConditionValue(
|
|
298
|
+
'',
|
|
299
|
+
'Please enter a number and select a condition'
|
|
300
|
+
);
|
|
301
|
+
});
|
|
302
|
+
|
|
303
|
+
it('Test render when no value evaluations', async () => {
|
|
304
|
+
useRoute.mockReturnValue({
|
|
305
|
+
params: {
|
|
306
|
+
config: {
|
|
307
|
+
id: 1,
|
|
308
|
+
name: 'config name',
|
|
309
|
+
title: 'is below (<)',
|
|
310
|
+
sensor_type: 'air_quality',
|
|
311
|
+
value_evaluations: [],
|
|
312
|
+
},
|
|
313
|
+
automate: {},
|
|
314
|
+
sensorData: [],
|
|
315
|
+
},
|
|
316
|
+
});
|
|
317
|
+
await act(async () => {
|
|
318
|
+
tree = await create(wrapComponent());
|
|
319
|
+
});
|
|
320
|
+
const instance = tree.root;
|
|
321
|
+
|
|
322
|
+
const gridItems = instance.findAllByType(GridItem);
|
|
323
|
+
expect(gridItems).toHaveLength(1);
|
|
324
|
+
expect(gridItems[0].findByType(Text).props.children).toEqual(
|
|
325
|
+
'Customize conditions'
|
|
326
|
+
);
|
|
327
|
+
});
|
|
289
328
|
});
|
|
@@ -69,6 +69,35 @@ describe('Test SetupScriptNotify', () => {
|
|
|
69
69
|
expect(spyToast).toHaveBeenCalled();
|
|
70
70
|
});
|
|
71
71
|
|
|
72
|
+
it('SetupScriptNotify onPress create script notify success with multi unit', async () => {
|
|
73
|
+
route.params.unitId = null;
|
|
74
|
+
route.params.multiUnit = { id: 1 };
|
|
75
|
+
const spyToast = jest.spyOn(ToastBottomHelper, 'success');
|
|
76
|
+
mock.onPost(API.AUTOMATE.ADD_SCRIPT_NOTIFY(1)).reply(200);
|
|
77
|
+
await act(async () => {
|
|
78
|
+
tree = await renderer.create(wrapComponent(route));
|
|
79
|
+
});
|
|
80
|
+
const instance = tree.root;
|
|
81
|
+
const inputs = instance.findAllByType(_TextInput);
|
|
82
|
+
expect(inputs).toHaveLength(2);
|
|
83
|
+
|
|
84
|
+
await act(async () => {
|
|
85
|
+
inputs[0].props.onChange('Title');
|
|
86
|
+
});
|
|
87
|
+
const touchable = instance.findAllByType(TouchableWithoutFeedback);
|
|
88
|
+
await act(async () => {
|
|
89
|
+
touchable[0].props.onPress();
|
|
90
|
+
});
|
|
91
|
+
await act(async () => {
|
|
92
|
+
inputs[1].props.onChange('Message');
|
|
93
|
+
});
|
|
94
|
+
const button = instance.findByType(BottomButtonView);
|
|
95
|
+
await act(async () => {
|
|
96
|
+
button.props.onPressMain();
|
|
97
|
+
});
|
|
98
|
+
expect(spyToast).toHaveBeenCalled();
|
|
99
|
+
});
|
|
100
|
+
|
|
72
101
|
it('SetupScriptNotify onPress create script notify error', async () => {
|
|
73
102
|
const spyToast = jest.spyOn(ToastBottomHelper, 'error');
|
|
74
103
|
mock.onPost(API.AUTOMATE.ADD_SCRIPT_NOTIFY(1)).reply(400);
|
|
@@ -1,22 +1,22 @@
|
|
|
1
|
+
import { useNavigation } from '@react-navigation/native';
|
|
1
2
|
import React, { useCallback, useState } from 'react';
|
|
2
3
|
import { View } from 'react-native';
|
|
3
|
-
import
|
|
4
|
+
import ItemAutomate from '../../../commons/Automate/ItemAutomate';
|
|
4
5
|
import { HeaderCustom } from '../../../commons/Header';
|
|
5
|
-
import styles from './styles/AddNewAutoSmartStyles';
|
|
6
6
|
import Text from '../../../commons/Text';
|
|
7
|
-
import ItemAutomate from '../../../commons/Automate/ItemAutomate';
|
|
8
7
|
import { useTranslations } from '../../../hooks/Common/useTranslations';
|
|
9
8
|
import Routes from '../../../utils/Route';
|
|
9
|
+
import styles from './styles/AddNewAutoSmartStyles';
|
|
10
|
+
import { AUTOMATE_TYPE } from '../../../configs/Constants';
|
|
10
11
|
|
|
11
12
|
const AddTypeSmart = ({ smartTypes, route }) => {
|
|
12
13
|
const t = useTranslations();
|
|
13
14
|
const { navigate, goBack } = useNavigation();
|
|
14
15
|
const { automate = {}, closeScreen } = route?.params || {};
|
|
16
|
+
const { id, unit, type } = automate;
|
|
15
17
|
|
|
16
18
|
const [selectedIndex, setSelectedIndex] = useState(
|
|
17
|
-
|
|
18
|
-
? smartTypes.findIndex((obj) => obj.type === automate.type)
|
|
19
|
-
: -1
|
|
19
|
+
id ? smartTypes.findIndex((obj) => obj.type === type) : -1
|
|
20
20
|
);
|
|
21
21
|
|
|
22
22
|
const handleOnContinue = useCallback(
|
|
@@ -27,17 +27,18 @@ const AddTypeSmart = ({ smartTypes, route }) => {
|
|
|
27
27
|
...automate,
|
|
28
28
|
type: dataAutomate?.type,
|
|
29
29
|
},
|
|
30
|
+
unitId: unit,
|
|
30
31
|
closeScreen: closeScreen,
|
|
31
32
|
};
|
|
32
33
|
|
|
33
|
-
if (!
|
|
34
|
+
if (!unit && dataAutomate.type === AUTOMATE_TYPE.VALUE_CHANGE) {
|
|
34
35
|
navigate(Routes.SelectUnit, params);
|
|
35
36
|
return;
|
|
36
37
|
}
|
|
37
38
|
|
|
38
39
|
navigate(dataAutomate.route, params);
|
|
39
40
|
},
|
|
40
|
-
[smartTypes, automate, closeScreen, navigate]
|
|
41
|
+
[smartTypes, automate, unit, closeScreen, navigate]
|
|
41
42
|
);
|
|
42
43
|
|
|
43
44
|
const onSelectType = (index) => {
|
|
@@ -50,7 +51,7 @@ const AddTypeSmart = ({ smartTypes, route }) => {
|
|
|
50
51
|
<HeaderCustom isShowClose onClose={goBack} />
|
|
51
52
|
<View style={styles.container}>
|
|
52
53
|
<Text semibold type={'H2'} style={styles.titleCreate}>
|
|
53
|
-
{
|
|
54
|
+
{id ? t('update_smart') : t('create_smart')}
|
|
54
55
|
</Text>
|
|
55
56
|
<Text type={'Body'} style={styles.titleChoose}>
|
|
56
57
|
{t('choose_the_automation_method_you_want')}
|
|
@@ -62,7 +63,6 @@ const AddTypeSmart = ({ smartTypes, route }) => {
|
|
|
62
63
|
isSelected={selectedIndex === index}
|
|
63
64
|
key={item?.type?.toString()}
|
|
64
65
|
index={index}
|
|
65
|
-
selectedIndex={selectedIndex}
|
|
66
66
|
setSelectedIndex={onSelectType}
|
|
67
67
|
/>
|
|
68
68
|
))}
|
|
@@ -46,6 +46,7 @@ describe('test AddNewAutoSmart', () => {
|
|
|
46
46
|
{
|
|
47
47
|
automate: { unit: 1, type: 'value_change' },
|
|
48
48
|
closeScreen: undefined,
|
|
49
|
+
unitId: 1,
|
|
49
50
|
}
|
|
50
51
|
);
|
|
51
52
|
});
|
|
@@ -65,6 +66,7 @@ describe('test AddNewAutoSmart', () => {
|
|
|
65
66
|
expect(global.mockedNavigate).toHaveBeenCalledWith(Routes.SetSchedule, {
|
|
66
67
|
automate: { type: 'schedule', unit: 1 },
|
|
67
68
|
closeScreen: undefined,
|
|
69
|
+
unitId: 1,
|
|
68
70
|
});
|
|
69
71
|
});
|
|
70
72
|
});
|
|
@@ -9,12 +9,14 @@ import styles from './InputNameStyles';
|
|
|
9
9
|
import { useTranslations } from '../../../hooks/Common/useTranslations';
|
|
10
10
|
import { axiosPost, axiosPut } from '../../../utils/Apis/axios';
|
|
11
11
|
import NewActionWrapper from '../../Automate/AddNewAction/NewActionWrapper';
|
|
12
|
+
import Routes from '../../../utils/Route';
|
|
12
13
|
|
|
13
14
|
const InputName = ({ title, placeholder }) => {
|
|
14
|
-
const { automate, closeScreen } = useRoute().params;
|
|
15
|
+
const { automate = {}, closeScreen } = useRoute().params;
|
|
16
|
+
const { id: automateNameId, name: automateName } = automate;
|
|
15
17
|
const t = useTranslations();
|
|
16
18
|
const { navigate } = useNavigation();
|
|
17
|
-
const [name, setName] = useState(
|
|
19
|
+
const [name, setName] = useState(automateName);
|
|
18
20
|
const [processing, setProcessing] = useState(false);
|
|
19
21
|
const handleContinue = useCallback(async () => {
|
|
20
22
|
if (processing) {
|
|
@@ -29,21 +31,22 @@ const InputName = ({ title, placeholder }) => {
|
|
|
29
31
|
name: name,
|
|
30
32
|
};
|
|
31
33
|
|
|
32
|
-
const { success, data } =
|
|
33
|
-
? await axiosPut(API.AUTOMATE.UPDATE_AUTOMATE(
|
|
34
|
+
const { success, data } = automateNameId
|
|
35
|
+
? await axiosPut(API.AUTOMATE.UPDATE_AUTOMATE(automateNameId), params)
|
|
34
36
|
: await axiosPost(API.AUTOMATE.CREATE_AUTOMATE(), params);
|
|
35
37
|
|
|
36
38
|
if (success) {
|
|
37
39
|
navigate({
|
|
38
|
-
name:
|
|
40
|
+
name: Routes.ScriptDetail,
|
|
39
41
|
merge: true,
|
|
40
42
|
params: {
|
|
41
|
-
|
|
43
|
+
preAutomate: data,
|
|
44
|
+
closeScreen: closeScreen,
|
|
42
45
|
},
|
|
43
46
|
});
|
|
44
47
|
}
|
|
45
48
|
setProcessing(false);
|
|
46
|
-
}, [processing, automate, name, navigate, closeScreen]);
|
|
49
|
+
}, [processing, automate, name, automateNameId, navigate, closeScreen]);
|
|
47
50
|
|
|
48
51
|
return (
|
|
49
52
|
<NewActionWrapper
|
|
@@ -1,27 +1,28 @@
|
|
|
1
|
-
import React, { useState, useCallback, useMemo, useEffect } from 'react';
|
|
2
|
-
import { View, TouchableOpacity } from 'react-native';
|
|
3
|
-
import DraggableFlatList from 'react-native-draggable-flatlist';
|
|
4
1
|
import { useNavigation, useRoute } from '@react-navigation/native';
|
|
2
|
+
import React, { useCallback, useEffect, useMemo, useState } from 'react';
|
|
3
|
+
import { TouchableOpacity, View } from 'react-native';
|
|
4
|
+
import DraggableFlatList from 'react-native-draggable-flatlist';
|
|
5
5
|
import ParsedText from 'react-native-parsed-text';
|
|
6
6
|
|
|
7
|
+
import { GestureHandlerRootView } from 'react-native-gesture-handler';
|
|
8
|
+
import Close from '../../../../assets/images/Close.svg';
|
|
9
|
+
import Delay from '../../../../assets/images/Delay.svg';
|
|
10
|
+
import Notify from '../../../../assets/images/Notify.svg';
|
|
11
|
+
import Rearrange from '../../../../assets/images/Rearrange.svg';
|
|
12
|
+
import { FullLoading } from '../../../commons';
|
|
13
|
+
import FImage from '../../../commons/FImage';
|
|
7
14
|
import { HeaderCustom } from '../../../commons/Header';
|
|
8
|
-
import {
|
|
15
|
+
import { ModalBottom, ModalCustom } from '../../../commons/Modal';
|
|
9
16
|
import Text from '../../../commons/Text';
|
|
10
|
-
import styles from './Styles/indexStyles';
|
|
11
17
|
import { API, Colors } from '../../../configs';
|
|
12
|
-
import FImage from '../../../commons/FImage';
|
|
13
|
-
import Rearrange from '../../../../assets/images/Rearrange.svg';
|
|
14
|
-
import Notify from '../../../../assets/images/Notify.svg';
|
|
15
|
-
import Delay from '../../../../assets/images/Delay.svg';
|
|
16
|
-
import Close from '../../../../assets/images/Close.svg';
|
|
17
|
-
import { axiosDelete, axiosPut } from '../../../utils/Apis/axios';
|
|
18
|
-
import { ModalBottom, ModalCustom } from '../../../commons/Modal';
|
|
19
|
-
import { ToastBottomHelper } from '../../../utils/Utils';
|
|
20
18
|
import { AccessibilityLabel } from '../../../configs/Constants';
|
|
19
|
+
import { useTranslations } from '../../../hooks/Common/useTranslations';
|
|
20
|
+
import { axiosDelete, axiosPut } from '../../../utils/Apis/axios';
|
|
21
21
|
import Routes from '../../../utils/Route';
|
|
22
|
+
import { ToastBottomHelper } from '../../../utils/Utils';
|
|
23
|
+
import styles from './Styles/indexStyles';
|
|
22
24
|
import UpdateDelayScript from './UpdateDelayScript';
|
|
23
25
|
import UpdateNotifyScript from './UpdateNotifyScript';
|
|
24
|
-
import { FullLoading } from '../../../commons';
|
|
25
26
|
|
|
26
27
|
const EditActionsList = () => {
|
|
27
28
|
const t = useTranslations();
|
|
@@ -134,7 +135,8 @@ const EditActionsList = () => {
|
|
|
134
135
|
</View>
|
|
135
136
|
);
|
|
136
137
|
const renderItem = useCallback(
|
|
137
|
-
({ item,
|
|
138
|
+
({ item, getIndex, drag, isActive }) => {
|
|
139
|
+
const index = getIndex();
|
|
138
140
|
const paddedIndex = (index + 1).toString().padStart(2, '0');
|
|
139
141
|
const { action_script, notify_script, delay_script } = item;
|
|
140
142
|
if (action_script) {
|
|
@@ -354,7 +356,7 @@ const EditActionsList = () => {
|
|
|
354
356
|
}, [itemRemove, t]);
|
|
355
357
|
|
|
356
358
|
return (
|
|
357
|
-
<
|
|
359
|
+
<GestureHandlerRootView style={styles.wrap}>
|
|
358
360
|
<HeaderCustom title={t('edit_actions_list')} onGoBack={onCancel} />
|
|
359
361
|
<View style={styles.wrapContent}>
|
|
360
362
|
<Text type="Body" color={Colors.Gray8}>
|
|
@@ -393,7 +395,7 @@ const EditActionsList = () => {
|
|
|
393
395
|
<View style={styles.modalHeader}>{renderAction}</View>
|
|
394
396
|
</View>
|
|
395
397
|
</ModalCustom>
|
|
396
|
-
</
|
|
398
|
+
</GestureHandlerRootView>
|
|
397
399
|
);
|
|
398
400
|
};
|
|
399
401
|
|
|
@@ -25,9 +25,12 @@ const MultiUnits = () => {
|
|
|
25
25
|
const isFocused = useIsFocused();
|
|
26
26
|
const { navigate } = useNavigation();
|
|
27
27
|
const { params = {}, name: currentRouteName } = useRoute();
|
|
28
|
-
const { unit
|
|
28
|
+
const { unit = {} } = params;
|
|
29
|
+
const { id: unitId, name } = unit;
|
|
29
30
|
const [data, setData] = useState([]);
|
|
30
31
|
const permissions = useBackendPermission();
|
|
32
|
+
const { smart_script_for_multi_unit, max_automations_per_unit } =
|
|
33
|
+
permissions || {};
|
|
31
34
|
|
|
32
35
|
const [tabActive, setTabActive] = useState(AUTOMATE_TABS.SCENARIO);
|
|
33
36
|
|
|
@@ -37,8 +40,8 @@ const MultiUnits = () => {
|
|
|
37
40
|
|
|
38
41
|
const getData = useCallback(
|
|
39
42
|
async (fetchParams) => {
|
|
40
|
-
if (
|
|
41
|
-
await fetchWithCache(API.UNIT.AUTOMATE(
|
|
43
|
+
if (unitId) {
|
|
44
|
+
await fetchWithCache(API.UNIT.AUTOMATE(unitId), {}, (response) => {
|
|
42
45
|
const { success, data: automateData } = response;
|
|
43
46
|
success && setData(automateData);
|
|
44
47
|
});
|
|
@@ -50,7 +53,7 @@ const MultiUnits = () => {
|
|
|
50
53
|
success && setData(automateData);
|
|
51
54
|
}
|
|
52
55
|
},
|
|
53
|
-
[
|
|
56
|
+
[unitId]
|
|
54
57
|
);
|
|
55
58
|
|
|
56
59
|
const onPressTabName = (tab) => () => {
|
|
@@ -62,32 +65,26 @@ const MultiUnits = () => {
|
|
|
62
65
|
navigate(Routes.UnitStack, {
|
|
63
66
|
screen: Routes.ScriptDetail,
|
|
64
67
|
params: {
|
|
65
|
-
id: item?.id,
|
|
66
|
-
unitId: unit?.id,
|
|
67
68
|
preAutomate: item,
|
|
68
69
|
},
|
|
69
70
|
});
|
|
70
71
|
},
|
|
71
|
-
[navigate
|
|
72
|
+
[navigate]
|
|
72
73
|
);
|
|
73
74
|
|
|
74
|
-
useEffect(() => {
|
|
75
|
-
newAutomate && onPressItem(newAutomate);
|
|
76
|
-
}, [newAutomate, onPressItem]);
|
|
77
|
-
|
|
78
75
|
const handleOnAddNew = useCallback(() => {
|
|
79
|
-
if (
|
|
80
|
-
if (
|
|
76
|
+
if (unitId) {
|
|
77
|
+
if (max_automations_per_unit <= data.length) {
|
|
81
78
|
ToastBottomHelper.error(
|
|
82
79
|
t('reach_max_automations_per_unit', {
|
|
83
|
-
length:
|
|
80
|
+
length: max_automations_per_unit,
|
|
84
81
|
}),
|
|
85
82
|
'',
|
|
86
83
|
7000
|
|
87
84
|
);
|
|
88
85
|
return;
|
|
89
86
|
}
|
|
90
|
-
} else if (!
|
|
87
|
+
} else if (!smart_script_for_multi_unit) {
|
|
91
88
|
ToastBottomHelper.error(
|
|
92
89
|
t('no_permission_smart_script_for_multi_unit'),
|
|
93
90
|
'',
|
|
@@ -99,7 +96,7 @@ const MultiUnits = () => {
|
|
|
99
96
|
navigate(Routes.UnitStack, {
|
|
100
97
|
screen: Routes.ScenarioName,
|
|
101
98
|
params: {
|
|
102
|
-
automate: { type: AUTOMATE_TYPE.ONE_TAP, unit:
|
|
99
|
+
automate: { type: AUTOMATE_TYPE.ONE_TAP, unit: unitId },
|
|
103
100
|
closeScreen: currentRouteName,
|
|
104
101
|
},
|
|
105
102
|
});
|
|
@@ -107,9 +104,9 @@ const MultiUnits = () => {
|
|
|
107
104
|
}
|
|
108
105
|
|
|
109
106
|
navigate(Routes.UnitStack, {
|
|
110
|
-
screen: Routes.
|
|
107
|
+
screen: Routes.AddAutomationTypeSmart,
|
|
111
108
|
params: {
|
|
112
|
-
automate: { unit:
|
|
109
|
+
automate: { unit: unitId },
|
|
113
110
|
closeScreen: currentRouteName,
|
|
114
111
|
},
|
|
115
112
|
});
|
|
@@ -117,11 +114,11 @@ const MultiUnits = () => {
|
|
|
117
114
|
currentRouteName,
|
|
118
115
|
data.length,
|
|
119
116
|
navigate,
|
|
120
|
-
|
|
121
|
-
|
|
117
|
+
max_automations_per_unit,
|
|
118
|
+
smart_script_for_multi_unit,
|
|
122
119
|
t,
|
|
123
120
|
tabActive,
|
|
124
|
-
|
|
121
|
+
unitId,
|
|
125
122
|
]);
|
|
126
123
|
|
|
127
124
|
const renderContent = useMemo(() => {
|
|
@@ -166,7 +163,7 @@ const MultiUnits = () => {
|
|
|
166
163
|
return (
|
|
167
164
|
<View style={styles.wrap}>
|
|
168
165
|
<WrapHeaderScrollable
|
|
169
|
-
title={
|
|
166
|
+
title={unitId ? name : t('multi_units_automate')}
|
|
170
167
|
headerAniStyle={styles.headerAniStyle}
|
|
171
168
|
>
|
|
172
169
|
<View style={styles.wrapContent}>
|
|
@@ -81,7 +81,8 @@ describe('test OneTap', () => {
|
|
|
81
81
|
merge: true,
|
|
82
82
|
name: Routes.ScriptDetail,
|
|
83
83
|
params: {
|
|
84
|
-
|
|
84
|
+
closeScreen: Routes.ScriptDetail,
|
|
85
|
+
preAutomate: {
|
|
85
86
|
id: 1,
|
|
86
87
|
script: { id: 1, name: 'William Miller' },
|
|
87
88
|
type: 'one_tap',
|
|
@@ -122,8 +123,13 @@ describe('test OneTap', () => {
|
|
|
122
123
|
let route = {
|
|
123
124
|
params: {
|
|
124
125
|
closeScreen: Routes.ScriptDetail,
|
|
126
|
+
automate: {
|
|
127
|
+
unit: 1,
|
|
128
|
+
},
|
|
129
|
+
unitId: 1,
|
|
125
130
|
},
|
|
126
131
|
};
|
|
132
|
+
|
|
127
133
|
mock.onPost(API.AUTOMATE.CREATE_AUTOMATE()).reply(400);
|
|
128
134
|
await act(async () => {
|
|
129
135
|
tree = await create(wrapComponent(route));
|
|
@@ -136,6 +142,10 @@ describe('test OneTap', () => {
|
|
|
136
142
|
await act(async () => {
|
|
137
143
|
header.props.onPress();
|
|
138
144
|
});
|
|
139
|
-
expect(global.mockedNavigate).toHaveBeenCalledWith(Routes.ScriptDetail
|
|
145
|
+
expect(global.mockedNavigate).toHaveBeenCalledWith(Routes.ScriptDetail, {
|
|
146
|
+
unitId: 1,
|
|
147
|
+
automate: { unit: 1 },
|
|
148
|
+
closeScreen: Routes.ScriptDetail,
|
|
149
|
+
});
|
|
140
150
|
});
|
|
141
151
|
});
|
|
@@ -111,6 +111,10 @@ describe('test OneTap', () => {
|
|
|
111
111
|
let route = {
|
|
112
112
|
params: {
|
|
113
113
|
closeScreen: Routes.ScriptDetail,
|
|
114
|
+
automate: {
|
|
115
|
+
unit: 1,
|
|
116
|
+
},
|
|
117
|
+
unitId: 1,
|
|
114
118
|
},
|
|
115
119
|
};
|
|
116
120
|
mock.onPost(API.AUTOMATE.CREATE_AUTOMATE()).reply(400);
|
|
@@ -125,6 +129,10 @@ describe('test OneTap', () => {
|
|
|
125
129
|
await act(async () => {
|
|
126
130
|
header.props.onPress();
|
|
127
131
|
});
|
|
128
|
-
expect(global.mockedNavigate).toHaveBeenCalledWith(Routes.ScriptDetail
|
|
132
|
+
expect(global.mockedNavigate).toHaveBeenCalledWith(Routes.ScriptDetail, {
|
|
133
|
+
unitId: 1,
|
|
134
|
+
automate: { unit: 1 },
|
|
135
|
+
closeScreen: 'ScriptDetail',
|
|
136
|
+
});
|
|
129
137
|
});
|
|
130
138
|
});
|
|
@@ -11,7 +11,7 @@ import Event from '../../../../../assets/images/Event.svg';
|
|
|
11
11
|
import Notify from '../../../../../assets/images/Notify.svg';
|
|
12
12
|
import Delay from '../../../../../assets/images/Delay.svg';
|
|
13
13
|
import { TouchableOpacity } from 'react-native';
|
|
14
|
-
import
|
|
14
|
+
import { IconOutline } from '@ant-design/icons-react-native';
|
|
15
15
|
import { Text } from '../../../../commons';
|
|
16
16
|
import Routes from '../../../../utils/Route';
|
|
17
17
|
import AccessibilityLabel from '../../../../configs/AccessibilityLabel';
|
|
@@ -40,6 +40,7 @@ const AddActionScript = memo(
|
|
|
40
40
|
closeScreen: currentScreenName,
|
|
41
41
|
numberActionCanAdd:
|
|
42
42
|
max_actions_per_automation - numberActionAdded,
|
|
43
|
+
routeName: unit ? null : Routes.SelectControlDevices,
|
|
43
44
|
};
|
|
44
45
|
|
|
45
46
|
navigate(
|
|
@@ -54,10 +55,17 @@ const AddActionScript = memo(
|
|
|
54
55
|
image: <Notify />,
|
|
55
56
|
onClick: () => {
|
|
56
57
|
setIsVisible(false);
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
58
|
+
if (unit) {
|
|
59
|
+
navigate(Routes.SetupScriptNotify, {
|
|
60
|
+
automate,
|
|
61
|
+
unitId: unit,
|
|
62
|
+
});
|
|
63
|
+
} else {
|
|
64
|
+
navigate(Routes.SelectUnit, {
|
|
65
|
+
automate,
|
|
66
|
+
routeName: Routes.SetupScriptNotify,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
61
69
|
},
|
|
62
70
|
},
|
|
63
71
|
{
|
|
@@ -109,7 +117,7 @@ const AddActionScript = memo(
|
|
|
109
117
|
<View style={styles.wapItem}>
|
|
110
118
|
<View style={styles.imageItem}>{item.image}</View>
|
|
111
119
|
<Text style={styles.textItem}>{item.text}</Text>
|
|
112
|
-
<
|
|
120
|
+
<IconOutline name="right" />
|
|
113
121
|
</View>
|
|
114
122
|
</TouchableOpacity>
|
|
115
123
|
</View>
|
|
@@ -14,14 +14,11 @@ const RenameScript = ({ automate, setAutomate, isVisible, setIsVisible }) => {
|
|
|
14
14
|
const transY = useKeyboardAnimated();
|
|
15
15
|
|
|
16
16
|
const renameScript = useCallback(async () => {
|
|
17
|
-
const { success
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
name: inputName,
|
|
21
|
-
}
|
|
22
|
-
);
|
|
17
|
+
const { success } = await axiosPatch(API.AUTOMATE.SCRIPT(automate.id), {
|
|
18
|
+
name: inputName,
|
|
19
|
+
});
|
|
23
20
|
if (success) {
|
|
24
|
-
setAutomate((prev) => ({ ...prev, name:
|
|
21
|
+
setAutomate((prev) => ({ ...prev, name: inputName }));
|
|
25
22
|
ToastBottomHelper.success(t('rename_successfully'));
|
|
26
23
|
} else {
|
|
27
24
|
ToastBottomHelper.error(t('rename_failed'));
|