@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.
Files changed (31) hide show
  1. package/package.json +1 -1
  2. package/src/commons/Action/ItemQuickAction.js +18 -1
  3. package/src/commons/Action/__test__/ItemQuickAction.test.js +18 -2
  4. package/src/commons/ActionGroup/NumberUpDownActionTemplate.js +5 -2
  5. package/src/commons/ActionGroup/OnOffTemplate/index.js +28 -10
  6. package/src/commons/ActionGroup/OptionsDropdownActionTemplate.js +15 -8
  7. package/src/commons/ActionGroup/StatesGridActionTemplate.js +19 -5
  8. package/src/commons/ActionTemplate/OnOffButtonAction.js +14 -5
  9. package/src/commons/ActionTemplate/__test__/OnOffButtonAction.test.js +23 -2
  10. package/src/commons/ActionTemplate/__test__/index.test.js +2 -0
  11. package/src/commons/ActionTemplate/index.js +1 -0
  12. package/src/commons/Automate/ItemAutomate.js +10 -1
  13. package/src/commons/OneTapTemplate/NumberUpDownActionTemplate.js +1 -1
  14. package/src/commons/Tabbar/__test__/index.test.js +97 -0
  15. package/src/configs/AccessibilityLabel.js +3 -0
  16. package/src/hoc/__test__/withRemoteControl.test.js +24 -0
  17. package/src/hooks/Common/__test__/useAndroidTranslucentStatusBar.test.js +55 -0
  18. package/src/hooks/Common/useDevicesStatus.js +19 -15
  19. package/src/hooks/__test__/useInitDeepLink.test.js +28 -0
  20. package/src/hooks/useReceiveNotifications.js +2 -4
  21. package/src/screens/AddNewAction/SelectAction.js +10 -1
  22. package/src/screens/ScriptDetail/__test__/index.test.js +35 -34
  23. package/src/screens/ScriptDetail/index.js +19 -10
  24. package/src/screens/Sharing/Components/{SensorItem.js → DeviceItem.js} +14 -20
  25. package/src/screens/Sharing/Components/Styles/{SensorItemStyles.js → DeviceItemStyles.js} +0 -0
  26. package/src/screens/Sharing/Components/__test__/{SensorItem.test.js → DeviceItem.test.js} +6 -6
  27. package/src/screens/Sharing/Components/index.js +2 -2
  28. package/src/screens/Sharing/SelectPermission.js +63 -68
  29. package/src/screens/Sharing/Styles/SelectPermissionStyles.js +2 -2
  30. package/src/screens/Sharing/__test__/SelectPermission.test.js +12 -12
  31. 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 [activeItemId, setActiveItemId] = useState(-1);
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].sensors) {
51
- const itemTemp = data[station].sensors[item];
52
- data[station].sensors[item] = {
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
- // Remove sensors when end_devices deloy production
71
+
72
72
  data[index] = {
73
73
  ...data[index],
74
74
  isChecked,
75
- devices: data[index]?.sensors.map((i) => ({
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.sensors.length) {
96
- station.isChecked = !station.sensors.some((i) => !i.isChecked);
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
- sensorId,
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 sensor = group.sensors.find((i) => i.id === sensorId);
114
- const child = sensor[`${isReadConfig ? 'read_configs' : 'actions'}`].find(
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
- sensor.isChecked = !(
120
- sensor.read_configs.some((i) => !i.isChecked) ||
121
- sensor.actions.some((i) => !i.isChecked)
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 onTickedSensor = (idGroup, sensorId, isChecked) => {
121
+ const onTickedDevice = (idGroup, deviceId, isChecked) => {
128
122
  let data = [...dataStationTemp];
129
123
  const group = data.find((i) => i.id === idGroup);
130
- const sensor = group.sensors.find((i) => i.id === sensorId);
124
+ const device = group.devices.find((i) => i.id === deviceId);
131
125
 
132
- sensor.isChecked = isChecked;
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 sensorIds = object_Ids(dataDeviceShared)?.sensorIds;
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 sensor_checked = [];
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].sensors) {
151
- const itemTemp = dataStations[station].sensors[item];
152
- dataStations[station].sensors[item] = {
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: sensorIds.includes(itemTemp?.id),
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].sensors[item]?.isChecked) {
177
- sensor_checked.push(dataStations[station].sensors[item]);
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?.sensors?.length === sensor_checked?.length &&
197
+ i?.devices?.length === device_checked?.length &&
193
198
  stationIds.includes(i.id),
194
199
  };
195
200
  });
196
- const sensorIdsDefault = object_Ids(data)?.sensorIds;
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
- sensorIdsDefault?.length === sensorIds?.length &&
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 GroupSenSorItem = ({ item = {} }) => {
210
- const { name = '', sensors = [], isChecked, id = '' } = item;
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.GroupSenSorItem}
222
+ titleStyle={styles.GroupDeviceItem}
218
223
  isChecked={isChecked}
219
224
  idGroup={id}
220
225
  />
221
- <View style={styles.wrapSensor}>
222
- {sensors?.map((i, index) => (
223
- <SensorItem
226
+ <View style={styles.wrapDevice}>
227
+ {devices?.map((i, index) => (
228
+ <DeviceItem
224
229
  item={i}
225
230
  key={i.id}
226
- isRenderSeparated={index !== sensors?.length - 1}
231
+ isRenderSeparated={index !== devices?.length - 1}
227
232
  onTickedChild={onTickedChild}
228
- onTickedSensor={onTickedSensor}
229
- titleGroup={name}
230
- activeItemId={activeItemId}
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.sensors) {
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
- if (arrIdControlTemp.length) {
259
+ arrIdControlTemp.length &&
256
260
  control_permissions.push({ id: item.id, values: arrIdControlTemp });
257
- }
258
261
 
259
- if (arrIdReadTemp.length) {
262
+ arrIdReadTemp.length &&
260
263
  read_permissions.push({ id: item.id, values: arrIdReadTemp });
261
- }
262
264
 
263
- if (
264
- !arrIdControlTemp.length &&
265
- !arrIdReadTemp.length &&
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
- if (success) {
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
- <GroupSenSorItem key={item.id} item={item} />
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, activeItemId]);
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
- if (success) {
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
- wrapSensor: {
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
- GroupSenSorItem: {
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 { SensorItem, TitleCheckBox } from '../Components';
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 listSensors = [
47
+ let listDevices = [
48
48
  {
49
49
  id: 204,
50
- name: 'sensor',
51
- sensors: [
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
- listSensors,
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: 'sensor',
144
- sensors: [
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 SensorItemElement = instance.findAllByType(SensorItem);
168
- expect(SensorItemElement).toHaveLength(1);
167
+ const DeviceItemElement = instance.findAllByType(DeviceItem);
168
+ expect(DeviceItemElement).toHaveLength(1);
169
169
  act(() => {
170
- SensorItemElement[0].props.onTickedChild(204, 123, 137, true, true);
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: 'sensor',
202
- sensors: [
201
+ name: 'device',
202
+ devices: [
203
203
  {
204
204
  actions: [{ id: 136, isChecked: true, name: 'action 1' }],
205
205
  id: 123,
@@ -110,24 +110,23 @@ export const removeFromString = (str, index) => {
110
110
 
111
111
  export const object_Ids = (data) => {
112
112
  let stationIds = [];
113
- let sensorIds = [];
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?.sensors?.forEach((sensor) => {
120
- sensorIds.push(sensor?.id);
121
- sensor?.actions?.forEach((action) => {
119
+ station?.devices?.forEach((device) => {
120
+ deviceIds.push(device?.id);
121
+ device?.actions?.forEach((action) => {
122
122
  actionIds.push(action?.id);
123
123
  });
124
- sensor?.read_configs?.forEach((config) => {
124
+ device?.read_configs?.forEach((config) => {
125
125
  configIds.push(config?.id);
126
126
  });
127
127
  });
128
128
  });
129
- const listObject = { stationIds, sensorIds, actionIds, configIds } || {};
130
- return listObject;
129
+ return { stationIds, deviceIds, actionIds, configIds } || {};
131
130
  };
132
131
 
133
132
  export const notImplemented = (t) => {