@eohjsc/react-native-smart-city 0.3.32 → 0.3.33
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/package.json +1 -1
- package/src/commons/Action/ItemQuickAction.js +18 -1
- package/src/commons/Action/__test__/ItemQuickAction.test.js +18 -2
- package/src/commons/ActionGroup/NumberUpDownActionTemplate.js +5 -2
- package/src/commons/ActionGroup/OnOffTemplate/index.js +28 -10
- package/src/commons/ActionGroup/OptionsDropdownActionTemplate.js +15 -8
- package/src/commons/ActionGroup/StatesGridActionTemplate.js +19 -5
- package/src/commons/ActionTemplate/OnOffButtonAction.js +14 -5
- package/src/commons/ActionTemplate/__test__/OnOffButtonAction.test.js +23 -2
- package/src/commons/ActionTemplate/__test__/index.test.js +2 -0
- package/src/commons/ActionTemplate/index.js +1 -0
- package/src/commons/Automate/ItemAutomate.js +10 -1
- package/src/commons/OneTapTemplate/NumberUpDownActionTemplate.js +1 -1
- package/src/commons/Tabbar/__test__/index.test.js +97 -0
- package/src/configs/AccessibilityLabel.js +3 -0
- package/src/hoc/__test__/withRemoteControl.test.js +24 -0
- package/src/hooks/Common/__test__/useAndroidTranslucentStatusBar.test.js +55 -0
- package/src/hooks/Common/useDevicesStatus.js +19 -15
- package/src/hooks/__test__/useInitDeepLink.test.js +28 -0
- package/src/hooks/useReceiveNotifications.js +2 -4
- package/src/screens/AddNewAction/SelectAction.js +10 -1
- package/src/screens/ScriptDetail/__test__/index.test.js +35 -34
- package/src/screens/ScriptDetail/index.js +19 -10
- package/src/screens/Sharing/Components/{SensorItem.js → DeviceItem.js} +14 -20
- package/src/screens/Sharing/Components/Styles/{SensorItemStyles.js → DeviceItemStyles.js} +0 -0
- package/src/screens/Sharing/Components/__test__/{SensorItem.test.js → DeviceItem.test.js} +6 -6
- package/src/screens/Sharing/Components/index.js +2 -2
- package/src/screens/Sharing/SelectPermission.js +63 -68
- package/src/screens/Sharing/Styles/SelectPermissionStyles.js +2 -2
- package/src/screens/Sharing/__test__/SelectPermission.test.js +12 -12
- package/src/utils/Utils.js +6 -7
|
@@ -10,16 +10,16 @@ import {
|
|
|
10
10
|
import { useNavigation } from '@react-navigation/native';
|
|
11
11
|
import { useTranslations } from '../../hooks/Common/useTranslations';
|
|
12
12
|
|
|
13
|
-
import { API, Colors } from '../../configs';
|
|
14
13
|
import ViewButtonBottom from '../../commons/ViewButtonBottom';
|
|
15
14
|
import Text from '../../commons/Text';
|
|
15
|
+
import { DeviceItem, TitleCheckBox } from './Components';
|
|
16
|
+
import styles from './Styles/SelectPermissionStyles';
|
|
17
|
+
|
|
16
18
|
import { axiosGet, axiosPost } from '../../utils/Apis/axios';
|
|
17
19
|
import { object_Ids } from '../../utils/Utils';
|
|
18
|
-
|
|
19
20
|
import Routes from '../../utils/Route';
|
|
20
|
-
import { SensorItem, TitleCheckBox } from './Components';
|
|
21
|
-
import styles from './Styles/SelectPermissionStyles';
|
|
22
21
|
|
|
22
|
+
import { API, Colors } from '../../configs';
|
|
23
23
|
import { AccessibilityLabel } from '../../configs/Constants';
|
|
24
24
|
|
|
25
25
|
let dataStationTemp = [];
|
|
@@ -30,7 +30,7 @@ const SelectPermission = ({ route }) => {
|
|
|
30
30
|
const navigation = useNavigation();
|
|
31
31
|
const [dataStations, setDataStations] = useState([]);
|
|
32
32
|
const [isTickAllDevices, setIsTickAllDevices] = useState(false);
|
|
33
|
-
const [
|
|
33
|
+
const [expandedItemIds, setExpandedItemIds] = useState([]);
|
|
34
34
|
const [loading, setLoading] = useState(true);
|
|
35
35
|
const [hasDataChecked, setHasDataChecked] = useState(false);
|
|
36
36
|
const [dataDeviceShared, setDataDeviceShared] = useState([]);
|
|
@@ -47,9 +47,9 @@ const SelectPermission = ({ route }) => {
|
|
|
47
47
|
isChecked,
|
|
48
48
|
}));
|
|
49
49
|
for (let station in data) {
|
|
50
|
-
for (let item in data[station].
|
|
51
|
-
const itemTemp = data[station].
|
|
52
|
-
data[station].
|
|
50
|
+
for (let item in data[station].devices) {
|
|
51
|
+
const itemTemp = data[station].devices[item];
|
|
52
|
+
data[station].devices[item] = {
|
|
53
53
|
...itemTemp,
|
|
54
54
|
isChecked,
|
|
55
55
|
actions: itemTemp.actions.map((i) => ({
|
|
@@ -68,17 +68,11 @@ const SelectPermission = ({ route }) => {
|
|
|
68
68
|
const data = [...dataStationTemp];
|
|
69
69
|
|
|
70
70
|
const index = data.findIndex((item) => item.id === idGroup);
|
|
71
|
-
|
|
71
|
+
|
|
72
72
|
data[index] = {
|
|
73
73
|
...data[index],
|
|
74
74
|
isChecked,
|
|
75
|
-
devices: data[index]?.
|
|
76
|
-
...i,
|
|
77
|
-
isChecked,
|
|
78
|
-
actions: i.actions.map((j) => ({ ...j, isChecked })),
|
|
79
|
-
read_configs: i.read_configs.map((j) => ({ ...j, isChecked })),
|
|
80
|
-
})),
|
|
81
|
-
sensors: data[index]?.sensors.map((i) => ({
|
|
75
|
+
devices: data[index]?.devices.map((i) => ({
|
|
82
76
|
...i,
|
|
83
77
|
isChecked,
|
|
84
78
|
actions: i.actions.map((j) => ({ ...j, isChecked })),
|
|
@@ -92,8 +86,8 @@ const SelectPermission = ({ route }) => {
|
|
|
92
86
|
|
|
93
87
|
const stationCheck = (data) => {
|
|
94
88
|
for (let station of data) {
|
|
95
|
-
if (station.
|
|
96
|
-
station.isChecked = !station.
|
|
89
|
+
if (station.devices.length) {
|
|
90
|
+
station.isChecked = !station.devices.some((i) => !i.isChecked);
|
|
97
91
|
}
|
|
98
92
|
}
|
|
99
93
|
setIsTickAllDevices(!dataStationTemp.some((i) => !i.isChecked));
|
|
@@ -103,55 +97,66 @@ const SelectPermission = ({ route }) => {
|
|
|
103
97
|
|
|
104
98
|
const onTickedChild = (
|
|
105
99
|
idGroup,
|
|
106
|
-
|
|
100
|
+
deviceId,
|
|
107
101
|
childId,
|
|
108
102
|
isChecked,
|
|
109
103
|
isReadConfig
|
|
110
104
|
) => {
|
|
111
105
|
let data = [...dataStationTemp];
|
|
112
106
|
const group = data.find((i) => i.id === idGroup);
|
|
113
|
-
const
|
|
114
|
-
const child =
|
|
107
|
+
const device = group.devices.find((i) => i.id === deviceId);
|
|
108
|
+
const child = device[`${isReadConfig ? 'read_configs' : 'actions'}`].find(
|
|
115
109
|
(i) => i.id === childId
|
|
116
110
|
);
|
|
117
111
|
|
|
118
112
|
child.isChecked = isChecked;
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
113
|
+
device.isChecked = !(
|
|
114
|
+
device.read_configs.some((i) => !i.isChecked) ||
|
|
115
|
+
device.actions.some((i) => !i.isChecked)
|
|
122
116
|
);
|
|
123
117
|
|
|
124
118
|
stationCheck(data);
|
|
125
119
|
};
|
|
126
120
|
|
|
127
|
-
const
|
|
121
|
+
const onTickedDevice = (idGroup, deviceId, isChecked) => {
|
|
128
122
|
let data = [...dataStationTemp];
|
|
129
123
|
const group = data.find((i) => i.id === idGroup);
|
|
130
|
-
const
|
|
124
|
+
const device = group.devices.find((i) => i.id === deviceId);
|
|
131
125
|
|
|
132
|
-
|
|
126
|
+
device.isChecked = isChecked;
|
|
133
127
|
|
|
134
128
|
stationCheck(data);
|
|
135
129
|
};
|
|
136
130
|
|
|
131
|
+
const toggleDeviceItem = (deviceItem) => () => {
|
|
132
|
+
setExpandedItemIds((ids) => {
|
|
133
|
+
const index = ids.indexOf(deviceItem.id);
|
|
134
|
+
if (index !== -1) {
|
|
135
|
+
return [...ids.slice(0, index), ...ids.slice(index + 1)];
|
|
136
|
+
} else {
|
|
137
|
+
return [...ids, deviceItem.id];
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
};
|
|
141
|
+
|
|
137
142
|
const autoCheckedGroup = useCallback(async () => {
|
|
138
143
|
if (isUpdateSharedDevice) {
|
|
139
144
|
if (hasDataChecked) {
|
|
140
145
|
const stationIds = object_Ids(dataDeviceShared)?.stationIds;
|
|
141
|
-
const
|
|
146
|
+
const deviceIds = object_Ids(dataDeviceShared)?.deviceIds;
|
|
142
147
|
const actionIds = object_Ids(dataDeviceShared)?.actionIds;
|
|
143
148
|
const configIds = object_Ids(dataDeviceShared)?.configIds;
|
|
144
|
-
const
|
|
149
|
+
const device_checked = [];
|
|
145
150
|
const action_checked = [];
|
|
146
151
|
const config_checked = [];
|
|
147
152
|
const action_temp = [];
|
|
148
153
|
const config_temp = [];
|
|
149
154
|
for (let station in dataStations) {
|
|
150
|
-
for (let item in dataStations[station].
|
|
151
|
-
const itemTemp = dataStations[station].
|
|
152
|
-
dataStations[station].
|
|
155
|
+
for (let item in dataStations[station].devices) {
|
|
156
|
+
const itemTemp = dataStations[station].devices[item];
|
|
157
|
+
dataStations[station].devices[item] = {
|
|
153
158
|
...itemTemp,
|
|
154
|
-
isChecked:
|
|
159
|
+
isChecked: deviceIds.includes(itemTemp?.id),
|
|
155
160
|
actions: itemTemp.actions.map((i) => {
|
|
156
161
|
if (actionIds?.includes(i.id)) {
|
|
157
162
|
action_checked.push(i);
|
|
@@ -173,8 +178,8 @@ const SelectPermission = ({ route }) => {
|
|
|
173
178
|
};
|
|
174
179
|
}),
|
|
175
180
|
};
|
|
176
|
-
if (dataStations[station].
|
|
177
|
-
|
|
181
|
+
if (dataStations[station].devices[item]?.isChecked) {
|
|
182
|
+
device_checked.push(dataStations[station].devices[item]);
|
|
178
183
|
}
|
|
179
184
|
}
|
|
180
185
|
}
|
|
@@ -189,16 +194,16 @@ const SelectPermission = ({ route }) => {
|
|
|
189
194
|
...i,
|
|
190
195
|
isChecked:
|
|
191
196
|
check_action_config() &&
|
|
192
|
-
i?.
|
|
197
|
+
i?.devices?.length === device_checked?.length &&
|
|
193
198
|
stationIds.includes(i.id),
|
|
194
199
|
};
|
|
195
200
|
});
|
|
196
|
-
const
|
|
201
|
+
const deviceIdsDefault = object_Ids(data)?.deviceIds;
|
|
197
202
|
const stationIdsDefault = object_Ids(data)?.stationIds;
|
|
198
203
|
setDataStations(data);
|
|
199
204
|
setIsTickAllDevices(
|
|
200
205
|
check_action_config() &&
|
|
201
|
-
|
|
206
|
+
deviceIdsDefault?.length === deviceIds?.length &&
|
|
202
207
|
stationIdsDefault?.length === stationIds?.length
|
|
203
208
|
);
|
|
204
209
|
setHasDataChecked(false);
|
|
@@ -206,29 +211,28 @@ const SelectPermission = ({ route }) => {
|
|
|
206
211
|
}
|
|
207
212
|
}, [dataDeviceShared, dataStations, hasDataChecked, isUpdateSharedDevice]);
|
|
208
213
|
|
|
209
|
-
const
|
|
210
|
-
const { name = '',
|
|
214
|
+
const GroupDeviceItem = ({ item = {} }) => {
|
|
215
|
+
const { name = '', devices = [], isChecked, id = '' } = item;
|
|
211
216
|
return (
|
|
212
217
|
<View style={styles.viewGroup}>
|
|
213
218
|
<TitleCheckBox
|
|
214
219
|
title={name}
|
|
215
220
|
wrapCheckBoxStyle={styles.checkBoxTile}
|
|
216
221
|
onPress={onTickTitle}
|
|
217
|
-
titleStyle={styles.
|
|
222
|
+
titleStyle={styles.GroupDeviceItem}
|
|
218
223
|
isChecked={isChecked}
|
|
219
224
|
idGroup={id}
|
|
220
225
|
/>
|
|
221
|
-
<View style={styles.
|
|
222
|
-
{
|
|
223
|
-
<
|
|
226
|
+
<View style={styles.wrapDevice}>
|
|
227
|
+
{devices?.map((i, index) => (
|
|
228
|
+
<DeviceItem
|
|
224
229
|
item={i}
|
|
225
230
|
key={i.id}
|
|
226
|
-
isRenderSeparated={index !==
|
|
231
|
+
isRenderSeparated={index !== devices?.length - 1}
|
|
227
232
|
onTickedChild={onTickedChild}
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
setActiveItemId={setActiveItemId}
|
|
233
|
+
onTickedDevice={onTickedDevice}
|
|
234
|
+
isItemExpanded={expandedItemIds.includes(i.id)}
|
|
235
|
+
toggleItem={toggleDeviceItem(i)}
|
|
232
236
|
idGroup={id}
|
|
233
237
|
/>
|
|
234
238
|
))}
|
|
@@ -241,7 +245,7 @@ const SelectPermission = ({ route }) => {
|
|
|
241
245
|
let read_permissions = [],
|
|
242
246
|
control_permissions = [];
|
|
243
247
|
for (let station of dataStationTemp) {
|
|
244
|
-
for (let item of station.
|
|
248
|
+
for (let item of station.devices) {
|
|
245
249
|
let arrIdControlTemp = [],
|
|
246
250
|
arrIdReadTemp = [];
|
|
247
251
|
|
|
@@ -252,21 +256,16 @@ const SelectPermission = ({ route }) => {
|
|
|
252
256
|
i.isChecked && arrIdReadTemp.push(i.id);
|
|
253
257
|
}
|
|
254
258
|
|
|
255
|
-
|
|
259
|
+
arrIdControlTemp.length &&
|
|
256
260
|
control_permissions.push({ id: item.id, values: arrIdControlTemp });
|
|
257
|
-
}
|
|
258
261
|
|
|
259
|
-
|
|
262
|
+
arrIdReadTemp.length &&
|
|
260
263
|
read_permissions.push({ id: item.id, values: arrIdReadTemp });
|
|
261
|
-
}
|
|
262
264
|
|
|
263
|
-
|
|
264
|
-
!
|
|
265
|
-
|
|
266
|
-
item.isChecked
|
|
267
|
-
) {
|
|
265
|
+
!arrIdControlTemp &&
|
|
266
|
+
!arrIdReadTemp &&
|
|
267
|
+
item.isChecked &&
|
|
268
268
|
read_permissions.push({ id: item.id, values: [] });
|
|
269
|
-
}
|
|
270
269
|
}
|
|
271
270
|
}
|
|
272
271
|
if (!read_permissions.length && !control_permissions.length) {
|
|
@@ -286,9 +285,7 @@ const SelectPermission = ({ route }) => {
|
|
|
286
285
|
permissions: { read_permissions, control_permissions },
|
|
287
286
|
is_remove_old_permission: true,
|
|
288
287
|
});
|
|
289
|
-
|
|
290
|
-
navigation.goBack();
|
|
291
|
-
}
|
|
288
|
+
success && navigation.goBack();
|
|
292
289
|
} else {
|
|
293
290
|
navigation.navigate(Routes.SharingInviteMembers, {
|
|
294
291
|
unit,
|
|
@@ -298,7 +295,7 @@ const SelectPermission = ({ route }) => {
|
|
|
298
295
|
};
|
|
299
296
|
|
|
300
297
|
const renderGroupItem = ({ item }) => (
|
|
301
|
-
<
|
|
298
|
+
<GroupDeviceItem key={item.id} item={item} />
|
|
302
299
|
);
|
|
303
300
|
|
|
304
301
|
const renderFlatList = useMemo(() => {
|
|
@@ -326,7 +323,7 @@ const SelectPermission = ({ route }) => {
|
|
|
326
323
|
);
|
|
327
324
|
|
|
328
325
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
329
|
-
}, [dataStations, isTickAllDevices,
|
|
326
|
+
}, [dataStations, isTickAllDevices, expandedItemIds]);
|
|
330
327
|
|
|
331
328
|
useEffect(() => {
|
|
332
329
|
autoCheckedGroup();
|
|
@@ -357,9 +354,7 @@ const SelectPermission = ({ route }) => {
|
|
|
357
354
|
const { success, data } = await axiosGet(
|
|
358
355
|
API.SHARE.UNIT_PERMISSIONS(unit.id)
|
|
359
356
|
);
|
|
360
|
-
|
|
361
|
-
setDataStations(data);
|
|
362
|
-
}
|
|
357
|
+
success && setDataStations(data);
|
|
363
358
|
setLoading(false);
|
|
364
359
|
})();
|
|
365
360
|
}, [dataStations?.length, isUpdateSharedDevice, member?.id, unit]);
|
|
@@ -36,7 +36,7 @@ export default StyleSheet.create({
|
|
|
36
36
|
checkBoxTile: {
|
|
37
37
|
marginLeft: 5,
|
|
38
38
|
},
|
|
39
|
-
|
|
39
|
+
wrapDevice: {
|
|
40
40
|
borderRadius: normalize(20),
|
|
41
41
|
borderWidth: 1,
|
|
42
42
|
borderColor: Colors.Gray4,
|
|
@@ -60,7 +60,7 @@ export default StyleSheet.create({
|
|
|
60
60
|
fontFamily: FONT_PREFIX + '-' + 'Semibold',
|
|
61
61
|
fontStyle: 'normal',
|
|
62
62
|
},
|
|
63
|
-
|
|
63
|
+
GroupDeviceItem: {
|
|
64
64
|
fontSize: 14,
|
|
65
65
|
lineHeight: 22,
|
|
66
66
|
fontWeight: '600',
|
|
@@ -5,7 +5,7 @@ import { create } from 'react-test-renderer';
|
|
|
5
5
|
import MockAdapter from 'axios-mock-adapter';
|
|
6
6
|
|
|
7
7
|
import SelectPermission from '../SelectPermission';
|
|
8
|
-
import {
|
|
8
|
+
import { DeviceItem, TitleCheckBox } from '../Components';
|
|
9
9
|
import { ViewButtonBottom } from '../../../commons';
|
|
10
10
|
import { SCProvider } from '../../../context';
|
|
11
11
|
import { mockSCStore } from '../../../context/mockStore';
|
|
@@ -44,11 +44,11 @@ const wrapComponent = (route) => (
|
|
|
44
44
|
describe('Test SelectPermission', () => {
|
|
45
45
|
let tree;
|
|
46
46
|
let route = { params: { unit: null } };
|
|
47
|
-
let
|
|
47
|
+
let listDevices = [
|
|
48
48
|
{
|
|
49
49
|
id: 204,
|
|
50
|
-
name: '
|
|
51
|
-
|
|
50
|
+
name: 'device',
|
|
51
|
+
devices: [
|
|
52
52
|
{
|
|
53
53
|
id: 123,
|
|
54
54
|
actions: [{ id: 136, name: 'action 1' }],
|
|
@@ -79,7 +79,7 @@ describe('Test SelectPermission', () => {
|
|
|
79
79
|
|
|
80
80
|
function mocSetdata() {
|
|
81
81
|
useState.mockImplementationOnce((init) => [
|
|
82
|
-
|
|
82
|
+
listDevices,
|
|
83
83
|
mockSetDataStations,
|
|
84
84
|
]);
|
|
85
85
|
useState.mockImplementationOnce((init) => [init, mockSetTickAllDevice]);
|
|
@@ -140,8 +140,8 @@ describe('Test SelectPermission', () => {
|
|
|
140
140
|
{
|
|
141
141
|
id: 204,
|
|
142
142
|
isChecked: true,
|
|
143
|
-
name: '
|
|
144
|
-
|
|
143
|
+
name: 'device',
|
|
144
|
+
devices: [
|
|
145
145
|
{
|
|
146
146
|
actions: [{ id: 136, isChecked: true, name: 'action 1' }],
|
|
147
147
|
id: 123,
|
|
@@ -164,10 +164,10 @@ describe('Test SelectPermission', () => {
|
|
|
164
164
|
tree = create(wrapComponent(route));
|
|
165
165
|
});
|
|
166
166
|
const instance = tree.root;
|
|
167
|
-
const
|
|
168
|
-
expect(
|
|
167
|
+
const DeviceItemElement = instance.findAllByType(DeviceItem);
|
|
168
|
+
expect(DeviceItemElement).toHaveLength(1);
|
|
169
169
|
act(() => {
|
|
170
|
-
|
|
170
|
+
DeviceItemElement[0].props.onTickedChild(204, 123, 137, true, true);
|
|
171
171
|
});
|
|
172
172
|
expect(mockSetDataStations).toBeCalled();
|
|
173
173
|
});
|
|
@@ -198,8 +198,8 @@ describe('Test SelectPermission', () => {
|
|
|
198
198
|
{
|
|
199
199
|
id: 204,
|
|
200
200
|
isChecked: true,
|
|
201
|
-
name: '
|
|
202
|
-
|
|
201
|
+
name: 'device',
|
|
202
|
+
devices: [
|
|
203
203
|
{
|
|
204
204
|
actions: [{ id: 136, isChecked: true, name: 'action 1' }],
|
|
205
205
|
id: 123,
|
package/src/utils/Utils.js
CHANGED
|
@@ -110,24 +110,23 @@ export const removeFromString = (str, index) => {
|
|
|
110
110
|
|
|
111
111
|
export const object_Ids = (data) => {
|
|
112
112
|
let stationIds = [];
|
|
113
|
-
let
|
|
113
|
+
let deviceIds = [];
|
|
114
114
|
let actionIds = [];
|
|
115
115
|
let configIds = [];
|
|
116
116
|
data?.forEach((station) => {
|
|
117
117
|
stationIds.push(station?.id);
|
|
118
118
|
//Todo change devices When production release end_devices
|
|
119
|
-
station?.
|
|
120
|
-
|
|
121
|
-
|
|
119
|
+
station?.devices?.forEach((device) => {
|
|
120
|
+
deviceIds.push(device?.id);
|
|
121
|
+
device?.actions?.forEach((action) => {
|
|
122
122
|
actionIds.push(action?.id);
|
|
123
123
|
});
|
|
124
|
-
|
|
124
|
+
device?.read_configs?.forEach((config) => {
|
|
125
125
|
configIds.push(config?.id);
|
|
126
126
|
});
|
|
127
127
|
});
|
|
128
128
|
});
|
|
129
|
-
|
|
130
|
-
return listObject;
|
|
129
|
+
return { stationIds, deviceIds, actionIds, configIds } || {};
|
|
131
130
|
};
|
|
132
131
|
|
|
133
132
|
export const notImplemented = (t) => {
|