@eohjsc/react-native-smart-city 0.5.0 → 0.5.2-rc
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 +2 -2
- package/src/commons/ActionGroup/OnOffTemplate/OnOffButtonTemplateStyle.js +0 -1
- package/src/commons/ActionGroup/OnOffTemplate/OnOffSimpleTemplateStyle.js +1 -0
- package/src/commons/ActionGroup/OnOffTemplate/SwitchButtonTemplate.js +60 -48
- package/src/commons/ActionGroup/OnOffTemplate/index.js +1 -2
- package/src/commons/ActionGroup/SliderRangeTemplate.js +60 -64
- package/src/commons/ActionGroup/SliderRangeTemplateStyles.js +2 -4
- package/src/commons/ActionGroup/TerminalBoxTemplate.js +6 -6
- package/src/commons/ActionGroup/TextBoxTemplate.js +2 -2
- package/src/commons/ActionGroup/__test__/SliderRangeTemplate.test.js +72 -16
- package/src/commons/ActionGroup/__test__/SwitchButtonTemplate.test.js +33 -25
- package/src/commons/ActionGroup/__test__/TextBoxTemplate.test.js +19 -0
- package/src/commons/Device/RainningSensor/CurrentRainSensor.js +50 -45
- package/src/commons/Form/TextInput.js +2 -0
- package/src/commons/Header/Styles/HeaderCustomStyles.js +1 -1
- package/src/commons/HeaderAni/index.js +1 -1
- package/src/commons/ProcessingBar/index.js +32 -0
- package/src/commons/ProcessingBar/styles.js +57 -0
- package/src/commons/Sharing/WrapHeaderScrollable.js +1 -2
- package/src/configs/AccessibilityLabel.js +8 -0
- package/src/navigations/AddMemberStack.js +8 -3
- package/src/screens/AddCommon/SelectUnit.js +1 -1
- package/src/screens/AddCommon/__test__/SelectUnit.test.js +1 -1
- package/src/screens/Automate/AddNewAction/SetupScriptDelay.js +1 -1
- package/src/screens/Automate/Components/InputName.js +8 -2
- package/src/screens/Automate/EditActionsList/index.js +5 -5
- package/src/screens/Automate/OneTap/__test__/AddNewOneTap.test.js +17 -3
- package/src/screens/Device/components/SensorDisplayItem.js +7 -3
- package/src/screens/Device/detail.js +1 -1
- package/src/screens/EnterPassword/index.js +3 -2
- package/src/screens/Sharing/Components/CheckBoxConfig.js +44 -0
- package/src/screens/Sharing/Components/CheckBoxCustom.js +2 -13
- package/src/screens/Sharing/Components/CheckBoxSubUnit.js +35 -0
- package/src/screens/Sharing/Components/EndDevice.js +93 -0
- package/src/screens/Sharing/Components/Styles/CheckBoxConfigStyles.js +18 -0
- package/src/screens/Sharing/Components/Styles/DeviceItemStyles.js +28 -35
- package/src/screens/Sharing/Components/index.js +1 -2
- package/src/screens/Sharing/InfoMemberUnit.js +5 -3
- package/src/screens/Sharing/SelectShareDevice.js +273 -0
- package/src/screens/Sharing/SelectUser.js +6 -0
- package/src/screens/Sharing/Styles/SelectPermissionStyles.js +2 -11
- package/src/screens/Sharing/UnitMemberList.js +2 -1
- package/src/screens/Sharing/UpdateShareDevice.js +322 -0
- package/src/screens/Sharing/__test__/SelectShareDevice.test.js +215 -0
- package/src/screens/Sharing/__test__/UnitMemberList.test.js +1 -1
- package/src/screens/Sharing/__test__/UpdateShareDevice.test.js +307 -0
- package/src/screens/Sharing/hooks/index.js +5 -0
- package/src/screens/SubUnit/AddSubUnit.js +2 -6
- package/src/screens/SubUnit/EditSubUnitStyles.js +2 -1
- package/src/screens/Unit/AddMenu.js +1 -1
- package/src/screens/Unit/ManageUnitStyles.js +1 -1
- package/src/utils/I18n/translations/en.js +2 -0
- package/src/utils/I18n/translations/vi.js +2 -0
- package/src/utils/Route/index.js +2 -1
- package/src/commons/ActionGroup/OnOffTemplate/styles.js +0 -7
- package/src/screens/Sharing/Components/DeviceItem.js +0 -146
- package/src/screens/Sharing/Components/__test__/DeviceItem.test.js +0 -48
- package/src/screens/Sharing/SharingSelectPermission.js +0 -409
- package/src/screens/Sharing/__test__/SharingSelectPermission.test.js +0 -292
|
@@ -1,409 +0,0 @@
|
|
|
1
|
-
import React, { memo, useCallback, useEffect, useMemo, useState } from 'react';
|
|
2
|
-
import { View, FlatList, Alert, ActivityIndicator } from 'react-native';
|
|
3
|
-
import { useNavigation } from '@react-navigation/native';
|
|
4
|
-
|
|
5
|
-
import { useTranslations } from '../../hooks/Common/useTranslations';
|
|
6
|
-
import ViewButtonBottom from '../../commons/ViewButtonBottom';
|
|
7
|
-
import Text from '../../commons/Text';
|
|
8
|
-
import { DeviceItem, TitleCheckBox } from './Components';
|
|
9
|
-
import styles from './Styles/SelectPermissionStyles';
|
|
10
|
-
import { axiosGet, axiosPost } from '../../utils/Apis/axios';
|
|
11
|
-
import { objectIds } from '../../utils/Utils';
|
|
12
|
-
import Routes from '../../utils/Route';
|
|
13
|
-
import { API, Colors } from '../../configs';
|
|
14
|
-
import { AccessibilityLabel } from '../../configs/Constants';
|
|
15
|
-
|
|
16
|
-
let dataStationTemp = [];
|
|
17
|
-
|
|
18
|
-
const SharingSelectPermission = ({ route }) => {
|
|
19
|
-
const t = useTranslations();
|
|
20
|
-
const { unit, type = '', member } = route?.params || {};
|
|
21
|
-
const navigation = useNavigation();
|
|
22
|
-
const [dataStations, setDataStations] = useState([]);
|
|
23
|
-
const [isTickAllDevices, setIsTickAllDevices] = useState(false);
|
|
24
|
-
const [expandedItemIds, setExpandedItemIds] = useState([]);
|
|
25
|
-
const [loading, setLoading] = useState(true);
|
|
26
|
-
const [hasDataChecked, setHasDataChecked] = useState(false);
|
|
27
|
-
const [dataDeviceShared, setDataDeviceShared] = useState([]);
|
|
28
|
-
|
|
29
|
-
const isUpdateSharedDevice = useMemo(() => {
|
|
30
|
-
return type === 'update_shared';
|
|
31
|
-
}, [type]);
|
|
32
|
-
|
|
33
|
-
const onTickTitle = (idGroup, isChecked, id) => {
|
|
34
|
-
if (!idGroup) {
|
|
35
|
-
setIsTickAllDevices(isChecked);
|
|
36
|
-
const data = dataStations.map((i) => ({
|
|
37
|
-
...i,
|
|
38
|
-
isChecked,
|
|
39
|
-
}));
|
|
40
|
-
for (let station in data) {
|
|
41
|
-
for (let item in data[station].devices) {
|
|
42
|
-
const itemTemp = data[station].devices[item];
|
|
43
|
-
data[station].devices[item] = {
|
|
44
|
-
...itemTemp,
|
|
45
|
-
isChecked,
|
|
46
|
-
actions: itemTemp.actions.map((i) => ({
|
|
47
|
-
...i,
|
|
48
|
-
isChecked,
|
|
49
|
-
})),
|
|
50
|
-
read_configs: itemTemp.read_configs.map((i) => ({
|
|
51
|
-
...i,
|
|
52
|
-
isChecked,
|
|
53
|
-
})),
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
setDataStations(data);
|
|
58
|
-
} else {
|
|
59
|
-
const data = [...dataStationTemp];
|
|
60
|
-
|
|
61
|
-
const index = data.findIndex((item) => item.id === idGroup);
|
|
62
|
-
|
|
63
|
-
data[index] = {
|
|
64
|
-
...data[index],
|
|
65
|
-
isChecked,
|
|
66
|
-
devices: data[index]?.devices.map((i) => ({
|
|
67
|
-
...i,
|
|
68
|
-
isChecked,
|
|
69
|
-
actions: i.actions.map((j) => ({ ...j, isChecked })),
|
|
70
|
-
read_configs: i.read_configs.map((j) => ({ ...j, isChecked })),
|
|
71
|
-
})),
|
|
72
|
-
};
|
|
73
|
-
setDataStations(data);
|
|
74
|
-
setIsTickAllDevices(!data.some((item) => !item.isChecked));
|
|
75
|
-
}
|
|
76
|
-
};
|
|
77
|
-
|
|
78
|
-
const onTickedChild = (
|
|
79
|
-
idGroup,
|
|
80
|
-
deviceId,
|
|
81
|
-
childId,
|
|
82
|
-
isChecked,
|
|
83
|
-
isReadConfig
|
|
84
|
-
) => {
|
|
85
|
-
let data = [...dataStationTemp];
|
|
86
|
-
const group = data.find((i) => i.id === idGroup);
|
|
87
|
-
const device = group.devices.find((i) => i.id === deviceId);
|
|
88
|
-
const child = device[`${isReadConfig ? 'read_configs' : 'actions'}`].find(
|
|
89
|
-
(i) => i.id === childId
|
|
90
|
-
);
|
|
91
|
-
|
|
92
|
-
child.isChecked = isChecked;
|
|
93
|
-
device.isChecked = !(
|
|
94
|
-
device.read_configs.some((i) => !i.isChecked) ||
|
|
95
|
-
device.actions.some((i) => !i.isChecked)
|
|
96
|
-
);
|
|
97
|
-
for (let station of data) {
|
|
98
|
-
if (station.devices.length) {
|
|
99
|
-
station.isChecked = station.devices.some(
|
|
100
|
-
(i) =>
|
|
101
|
-
i.read_configs.some((r) => r.isChecked) ||
|
|
102
|
-
i.actions.some((a) => a.isChecked)
|
|
103
|
-
);
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
setIsTickAllDevices(!dataStationTemp.some((i) => !i.isChecked));
|
|
107
|
-
dataStationTemp = data;
|
|
108
|
-
setDataStations(data);
|
|
109
|
-
};
|
|
110
|
-
|
|
111
|
-
const onTickedDevice = (idGroup, deviceId, isChecked) => {
|
|
112
|
-
let data = [...dataStationTemp];
|
|
113
|
-
const group = data.find((i) => i.id === idGroup);
|
|
114
|
-
const device = group.devices.find((i) => i.id === deviceId);
|
|
115
|
-
|
|
116
|
-
device.isChecked = isChecked;
|
|
117
|
-
|
|
118
|
-
for (let station of data) {
|
|
119
|
-
if (station.devices.length) {
|
|
120
|
-
station.isChecked = !station.devices.some((i) => !i.isChecked);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
setIsTickAllDevices(!dataStationTemp.some((i) => !i.isChecked));
|
|
124
|
-
dataStationTemp = data;
|
|
125
|
-
setDataStations(data);
|
|
126
|
-
};
|
|
127
|
-
|
|
128
|
-
const onTickedDeviceIcon = (idGroup, deviceId, isChecked) => {
|
|
129
|
-
let data = [...dataStationTemp];
|
|
130
|
-
const group = data.find((i) => i.id === idGroup);
|
|
131
|
-
const device = group.devices.find((i) => i.id === deviceId);
|
|
132
|
-
const index = data.findIndex((item) => item.id === idGroup);
|
|
133
|
-
|
|
134
|
-
data[index] = {
|
|
135
|
-
...data[index],
|
|
136
|
-
devices: data[index]?.devices.map((i) => {
|
|
137
|
-
if (i.id === device?.id) {
|
|
138
|
-
return {
|
|
139
|
-
...i,
|
|
140
|
-
isChecked: !isChecked,
|
|
141
|
-
actions: i.actions.map((j) => ({ ...j, isChecked: !isChecked })),
|
|
142
|
-
read_configs: i.read_configs.map((j) => ({
|
|
143
|
-
...j,
|
|
144
|
-
isChecked: !isChecked,
|
|
145
|
-
})),
|
|
146
|
-
};
|
|
147
|
-
}
|
|
148
|
-
return { ...i };
|
|
149
|
-
}),
|
|
150
|
-
};
|
|
151
|
-
|
|
152
|
-
data[index] = {
|
|
153
|
-
...data[index],
|
|
154
|
-
isChecked:
|
|
155
|
-
!data[index]?.devices.length ===
|
|
156
|
-
!data[index]?.devices.filter((i) => i.isChecked).length,
|
|
157
|
-
};
|
|
158
|
-
|
|
159
|
-
setDataStations(data);
|
|
160
|
-
};
|
|
161
|
-
|
|
162
|
-
const toggleDeviceItem = (deviceItem) => () => {
|
|
163
|
-
setExpandedItemIds((ids) => {
|
|
164
|
-
const index = ids.indexOf(deviceItem.id);
|
|
165
|
-
if (index !== -1) {
|
|
166
|
-
return [...ids.slice(0, index), ...ids.slice(index + 1)];
|
|
167
|
-
} else {
|
|
168
|
-
return [...ids, deviceItem.id];
|
|
169
|
-
}
|
|
170
|
-
});
|
|
171
|
-
};
|
|
172
|
-
|
|
173
|
-
const autoCheckedGroup = useCallback(async () => {
|
|
174
|
-
if (isUpdateSharedDevice) {
|
|
175
|
-
if (hasDataChecked) {
|
|
176
|
-
const { stationIds, deviceIds, actionIds, configIds } =
|
|
177
|
-
objectIds(dataDeviceShared);
|
|
178
|
-
for (let station in dataStations) {
|
|
179
|
-
for (let item in dataStations[station].devices) {
|
|
180
|
-
const itemTemp = dataStations[station].devices[item];
|
|
181
|
-
dataStations[station].devices[item] = {
|
|
182
|
-
...itemTemp,
|
|
183
|
-
isChecked: deviceIds.includes(itemTemp?.id),
|
|
184
|
-
actions: itemTemp.actions.map((i) => {
|
|
185
|
-
return {
|
|
186
|
-
...i,
|
|
187
|
-
isChecked: actionIds?.includes(i.id),
|
|
188
|
-
};
|
|
189
|
-
}),
|
|
190
|
-
read_configs: itemTemp.read_configs.map((i) => {
|
|
191
|
-
return {
|
|
192
|
-
...i,
|
|
193
|
-
isChecked: configIds?.includes(i.id),
|
|
194
|
-
};
|
|
195
|
-
}),
|
|
196
|
-
};
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
const data = dataStations?.map((i) => {
|
|
200
|
-
const devices = i?.devices;
|
|
201
|
-
const devices_checked = i?.devices?.filter(
|
|
202
|
-
(device) => device?.isChecked
|
|
203
|
-
);
|
|
204
|
-
return {
|
|
205
|
-
...i,
|
|
206
|
-
isChecked:
|
|
207
|
-
!devices.length === !devices_checked.length &&
|
|
208
|
-
stationIds.includes(i.id),
|
|
209
|
-
};
|
|
210
|
-
});
|
|
211
|
-
setDataStations(data);
|
|
212
|
-
setIsTickAllDevices(data?.length === stationIds?.length);
|
|
213
|
-
setHasDataChecked(false);
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
}, [dataDeviceShared, dataStations, hasDataChecked, isUpdateSharedDevice]);
|
|
217
|
-
|
|
218
|
-
const GroupDeviceItem = ({ item = {} }) => {
|
|
219
|
-
const { name = '', devices = [], isChecked, id = '' } = item;
|
|
220
|
-
return (
|
|
221
|
-
<View style={styles.viewGroup}>
|
|
222
|
-
<TitleCheckBox
|
|
223
|
-
title={name}
|
|
224
|
-
wrapCheckBoxStyle={styles.checkBoxTile}
|
|
225
|
-
onPress={onTickTitle}
|
|
226
|
-
titleStyle={styles.GroupDeviceItem}
|
|
227
|
-
isChecked={isChecked}
|
|
228
|
-
idGroup={id}
|
|
229
|
-
/>
|
|
230
|
-
<View style={styles.wrapDevice}>
|
|
231
|
-
{devices?.map((i, index) => (
|
|
232
|
-
<DeviceItem
|
|
233
|
-
item={i}
|
|
234
|
-
key={i.id}
|
|
235
|
-
isRenderSeparated={index !== devices?.length - 1}
|
|
236
|
-
onTickedChild={onTickedChild}
|
|
237
|
-
onTickedDevice={onTickedDevice}
|
|
238
|
-
onTickedDeviceIcon={onTickedDeviceIcon}
|
|
239
|
-
isItemExpanded={expandedItemIds.includes(i.id)}
|
|
240
|
-
toggleItem={toggleDeviceItem(i)}
|
|
241
|
-
idGroup={id}
|
|
242
|
-
/>
|
|
243
|
-
))}
|
|
244
|
-
</View>
|
|
245
|
-
</View>
|
|
246
|
-
);
|
|
247
|
-
};
|
|
248
|
-
|
|
249
|
-
const onPressBottom = async () => {
|
|
250
|
-
let read_permissions = [],
|
|
251
|
-
control_permissions = [];
|
|
252
|
-
for (let station of dataStationTemp) {
|
|
253
|
-
for (let item of station.devices) {
|
|
254
|
-
let arrIdControlTemp = [],
|
|
255
|
-
arrIdReadTemp = [];
|
|
256
|
-
|
|
257
|
-
for (let i of item.actions) {
|
|
258
|
-
i.isChecked && arrIdControlTemp.push(i.id);
|
|
259
|
-
}
|
|
260
|
-
for (let i of item.read_configs) {
|
|
261
|
-
i.isChecked && arrIdReadTemp.push(i.id);
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
arrIdControlTemp.length &&
|
|
265
|
-
control_permissions.push({ id: item.id, values: arrIdControlTemp });
|
|
266
|
-
|
|
267
|
-
arrIdReadTemp.length &&
|
|
268
|
-
read_permissions.push({ id: item.id, values: arrIdReadTemp });
|
|
269
|
-
|
|
270
|
-
!arrIdControlTemp.length &&
|
|
271
|
-
!arrIdReadTemp.length &&
|
|
272
|
-
item.isChecked &&
|
|
273
|
-
read_permissions.push({ id: item.id, values: [] });
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
if (!read_permissions.length && !control_permissions.length) {
|
|
277
|
-
Alert.alert('', t('choose_at_least_one'));
|
|
278
|
-
return;
|
|
279
|
-
}
|
|
280
|
-
if (isUpdateSharedDevice) {
|
|
281
|
-
const phone =
|
|
282
|
-
member?.phone_number && member?.email
|
|
283
|
-
? member?.phone_number
|
|
284
|
-
: member?.phone_number || '';
|
|
285
|
-
const email = member?.phone_number ? '' : member?.email || '';
|
|
286
|
-
const { success } = await axiosPost(API.SHARE.SHARE(), {
|
|
287
|
-
phone,
|
|
288
|
-
email,
|
|
289
|
-
unit: unit?.id,
|
|
290
|
-
permissions: { read_permissions, control_permissions },
|
|
291
|
-
is_remove_old_permission: true,
|
|
292
|
-
});
|
|
293
|
-
success && navigation.goBack();
|
|
294
|
-
} else {
|
|
295
|
-
navigation.navigate(Routes.SharingInviteMembers, {
|
|
296
|
-
unit,
|
|
297
|
-
permissions: { read_permissions, control_permissions },
|
|
298
|
-
});
|
|
299
|
-
}
|
|
300
|
-
};
|
|
301
|
-
|
|
302
|
-
const renderGroupItem = ({ item }) => (
|
|
303
|
-
<GroupDeviceItem key={item.id} item={item} />
|
|
304
|
-
);
|
|
305
|
-
|
|
306
|
-
const renderFlatList = useMemo(() => {
|
|
307
|
-
return (
|
|
308
|
-
<FlatList
|
|
309
|
-
keyExtractor={(item) => item.id}
|
|
310
|
-
extraData={dataStations}
|
|
311
|
-
data={dataStations}
|
|
312
|
-
renderItem={renderGroupItem}
|
|
313
|
-
ListHeaderComponent={
|
|
314
|
-
dataStations?.length > 0 ? (
|
|
315
|
-
<TitleCheckBox
|
|
316
|
-
title={t('text_all_devices')}
|
|
317
|
-
wrapStyle={styles.wrapAllDevices}
|
|
318
|
-
onPress={onTickTitle}
|
|
319
|
-
titleStyle={styles.textAllDevice}
|
|
320
|
-
isChecked={isTickAllDevices}
|
|
321
|
-
/>
|
|
322
|
-
) : (
|
|
323
|
-
<></>
|
|
324
|
-
)
|
|
325
|
-
}
|
|
326
|
-
scrollIndicatorInsets={{ right: 1 }}
|
|
327
|
-
/>
|
|
328
|
-
);
|
|
329
|
-
|
|
330
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
331
|
-
}, [dataStations, isTickAllDevices, expandedItemIds]);
|
|
332
|
-
|
|
333
|
-
useEffect(() => {
|
|
334
|
-
autoCheckedGroup();
|
|
335
|
-
}, [autoCheckedGroup]);
|
|
336
|
-
|
|
337
|
-
const getShareUnitPermission = useCallback(async () => {
|
|
338
|
-
if (isUpdateSharedDevice && dataStations?.length > 0) {
|
|
339
|
-
const { success, data } = await axiosGet(
|
|
340
|
-
API.SHARE.UNIT_MEMBER_SHARE_DEVICE(unit?.id, member?.id)
|
|
341
|
-
);
|
|
342
|
-
if (success) {
|
|
343
|
-
setDataDeviceShared(data);
|
|
344
|
-
setHasDataChecked(true);
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
}, [dataStations?.length, isUpdateSharedDevice, member?.id, unit?.id]);
|
|
348
|
-
|
|
349
|
-
const getUnitPermission = useCallback(async () => {
|
|
350
|
-
const { success, data } = await axiosGet(
|
|
351
|
-
API.SHARE.UNIT_PERMISSIONS(unit?.id)
|
|
352
|
-
);
|
|
353
|
-
if (success) {
|
|
354
|
-
setDataStations(data);
|
|
355
|
-
}
|
|
356
|
-
setLoading(false);
|
|
357
|
-
}, [unit?.id]);
|
|
358
|
-
|
|
359
|
-
useEffect(() => {
|
|
360
|
-
(async () => {
|
|
361
|
-
if (!unit) {
|
|
362
|
-
return;
|
|
363
|
-
}
|
|
364
|
-
await getUnitPermission();
|
|
365
|
-
await getShareUnitPermission();
|
|
366
|
-
})();
|
|
367
|
-
}, [getShareUnitPermission, getUnitPermission, unit]);
|
|
368
|
-
|
|
369
|
-
useEffect(() => {
|
|
370
|
-
dataStationTemp = dataStations;
|
|
371
|
-
}, [dataStations]);
|
|
372
|
-
|
|
373
|
-
return (
|
|
374
|
-
<View style={styles.wrap}>
|
|
375
|
-
<Text semibold style={styles.title}>
|
|
376
|
-
{t('select_device')}
|
|
377
|
-
</Text>
|
|
378
|
-
<Text style={styles.subtitle}>{t('sharing_select_devices_hint')}</Text>
|
|
379
|
-
<View style={styles.contentContainer}>
|
|
380
|
-
{loading ? (
|
|
381
|
-
<ActivityIndicator color={Colors.Primary} />
|
|
382
|
-
) : dataStations?.length > 0 ? (
|
|
383
|
-
renderFlatList
|
|
384
|
-
) : (
|
|
385
|
-
<Text
|
|
386
|
-
style={styles.textNodata}
|
|
387
|
-
accessibilityLabel={AccessibilityLabel.TEXT_NO_DATA_STATIONS}
|
|
388
|
-
>
|
|
389
|
-
{t('no_data')}
|
|
390
|
-
</Text>
|
|
391
|
-
)}
|
|
392
|
-
</View>
|
|
393
|
-
<View style={styles.wrapViewButtonStyle}>
|
|
394
|
-
<ViewButtonBottom
|
|
395
|
-
accessibilityLabelPrefix={
|
|
396
|
-
AccessibilityLabel.PREFIX.SHARING_SELECT_PERMISSION
|
|
397
|
-
}
|
|
398
|
-
leftTitle={t('cancel')}
|
|
399
|
-
onLeftClick={() => navigation.goBack()}
|
|
400
|
-
rightTitle={isUpdateSharedDevice ? t('done') : t('next')}
|
|
401
|
-
rightDisabled={false}
|
|
402
|
-
onRightClick={onPressBottom}
|
|
403
|
-
/>
|
|
404
|
-
</View>
|
|
405
|
-
</View>
|
|
406
|
-
);
|
|
407
|
-
};
|
|
408
|
-
|
|
409
|
-
export default memo(SharingSelectPermission);
|
|
@@ -1,292 +0,0 @@
|
|
|
1
|
-
import { act } from '@testing-library/react-hooks';
|
|
2
|
-
import React, { useState } from 'react';
|
|
3
|
-
import { FlatList, Text, Platform } from 'react-native';
|
|
4
|
-
import { create } from 'react-test-renderer';
|
|
5
|
-
import MockAdapter from 'axios-mock-adapter';
|
|
6
|
-
import { DeviceItem, TitleCheckBox } from '../Components';
|
|
7
|
-
import { ViewButtonBottom } from '../../../commons';
|
|
8
|
-
import { SCProvider } from '../../../context';
|
|
9
|
-
import { mockSCStore } from '../../../context/mockStore';
|
|
10
|
-
import API from '../../../configs/API';
|
|
11
|
-
import api from '../../../utils/Apis/axios';
|
|
12
|
-
import SharingSelectPermission from '../SharingSelectPermission';
|
|
13
|
-
|
|
14
|
-
const mock = new MockAdapter(api.axiosInstance);
|
|
15
|
-
|
|
16
|
-
const mockSetState = jest.fn();
|
|
17
|
-
jest.mock('react', () => {
|
|
18
|
-
return {
|
|
19
|
-
...jest.requireActual('react'),
|
|
20
|
-
useState: jest.fn((init) => [init, mockSetState]),
|
|
21
|
-
memo: (x) => x,
|
|
22
|
-
};
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
const mockNavigate = jest.fn();
|
|
26
|
-
const mockGoBack = jest.fn();
|
|
27
|
-
jest.mock('@react-navigation/native', () => {
|
|
28
|
-
return {
|
|
29
|
-
...jest.requireActual('@react-navigation/native'),
|
|
30
|
-
useNavigation: () => ({
|
|
31
|
-
navigate: mockNavigate,
|
|
32
|
-
goBack: mockGoBack,
|
|
33
|
-
}),
|
|
34
|
-
};
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
const wrapComponent = (route) => (
|
|
38
|
-
<SCProvider initState={mockSCStore({})}>
|
|
39
|
-
<SharingSelectPermission route={route} />
|
|
40
|
-
</SCProvider>
|
|
41
|
-
);
|
|
42
|
-
|
|
43
|
-
describe('Test SharingSelectPermission', () => {
|
|
44
|
-
let tree;
|
|
45
|
-
let route = { params: { unit: { id: 1, name: 'unit 1' } } };
|
|
46
|
-
let listDevices = [
|
|
47
|
-
{
|
|
48
|
-
id: 204,
|
|
49
|
-
name: 'device',
|
|
50
|
-
devices: [
|
|
51
|
-
{
|
|
52
|
-
id: 123,
|
|
53
|
-
actions: [{ id: 136, name: 'action 1' }],
|
|
54
|
-
read_configs: [{ id: 137, name: 'config 1' }],
|
|
55
|
-
name: 'child1',
|
|
56
|
-
},
|
|
57
|
-
],
|
|
58
|
-
},
|
|
59
|
-
];
|
|
60
|
-
|
|
61
|
-
const mockSetTickAllDevice = jest.fn();
|
|
62
|
-
const mockSetActiveItemId = jest.fn();
|
|
63
|
-
const mockSetDataStations = jest.fn();
|
|
64
|
-
|
|
65
|
-
afterEach(() => {
|
|
66
|
-
mockSetState.mockClear();
|
|
67
|
-
mockSetTickAllDevice.mockClear();
|
|
68
|
-
mockSetActiveItemId.mockClear();
|
|
69
|
-
mockSetDataStations.mockClear();
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
function mockLoading() {
|
|
73
|
-
useState.mockImplementationOnce((init) => [init, mockSetState]);
|
|
74
|
-
useState.mockImplementationOnce((init) => [init, mockSetState]);
|
|
75
|
-
useState.mockImplementationOnce((init) => [init, mockSetState]);
|
|
76
|
-
useState.mockImplementationOnce((init) => [false, mockSetState]); // loading
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
function mocSetdata() {
|
|
80
|
-
useState.mockImplementationOnce((init) => [
|
|
81
|
-
listDevices,
|
|
82
|
-
mockSetDataStations,
|
|
83
|
-
]);
|
|
84
|
-
useState.mockImplementationOnce((init) => [init, mockSetTickAllDevice]);
|
|
85
|
-
useState.mockImplementationOnce((init) => [init, mockSetActiveItemId]);
|
|
86
|
-
useState.mockImplementationOnce((init) => [false, mockSetState]); // loading
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
it('test unit null', async () => {
|
|
90
|
-
Platform.OS = 'android';
|
|
91
|
-
await act(async () => {
|
|
92
|
-
tree = await create(wrapComponent(route));
|
|
93
|
-
});
|
|
94
|
-
const instance = tree.root;
|
|
95
|
-
const ViewButtonBottoms = instance.findAllByType(ViewButtonBottom);
|
|
96
|
-
expect(ViewButtonBottoms).toHaveLength(1);
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
it('render empty list', async () => {
|
|
100
|
-
mockLoading();
|
|
101
|
-
Platform.OS = 'ios';
|
|
102
|
-
route.params.unit = 1;
|
|
103
|
-
mock.onGet(API.SHARE.UNIT_MEMBER_SHARE_DEVICE(1, 1)).reply(200);
|
|
104
|
-
await act(async () => {
|
|
105
|
-
tree = await create(wrapComponent(route));
|
|
106
|
-
});
|
|
107
|
-
const instance = tree.root;
|
|
108
|
-
const TextElement = instance.findAllByType(Text);
|
|
109
|
-
expect(TextElement[2].props.children).toBe('No data');
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
it('test unit get permission default', async () => {
|
|
113
|
-
mocSetdata();
|
|
114
|
-
const routes = { params: { unit: { id: 1, name: '123' } } };
|
|
115
|
-
mock.onGet(API.SHARE.UNIT_PERMISSIONS(1)).reply(200);
|
|
116
|
-
await act(async () => {
|
|
117
|
-
tree = await create(wrapComponent(routes));
|
|
118
|
-
});
|
|
119
|
-
const instance = tree.root;
|
|
120
|
-
const FlatListElement = instance.findAllByType(FlatList);
|
|
121
|
-
expect(FlatListElement).toHaveLength(1);
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
it('test unit fail default', async () => {
|
|
125
|
-
mockLoading();
|
|
126
|
-
const routes = { params: { unit: null } };
|
|
127
|
-
mock.onGet(API.SHARE.UNIT_PERMISSIONS(1)).reply(400);
|
|
128
|
-
await act(async () => {
|
|
129
|
-
tree = await create(wrapComponent(routes));
|
|
130
|
-
});
|
|
131
|
-
const instance = tree.root;
|
|
132
|
-
const TextElement = instance.findAllByType(Text);
|
|
133
|
-
expect(TextElement[2].props.children).toBe('No data');
|
|
134
|
-
});
|
|
135
|
-
|
|
136
|
-
it('test get unit fail shared', async () => {
|
|
137
|
-
mockLoading();
|
|
138
|
-
route.params.unit = 1;
|
|
139
|
-
mock.onGet(API.SHARE.UNIT_MEMBER_SHARE_DEVICE(1, 1)).reply(400);
|
|
140
|
-
await act(async () => {
|
|
141
|
-
tree = await create(wrapComponent(route));
|
|
142
|
-
});
|
|
143
|
-
const instance = tree.root;
|
|
144
|
-
const TextElement = instance.findAllByType(Text);
|
|
145
|
-
expect(TextElement[2].props.children).toBe('No data');
|
|
146
|
-
});
|
|
147
|
-
|
|
148
|
-
it('render list', async () => {
|
|
149
|
-
mocSetdata();
|
|
150
|
-
await act(async () => {
|
|
151
|
-
tree = await create(wrapComponent(route));
|
|
152
|
-
});
|
|
153
|
-
const instance = tree.root;
|
|
154
|
-
const FlatListElement = instance.findAllByType(FlatList);
|
|
155
|
-
expect(FlatListElement).toHaveLength(1);
|
|
156
|
-
const TitleCheckBoxElement = instance.findAllByType(TitleCheckBox);
|
|
157
|
-
expect(TitleCheckBoxElement).toHaveLength(2);
|
|
158
|
-
await act(async () => {
|
|
159
|
-
TitleCheckBoxElement[0].props.onPress(null, true);
|
|
160
|
-
});
|
|
161
|
-
expect(mockSetTickAllDevice).toBeCalledWith(true);
|
|
162
|
-
expect(mockSetDataStations).toBeCalledWith([
|
|
163
|
-
{
|
|
164
|
-
id: 204,
|
|
165
|
-
isChecked: true,
|
|
166
|
-
name: 'device',
|
|
167
|
-
devices: [
|
|
168
|
-
{
|
|
169
|
-
actions: [{ id: 136, isChecked: true, name: 'action 1' }],
|
|
170
|
-
id: 123,
|
|
171
|
-
isChecked: true,
|
|
172
|
-
name: 'child1',
|
|
173
|
-
read_configs: [{ id: 137, isChecked: true, name: 'config 1' }],
|
|
174
|
-
},
|
|
175
|
-
],
|
|
176
|
-
},
|
|
177
|
-
]);
|
|
178
|
-
await act(async () => {
|
|
179
|
-
TitleCheckBoxElement[0].props.onPress(204, true);
|
|
180
|
-
});
|
|
181
|
-
expect(mockSetTickAllDevice).toBeCalledWith(true);
|
|
182
|
-
});
|
|
183
|
-
|
|
184
|
-
it('test onTickedChild function', async () => {
|
|
185
|
-
mocSetdata();
|
|
186
|
-
await act(async () => {
|
|
187
|
-
tree = await create(wrapComponent(route));
|
|
188
|
-
});
|
|
189
|
-
const instance = tree.root;
|
|
190
|
-
const DeviceItemElement = instance.findAllByType(DeviceItem);
|
|
191
|
-
expect(DeviceItemElement).toHaveLength(1);
|
|
192
|
-
await act(async () => {
|
|
193
|
-
DeviceItemElement[0].props.onTickedChild(204, 123, 137, true, true);
|
|
194
|
-
});
|
|
195
|
-
expect(mockSetDataStations).toBeCalled();
|
|
196
|
-
});
|
|
197
|
-
|
|
198
|
-
it('test onTickedDevice function', async () => {
|
|
199
|
-
mocSetdata();
|
|
200
|
-
await act(async () => {
|
|
201
|
-
tree = await create(wrapComponent(route));
|
|
202
|
-
});
|
|
203
|
-
const instance = tree.root;
|
|
204
|
-
const DeviceItemElement = instance.findAllByType(DeviceItem);
|
|
205
|
-
expect(DeviceItemElement).toHaveLength(1);
|
|
206
|
-
await act(async () => {
|
|
207
|
-
DeviceItemElement[0].props.onTickedDevice(204, 123, true);
|
|
208
|
-
DeviceItemElement[0].props.toggleItem(123);
|
|
209
|
-
});
|
|
210
|
-
expect(mockSetDataStations).toBeCalled();
|
|
211
|
-
});
|
|
212
|
-
|
|
213
|
-
it('test onTickedDeviceIcon function', async () => {
|
|
214
|
-
mocSetdata();
|
|
215
|
-
await act(async () => {
|
|
216
|
-
tree = await create(wrapComponent(route));
|
|
217
|
-
});
|
|
218
|
-
const instance = tree.root;
|
|
219
|
-
const DeviceItemElement = instance.findAllByType(DeviceItem);
|
|
220
|
-
expect(DeviceItemElement).toHaveLength(1);
|
|
221
|
-
await act(async () => {
|
|
222
|
-
DeviceItemElement[0].props.onTickedDeviceIcon(204, 123, true);
|
|
223
|
-
});
|
|
224
|
-
expect(mockSetDataStations).toBeCalled();
|
|
225
|
-
});
|
|
226
|
-
|
|
227
|
-
it('test ViewButtonBottom', async () => {
|
|
228
|
-
mocSetdata();
|
|
229
|
-
await act(async () => {
|
|
230
|
-
tree = await create(wrapComponent(route));
|
|
231
|
-
});
|
|
232
|
-
const instance = tree.root;
|
|
233
|
-
const ViewButtonBottomElement = instance.findAllByType(ViewButtonBottom);
|
|
234
|
-
expect(ViewButtonBottomElement).toHaveLength(1);
|
|
235
|
-
await act(async () => {
|
|
236
|
-
ViewButtonBottomElement[0].props.onRightClick();
|
|
237
|
-
});
|
|
238
|
-
await act(async () => {
|
|
239
|
-
ViewButtonBottomElement[0].props.onLeftClick();
|
|
240
|
-
});
|
|
241
|
-
expect(mockGoBack).toBeCalled();
|
|
242
|
-
});
|
|
243
|
-
|
|
244
|
-
it('test SharingSelectPermission type share_device', async () => {
|
|
245
|
-
mocSetdata();
|
|
246
|
-
useState.mockImplementationOnce((init) => [true, mockSetState]);
|
|
247
|
-
const response = {
|
|
248
|
-
status: 200,
|
|
249
|
-
data: [
|
|
250
|
-
{
|
|
251
|
-
id: 204,
|
|
252
|
-
isChecked: true,
|
|
253
|
-
name: 'device',
|
|
254
|
-
devices: [
|
|
255
|
-
{
|
|
256
|
-
actions: [{ id: 136, isChecked: true, name: 'action 1' }],
|
|
257
|
-
id: 123,
|
|
258
|
-
isChecked: true,
|
|
259
|
-
name: 'child1',
|
|
260
|
-
read_configs: [{ id: 137, isChecked: true, name: 'config 1' }],
|
|
261
|
-
},
|
|
262
|
-
],
|
|
263
|
-
},
|
|
264
|
-
],
|
|
265
|
-
};
|
|
266
|
-
mock
|
|
267
|
-
.onGet(API.SHARE.UNIT_MEMBER_SHARE_DEVICE(1, 1))
|
|
268
|
-
.reply(200, response.data);
|
|
269
|
-
const routes = {
|
|
270
|
-
params: {
|
|
271
|
-
unit: { id: 1 },
|
|
272
|
-
type: 'update_shared',
|
|
273
|
-
member: {
|
|
274
|
-
id: 1,
|
|
275
|
-
name: 'a',
|
|
276
|
-
phone_number: '89898888',
|
|
277
|
-
email: 'abcderfg@gmail.com',
|
|
278
|
-
},
|
|
279
|
-
},
|
|
280
|
-
};
|
|
281
|
-
await act(async () => {
|
|
282
|
-
tree = await create(wrapComponent(routes));
|
|
283
|
-
});
|
|
284
|
-
const instance = tree.root;
|
|
285
|
-
const ViewButtonBottomElement = instance.findAllByType(ViewButtonBottom);
|
|
286
|
-
await act(async () => {
|
|
287
|
-
ViewButtonBottomElement[0].props.onRightClick();
|
|
288
|
-
});
|
|
289
|
-
mock.onPost(API.SHARE.SHARE()).reply(200);
|
|
290
|
-
expect(mockGoBack).toBeCalled();
|
|
291
|
-
});
|
|
292
|
-
});
|