@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.
Files changed (59) hide show
  1. package/package.json +2 -2
  2. package/src/commons/ActionGroup/OnOffTemplate/OnOffButtonTemplateStyle.js +0 -1
  3. package/src/commons/ActionGroup/OnOffTemplate/OnOffSimpleTemplateStyle.js +1 -0
  4. package/src/commons/ActionGroup/OnOffTemplate/SwitchButtonTemplate.js +60 -48
  5. package/src/commons/ActionGroup/OnOffTemplate/index.js +1 -2
  6. package/src/commons/ActionGroup/SliderRangeTemplate.js +60 -64
  7. package/src/commons/ActionGroup/SliderRangeTemplateStyles.js +2 -4
  8. package/src/commons/ActionGroup/TerminalBoxTemplate.js +6 -6
  9. package/src/commons/ActionGroup/TextBoxTemplate.js +2 -2
  10. package/src/commons/ActionGroup/__test__/SliderRangeTemplate.test.js +72 -16
  11. package/src/commons/ActionGroup/__test__/SwitchButtonTemplate.test.js +33 -25
  12. package/src/commons/ActionGroup/__test__/TextBoxTemplate.test.js +19 -0
  13. package/src/commons/Device/RainningSensor/CurrentRainSensor.js +50 -45
  14. package/src/commons/Form/TextInput.js +2 -0
  15. package/src/commons/Header/Styles/HeaderCustomStyles.js +1 -1
  16. package/src/commons/HeaderAni/index.js +1 -1
  17. package/src/commons/ProcessingBar/index.js +32 -0
  18. package/src/commons/ProcessingBar/styles.js +57 -0
  19. package/src/commons/Sharing/WrapHeaderScrollable.js +1 -2
  20. package/src/configs/AccessibilityLabel.js +8 -0
  21. package/src/navigations/AddMemberStack.js +8 -3
  22. package/src/screens/AddCommon/SelectUnit.js +1 -1
  23. package/src/screens/AddCommon/__test__/SelectUnit.test.js +1 -1
  24. package/src/screens/Automate/AddNewAction/SetupScriptDelay.js +1 -1
  25. package/src/screens/Automate/Components/InputName.js +8 -2
  26. package/src/screens/Automate/EditActionsList/index.js +5 -5
  27. package/src/screens/Automate/OneTap/__test__/AddNewOneTap.test.js +17 -3
  28. package/src/screens/Device/components/SensorDisplayItem.js +7 -3
  29. package/src/screens/Device/detail.js +1 -1
  30. package/src/screens/EnterPassword/index.js +3 -2
  31. package/src/screens/Sharing/Components/CheckBoxConfig.js +44 -0
  32. package/src/screens/Sharing/Components/CheckBoxCustom.js +2 -13
  33. package/src/screens/Sharing/Components/CheckBoxSubUnit.js +35 -0
  34. package/src/screens/Sharing/Components/EndDevice.js +93 -0
  35. package/src/screens/Sharing/Components/Styles/CheckBoxConfigStyles.js +18 -0
  36. package/src/screens/Sharing/Components/Styles/DeviceItemStyles.js +28 -35
  37. package/src/screens/Sharing/Components/index.js +1 -2
  38. package/src/screens/Sharing/InfoMemberUnit.js +5 -3
  39. package/src/screens/Sharing/SelectShareDevice.js +273 -0
  40. package/src/screens/Sharing/SelectUser.js +6 -0
  41. package/src/screens/Sharing/Styles/SelectPermissionStyles.js +2 -11
  42. package/src/screens/Sharing/UnitMemberList.js +2 -1
  43. package/src/screens/Sharing/UpdateShareDevice.js +322 -0
  44. package/src/screens/Sharing/__test__/SelectShareDevice.test.js +215 -0
  45. package/src/screens/Sharing/__test__/UnitMemberList.test.js +1 -1
  46. package/src/screens/Sharing/__test__/UpdateShareDevice.test.js +307 -0
  47. package/src/screens/Sharing/hooks/index.js +5 -0
  48. package/src/screens/SubUnit/AddSubUnit.js +2 -6
  49. package/src/screens/SubUnit/EditSubUnitStyles.js +2 -1
  50. package/src/screens/Unit/AddMenu.js +1 -1
  51. package/src/screens/Unit/ManageUnitStyles.js +1 -1
  52. package/src/utils/I18n/translations/en.js +2 -0
  53. package/src/utils/I18n/translations/vi.js +2 -0
  54. package/src/utils/Route/index.js +2 -1
  55. package/src/commons/ActionGroup/OnOffTemplate/styles.js +0 -7
  56. package/src/screens/Sharing/Components/DeviceItem.js +0 -146
  57. package/src/screens/Sharing/Components/__test__/DeviceItem.test.js +0 -48
  58. package/src/screens/Sharing/SharingSelectPermission.js +0 -409
  59. 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
- });