@eohjsc/react-native-smart-city 0.2.82 → 0.2.85

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 (99) hide show
  1. package/assets/images/Event.svg +9 -0
  2. package/assets/images/brightness.svg +12 -0
  3. package/package.json +4 -2
  4. package/src/Images/Common/SuccessfullyConnected.svg +4 -0
  5. package/src/Images/Common/eye-closed.png +0 -0
  6. package/src/Images/Common/eye-closed@2x.png +0 -0
  7. package/src/Images/Common/eye-closed@3x.png +0 -0
  8. package/src/Images/Common/eye.png +0 -0
  9. package/src/Images/Common/eye@2x.png +0 -0
  10. package/src/Images/Common/eye@3x.png +0 -0
  11. package/src/commons/ActionGroup/CurtainButtonTemplate.js +32 -21
  12. package/src/commons/ActionGroup/LightActionTemplate.js +103 -0
  13. package/src/commons/ActionGroup/LightActionTemplateStyles.js +57 -0
  14. package/src/commons/ActionGroup/NumberUpDownActionTemplate.js +8 -6
  15. package/src/commons/ActionGroup/OnOffTemplate/OnOffButtonTemplate.js +33 -31
  16. package/src/commons/ActionGroup/OnOffTemplate/index.js +11 -3
  17. package/src/commons/ActionGroup/OneBigButtonTemplate.js +10 -7
  18. package/src/commons/ActionGroup/OptionsDropdownActionTemplate.js +5 -2
  19. package/src/commons/ActionGroup/StatesGridActionTemplate.js +7 -3
  20. package/src/commons/ActionGroup/ThreeButtonTemplate.js +33 -24
  21. package/src/commons/ActionGroup/__test__/LightActionTemplate.test.js +59 -0
  22. package/src/commons/ActionGroup/__test__/OnOffTemplate.test.js +18 -6
  23. package/src/commons/ActionGroup/__test__/OneBigButtonTemplate.test.js +9 -1
  24. package/src/commons/ActionGroup/__test__/OptionsDropdownTemplate.test.js +25 -13
  25. package/src/commons/ActionGroup/__test__/index.test.js +48 -14
  26. package/src/commons/ActionGroup/index.js +3 -0
  27. package/src/commons/Automate/ItemAutomate.js +1 -1
  28. package/src/commons/Automate/ItemAutomateStyles.js +5 -1
  29. package/src/commons/CardShadow/index.js +5 -2
  30. package/src/commons/CardShadow/styles.js +2 -3
  31. package/src/commons/ConnectingProcess/DeviceItem/DeviceItem.js +16 -0
  32. package/src/commons/ConnectingProcess/DeviceItem/DeviceItemStyles.js +42 -0
  33. package/src/commons/ConnectingProcess/__test__/Connecting.test.js +27 -0
  34. package/src/commons/ConnectingProcess/__test__/DeviceItem.test.js +18 -0
  35. package/src/commons/ConnectingProcess/index.js +202 -0
  36. package/src/commons/ConnectingProcess/styles.js +69 -0
  37. package/src/commons/Device/HorizontalBarChart.js +7 -1
  38. package/src/commons/Device/ItemDevice.js +8 -5
  39. package/src/commons/Device/LinearChart.js +1 -0
  40. package/src/commons/Device/WaterQualitySensor/ListQualityIndicator.js +1 -1
  41. package/src/commons/Device/WaterQualitySensor/QualityIndicatorsItem.js +1 -1
  42. package/src/commons/EmergencyButton/AlertSendConfirm.js +2 -2
  43. package/src/commons/EmergencyButton/AlertSent.js +2 -2
  44. package/src/commons/Form/TextInputPassword.js +1 -1
  45. package/src/commons/FullLoading/index.js +35 -0
  46. package/src/commons/SubUnit/Favorites/index.js +2 -0
  47. package/src/commons/SubUnit/OneTap/ItemOneTap.js +3 -0
  48. package/src/commons/SubUnit/ShortDetail.js +7 -1
  49. package/src/commons/index.js +2 -0
  50. package/src/configs/API.js +6 -4
  51. package/src/configs/Constants.js +25 -0
  52. package/src/configs/Images.js +2 -0
  53. package/src/context/actionType.ts +2 -0
  54. package/src/context/reducer.ts +10 -0
  55. package/src/hooks/Common/useBlockBackAndroid.js +3 -1
  56. package/src/iot/RemoteControl/Internet.js +8 -1
  57. package/src/iot/RemoteControl/index.js +4 -2
  58. package/src/navigations/AddDeviceStack.js +10 -0
  59. package/src/screens/AddCommon/SelectSubUnit.js +29 -6
  60. package/src/screens/AddCommon/SelectUnit.js +24 -2
  61. package/src/screens/AddCommon/__test__/SelectSubUnit.test.js +120 -1
  62. package/src/screens/AddCommon/__test__/SelectUnit.test.js +16 -1
  63. package/src/screens/AddNewAction/SelectAction.js +46 -28
  64. package/src/screens/AddNewAutoSmart/__test__/AddNewAutoSmart.test.js +3 -3
  65. package/src/screens/AddNewAutoSmart/index.js +18 -1
  66. package/src/screens/AddNewGateway/PlugAndPlay/ConnectWifiWarning.js +55 -16
  67. package/src/screens/AddNewGateway/PlugAndPlay/GatewayWifiList.js +52 -23
  68. package/src/screens/AddNewGateway/SelectGateway.js +132 -0
  69. package/src/screens/AddNewGateway/SelectGatewayStyles.js +55 -0
  70. package/src/screens/AddNewGateway/__test__/SetupGateway.test.js +0 -52
  71. package/src/screens/Device/EditDevice/__test__/EditDevice.test.js +2 -2
  72. package/src/screens/Device/EditDevice/index.js +2 -2
  73. package/src/screens/Device/__test__/detail.test.js +18 -11
  74. package/src/screens/Device/components/SensorConnectStatusViewHeader.js +2 -2
  75. package/src/screens/Device/components/SensorDisplayItem.js +2 -2
  76. package/src/screens/Device/detail.js +64 -26
  77. package/src/screens/Device/styles.js +2 -0
  78. package/src/screens/Notification/__test__/NotificationItem.test.js +197 -15
  79. package/src/screens/Notification/components/NotificationItem.js +188 -14
  80. package/src/screens/Notification/styles/NotificationItemStyles.js +3 -3
  81. package/src/screens/ScanChipQR/__test__/ScanChipQR.test.js +10 -7
  82. package/src/screens/ScanChipQR/hooks/index.js +48 -40
  83. package/src/screens/SubUnit/AddSubUnit.js +4 -1
  84. package/src/screens/SubUnit/__test__/AddSubUnit.test.js +148 -0
  85. package/src/screens/Unit/Detail.js +33 -1
  86. package/src/screens/Unit/ManageUnit.js +1 -1
  87. package/src/screens/Unit/ManageUnitStyles.js +0 -6
  88. package/src/screens/Unit/SmartAccount.js +5 -1
  89. package/src/screens/Unit/Summaries.js +2 -2
  90. package/src/screens/Unit/__test__/CheckSendEmail.test.js +10 -0
  91. package/src/screens/Unit/__test__/Detail.test.js +10 -0
  92. package/src/screens/Unit/components/__test__/SharedUnit.test.js +21 -2
  93. package/src/screens/UnitSummary/__test__/index.test.js +3 -3
  94. package/src/screens/UnitSummary/components/RunningDevices/__test__/index.test.js +2 -2
  95. package/src/screens/UnitSummary/index.js +52 -9
  96. package/src/utils/Apis/axios.js +1 -1
  97. package/src/utils/I18n/translations/en.json +16 -0
  98. package/src/utils/I18n/translations/vi.json +16 -1
  99. package/src/utils/Route/index.js +2 -0
@@ -58,11 +58,6 @@ const DeviceDetail = ({ route }) => {
58
58
  const [controlOptions, setControlOptions] = useState({
59
59
  internet: {},
60
60
  });
61
- // eslint-disable-next-line no-unused-vars
62
- const [loading, setLoading] = useState({
63
- isConnected: true,
64
- displayTemplate: true,
65
- });
66
61
  const [isConnected, setConnected] = useState(false);
67
62
  const [lastUpdated, setLastUpdated] = useState(null);
68
63
  const [lastEvent, setLastEvent] = useState({ id: 0, reportedAt: 0 });
@@ -70,12 +65,20 @@ const DeviceDetail = ({ route }) => {
70
65
  // eslint-disable-next-line no-unused-vars
71
66
  const [configValues, setConfigValues] = useConfigGlobalState('configValues');
72
67
 
73
- const { unit, sensor, isGGHomeConnected, station } = route.params;
74
- const [isFavourite, setIsFavourite] = useState(sensor.is_favourite);
75
- const { isOwner } = useIsOwnerOfUnit(unit.user_id);
68
+ const { unitData, unitId, sensorData, sensorId, isGGHomeConnected } =
69
+ route.params;
70
+ const [unit, setUnit] = useState(unitData || { id: unitId });
71
+ const [sensor, setSensor] = useState(sensorData || { id: sensorId });
72
+ const [station, setStation] = useState(sensor?.station);
73
+ const [isFavourite, setIsFavourite] = useState(sensor?.is_favourite);
74
+ const { isOwner } = useIsOwnerOfUnit(unit?.user_id);
76
75
  const [sensorName, setSensorName] = useState(sensor?.name);
77
76
  const [lockShowing, acquireLockShowing, releaseLockShowing] = useBoolean();
78
77
  const [showWindDirection, setShowWindDirection] = useState(false);
78
+ const [loading, setLoading] = useState({
79
+ isConnected: true,
80
+ displayTemplate: true,
81
+ });
79
82
 
80
83
  const isDeviceConnectedViaBle = useMemo(
81
84
  () => isDeviceConnected(sensor?.remote_control_options?.bluetooth?.address),
@@ -108,7 +111,7 @@ const DeviceDetail = ({ route }) => {
108
111
 
109
112
  const addToFavorites = useCallback(async () => {
110
113
  const { success } = await axiosPost(
111
- API.SENSOR.ADD_TO_FAVOURITES(unit.id, sensor.station.id, sensor.id)
114
+ API.SENSOR.ADD_TO_FAVOURITES(unit?.id, sensor?.station?.id, sensor?.id)
112
115
  );
113
116
  if (success) {
114
117
  setIsFavourite(true);
@@ -117,7 +120,11 @@ const DeviceDetail = ({ route }) => {
117
120
 
118
121
  const removeFromFavorites = useCallback(async () => {
119
122
  const { success } = await axiosPost(
120
- API.SENSOR.REMOVE_FROM_FAVOURITES(unit.id, sensor.station.id, sensor.id)
123
+ API.SENSOR.REMOVE_FROM_FAVOURITES(
124
+ unit?.id,
125
+ sensor?.station.id,
126
+ sensor?.id
127
+ )
121
128
  );
122
129
  if (success) {
123
130
  setIsFavourite(false);
@@ -129,9 +136,39 @@ const DeviceDetail = ({ route }) => {
129
136
  );
130
137
 
131
138
  const canManageSubUnit = useMemo(() => {
132
- return currentUserId === unit.user_id;
139
+ return currentUserId === unit?.user_id;
133
140
  }, [currentUserId, unit]);
134
141
 
142
+ const fetchUnitDetail = useCallback(async () => {
143
+ const { success, data } = await axiosGet(API.UNIT.UNIT_DETAIL(unit?.id));
144
+ if (success) {
145
+ setUnit(data);
146
+ }
147
+ }, [unit?.id]);
148
+
149
+ useEffect(() => {
150
+ if (!unitData && unitId) {
151
+ fetchUnitDetail();
152
+ }
153
+ }, [fetchUnitDetail, unitData, unitId]);
154
+
155
+ const fetchSensorDetail = useCallback(async () => {
156
+ const { success, data } = await axiosGet(
157
+ API.SENSOR.SENSOR_DETAIL(sensor?.id)
158
+ );
159
+ if (success) {
160
+ setSensor(data);
161
+ setSensorName(data.name);
162
+ setStation(data.station);
163
+ }
164
+ }, [sensor?.id]);
165
+
166
+ useEffect(() => {
167
+ if (!sensorData && sensorId) {
168
+ fetchSensorDetail();
169
+ }
170
+ }, [fetchSensorDetail, sensorData, sensorId]);
171
+
135
172
  const fetchDataDeviceDetail = useCallback(async () => {
136
173
  if (!token) {
137
174
  return;
@@ -141,7 +178,7 @@ const DeviceDetail = ({ route }) => {
141
178
  }
142
179
 
143
180
  const displayResult = await axiosGet(
144
- API.SENSOR.DISPLAY(sensor.id),
181
+ API.SENSOR.DISPLAY(sensor?.id),
145
182
  {},
146
183
  true
147
184
  );
@@ -168,7 +205,7 @@ const DeviceDetail = ({ route }) => {
168
205
  setLoading((preState) => ({ ...preState, displayTemplate: false }));
169
206
 
170
207
  const controlResult = await axiosGet(
171
- API.SENSOR.REMOTE_CONTROL_OPTIONS(sensor.id),
208
+ API.SENSOR.REMOTE_CONTROL_OPTIONS(sensor?.id),
172
209
  {},
173
210
  true
174
211
  );
@@ -212,12 +249,12 @@ const DeviceDetail = ({ route }) => {
212
249
  menuItems.push({
213
250
  route: Routes.ActivityLog,
214
251
  data: {
215
- id: sensor.id,
252
+ id: sensor?.id,
216
253
  type: 'action',
217
254
  share: unit,
218
255
  filterEnabled: {
219
256
  date: true,
220
- user: Boolean(unit.id),
257
+ user: Boolean(unit?.id),
221
258
  },
222
259
  },
223
260
  text: t('activity_log'),
@@ -352,7 +389,7 @@ const DeviceDetail = ({ route }) => {
352
389
 
353
390
  const fetchValues = async () => {
354
391
  const { success, data } = await axiosGet(
355
- API.SENSOR.DISPLAY_VALUES_V2(sensor.id),
392
+ API.SENSOR.DISPLAY_VALUES_V2(sensor?.id),
356
393
  {
357
394
  params: params,
358
395
  }
@@ -365,12 +402,13 @@ const DeviceDetail = ({ route }) => {
365
402
  }
366
403
  setLoading((preState) => ({ ...preState, isConnected: false }));
367
404
  };
368
- if (sensor.is_managed_by_backend && !sensor.is_other_device) {
405
+ if (sensor?.is_managed_by_backend && !sensor?.is_other_device) {
369
406
  const updateInterval = setInterval(() => fetchValues(), 5000);
370
407
  fetchValues();
371
408
  return () => clearInterval(updateInterval);
372
409
  } else {
373
- setLoading((preState) => ({ ...preState, isConnected: false }));
410
+ Object.keys(sensor).length > 1 &&
411
+ setLoading((preState) => ({ ...preState, isConnected: false }));
374
412
  }
375
413
  }, [sensor, display]);
376
414
 
@@ -405,12 +443,12 @@ const DeviceDetail = ({ route }) => {
405
443
  ).length > 0;
406
444
 
407
445
  const onSetupContacts = useCallback(() => {
408
- const group = unit.group;
446
+ const group = unit?.group;
409
447
  navigation.navigate(Routes.EmergencyContactsStack, {
410
448
  screen: Routes.EmergencyContactsList,
411
- params: { unitId: unit.id, group },
449
+ params: { unitId: unit?.id, group },
412
450
  });
413
- }, [navigation, unit.group, unit.id]);
451
+ }, [navigation, unit?.group, unit?.id]);
414
452
 
415
453
  // replace isConnected=True to see template
416
454
  const renderSensorConnected = () => {
@@ -448,12 +486,12 @@ const DeviceDetail = ({ route }) => {
448
486
 
449
487
  const getDataFromLocal = async () => {
450
488
  const displayData = await getLocalData(
451
- `@CACHE_REQUEST_${API.SENSOR.DISPLAY(sensor.id)}`
489
+ `@CACHE_REQUEST_${API.SENSOR.DISPLAY(sensor?.id)}`
452
490
  );
453
491
  displayData && setDisplay(JSON.parse(displayData));
454
492
 
455
493
  const controlOptionData = await getLocalData(
456
- `@CACHE_REQUEST_${API.SENSOR.REMOTE_CONTROL_OPTIONS(sensor.id)}`
494
+ `@CACHE_REQUEST_${API.SENSOR.REMOTE_CONTROL_OPTIONS(sensor?.id)}`
457
495
  );
458
496
  controlOptionData && setControlOptions(JSON.parse(controlOptionData));
459
497
  setLoading((preState) => ({ ...preState, displayTemplate: false }));
@@ -557,7 +595,7 @@ const DeviceDetail = ({ route }) => {
557
595
  onSendNowAlert={onSendNowAlert}
558
596
  onHide={releaseLockShowing}
559
597
  unit={unit}
560
- station={sensor.station}
598
+ station={sensor?.station}
561
599
  />
562
600
 
563
601
  <AlertSent
@@ -566,7 +604,7 @@ const DeviceDetail = ({ route }) => {
566
604
  onPressMain={onViewDetails}
567
605
  onHide={releaseLockShowing}
568
606
  unit={unit}
569
- station={sensor.station}
607
+ station={sensor?.station}
570
608
  />
571
609
  </WrapHeaderScrollable>
572
610
  {isShowEmergencyResolve && (
@@ -605,7 +643,7 @@ const DeviceDetail = ({ route }) => {
605
643
  type="H4"
606
644
  style={styles.textName}
607
645
  >
608
- {unit.name} - {sensor.station.name}
646
+ {unit?.name} - {sensor?.station?.name}
609
647
  </Text>
610
648
  <IconFill
611
649
  testID={TESTID.BUTTON_POPUP_RESOLVED_ICON}
@@ -70,6 +70,8 @@ export default StyleSheet.create({
70
70
  },
71
71
  simpleList: {
72
72
  height: '100%',
73
+ marginRight: 4,
74
+ marginLeft: 4,
73
75
  },
74
76
  headerRight: {
75
77
  flexDirection: 'row',
@@ -1,12 +1,14 @@
1
1
  import React from 'react';
2
2
  import { act, create } from 'react-test-renderer';
3
3
  import { TouchableOpacity } from 'react-native';
4
+ import axios from 'axios';
4
5
 
5
6
  import { SCProvider } from '../../../context';
6
7
  import { mockSCStore } from '../../../context/mockStore';
7
8
  import NotificationItem from '../components/NotificationItem';
8
9
  import { NOTIFICATION_TYPES } from '../../../configs/Constants';
9
10
  import Routes from '../../../utils/Route';
11
+ import { API } from '../../../configs';
10
12
 
11
13
  const wrapComponent = (item) => (
12
14
  <SCProvider initState={mockSCStore({})}>
@@ -14,6 +16,8 @@ const wrapComponent = (item) => (
14
16
  </SCProvider>
15
17
  );
16
18
 
19
+ jest.mock('axios');
20
+
17
21
  const mockNavigate = jest.fn();
18
22
  jest.mock('@react-navigation/native', () => {
19
23
  return {
@@ -27,11 +31,12 @@ jest.mock('@react-navigation/native', () => {
27
31
  describe('test NotificationItem', () => {
28
32
  let item = {};
29
33
  beforeEach(() => {
34
+ mockNavigate.mockClear();
30
35
  item = {
31
36
  id: 1,
32
37
  content_code: '',
33
38
  is_read: true,
34
- params: JSON.stringify({ booking_id: 1 }),
39
+ params: JSON.stringify({ booking_id: 1, booking_id_new: 1 }),
35
40
  created_at: '',
36
41
  icon: '',
37
42
  };
@@ -41,19 +46,94 @@ describe('test NotificationItem', () => {
41
46
  });
42
47
  let tree;
43
48
  const listCase = [
44
- NOTIFICATION_TYPES.REMIND_TO_MAKE_PAYMENT,
45
- NOTIFICATION_TYPES.EXPIRE_PARKING_SESSION,
46
- NOTIFICATION_TYPES.REMIND_TO_SCAN_QR_CODE,
47
- NOTIFICATION_TYPES.USER_CANCEL,
48
- NOTIFICATION_TYPES.SYSTEM_CANCEL_NO_PAYMENT,
49
- NOTIFICATION_TYPES.BOOKING_SUCCESSFULLY,
50
- NOTIFICATION_TYPES.PARKING_COMPLETED,
51
- NOTIFICATION_TYPES.BOOKING_EXPIRED_AND_VIOLATION_CREATED,
52
- NOTIFICATION_TYPES.MOVE_CAR_WITHOUT_PAY_VIOLATION,
53
- NOTIFICATION_TYPES.PAY_FINE_SUCCESSFULLY,
49
+ {
50
+ content_code: NOTIFICATION_TYPES.REMIND_TO_MAKE_PAYMENT,
51
+ screen: Routes.SmartParkingBookingDetails,
52
+ params: { id: 1 },
53
+ },
54
+ {
55
+ content_code: NOTIFICATION_TYPES.EXPIRE_PARKING_SESSION,
56
+ screen: Routes.SmartParkingBookingDetails,
57
+ params: { id: 1 },
58
+ },
59
+ {
60
+ content_code: NOTIFICATION_TYPES.REMIND_TO_SCAN_QR_CODE,
61
+ screen: Routes.SmartParkingBookingDetails,
62
+ params: { id: 1 },
63
+ },
64
+ {
65
+ content_code: NOTIFICATION_TYPES.USER_CANCEL,
66
+ screen: Routes.MyBookingList,
67
+ params: { tab: 1 },
68
+ },
69
+ {
70
+ content_code: NOTIFICATION_TYPES.SYSTEM_CANCEL_NO_PAYMENT,
71
+ screen: Routes.MyBookingList,
72
+ params: { tab: 1 },
73
+ },
74
+ {
75
+ content_code: NOTIFICATION_TYPES.BOOKING_SUCCESSFULLY,
76
+ screen: Routes.SmartParkingBookingDetails,
77
+ params: { id: 1 },
78
+ },
79
+ {
80
+ content_code: NOTIFICATION_TYPES.PARKING_COMPLETED,
81
+ screen: Routes.MyBookingList,
82
+ params: { tab: 1 },
83
+ },
84
+ {
85
+ content_code: NOTIFICATION_TYPES.BOOKING_EXPIRED_AND_VIOLATION_CREATED,
86
+ screen: Routes.SmartParkingBookingDetails,
87
+ params: { id: 1 },
88
+ },
89
+ {
90
+ content_code: NOTIFICATION_TYPES.MOVE_CAR_WITHOUT_PAY_VIOLATION,
91
+ screen: Routes.SmartParkingBookingDetails,
92
+ params: { id: 1 },
93
+ },
94
+ {
95
+ content_code: NOTIFICATION_TYPES.PAY_FINE_SUCCESSFULLY,
96
+ screen: Routes.SmartParkingBookingDetails,
97
+ params: { id: 1 },
98
+ },
99
+ {
100
+ content_code: NOTIFICATION_TYPES.STOP_VIOLATION_FREE_PARKING_ZONE,
101
+ screen: Routes.SmartParkingBookingDetails,
102
+ params: { id: 1 },
103
+ },
104
+ {
105
+ content_code: NOTIFICATION_TYPES.PAY_FINE_AND_EXTEND_SUCCESSFULLY,
106
+ screen: Routes.SmartParkingBookingDetails,
107
+ params: { id: 1 },
108
+ },
54
109
  ];
55
110
 
56
- for (const content_code of listCase) {
111
+ for (const notify of listCase) {
112
+ test(`create ItemNotification ${notify.content_code}`, () => {
113
+ item.content_code = notify.content_code;
114
+ act(() => {
115
+ tree = create(wrapComponent(item));
116
+ });
117
+ const instance = tree.root;
118
+ const button = instance.findByType(TouchableOpacity);
119
+ act(() => {
120
+ button.props.onPress();
121
+ });
122
+ expect(mockNavigate).toHaveBeenCalledWith(Routes.SmartParkingStack, {
123
+ screen: notify.screen,
124
+ params: notify.params,
125
+ });
126
+ });
127
+ }
128
+
129
+ const listCase2 = [
130
+ NOTIFICATION_TYPES.NOTIFY_REMOVE_UNIT,
131
+ NOTIFICATION_TYPES.NOTIFY_REMOVE_MEMBER,
132
+ NOTIFICATION_TYPES.NOTIFY_MEMBER_LEAVE_UNIT,
133
+ 'default case',
134
+ ];
135
+
136
+ for (const content_code of listCase2) {
57
137
  test(`create ItemNotification ${content_code}`, () => {
58
138
  item.content_code = content_code;
59
139
  act(() => {
@@ -64,12 +144,114 @@ describe('test NotificationItem', () => {
64
144
  act(() => {
65
145
  button.props.onPress();
66
146
  });
67
- expect(mockNavigate).toHaveBeenCalledWith(Routes.SmartParkingStack, {
68
- screens: Routes.SmartParkingBookingDetails,
147
+ expect(mockNavigate).not.toHaveBeenCalled();
148
+ });
149
+ }
150
+
151
+ const listSensorType = ['air_quality', 'turbidity', 'ph', 'clo', 'uv'];
152
+ for (const sensorType of listSensorType) {
153
+ test(`create ItemNotification NOTIFY_INDICATOR sensor_type ${sensorType}`, () => {
154
+ item.content_code = NOTIFICATION_TYPES.NOTIFY_INDICATOR;
155
+ item.params = JSON.stringify({
156
+ unit_name: 'EoH Office',
157
+ status: 'Very Poor',
158
+ sensor_type: sensorType,
159
+ unit_id: 5,
160
+ summary_id: 11,
161
+ sensor_id: '',
162
+ });
163
+
164
+ act(() => {
165
+ tree = create(wrapComponent(item));
166
+ });
167
+ const instance = tree.root;
168
+ const button = instance.findByType(TouchableOpacity);
169
+ act(() => {
170
+ button.props.onPress();
171
+ });
172
+ expect(mockNavigate).toHaveBeenCalledWith(Routes.UnitStack, {
173
+ screen: Routes.UnitSummary,
174
+ params: {
175
+ summaryId: 11,
176
+ unitId: 5,
177
+ },
178
+ });
179
+ });
180
+ }
181
+
182
+ const listSensorType2 = ['smoke', 'fire'];
183
+ for (const sensorType of listSensorType2) {
184
+ test(`create ItemNotification NOTIFY_INDICATOR sensor_type ${sensorType}`, () => {
185
+ item.content_code = NOTIFICATION_TYPES.NOTIFY_INDICATOR;
186
+ item.params = JSON.stringify({
187
+ unit_name: 'Lavida Smart Home',
188
+ status: '',
189
+ sensor_type: sensorType,
190
+ unit_id: 70,
191
+ summary_id: '',
192
+ sensor_id: 394,
193
+ });
194
+
195
+ act(() => {
196
+ tree = create(wrapComponent(item));
197
+ });
198
+ const instance = tree.root;
199
+ const button = instance.findByType(TouchableOpacity);
200
+ act(() => {
201
+ button.props.onPress();
202
+ });
203
+ expect(mockNavigate).toHaveBeenCalledWith(Routes.UnitStack, {
204
+ screen: Routes.DeviceDetail,
69
205
  params: {
70
- id: 1,
206
+ unitId: 70,
207
+ sensorId: 394,
71
208
  },
72
209
  });
73
210
  });
74
211
  }
212
+
213
+ test('test onClick Item Notify', () => {
214
+ item.content_code = NOTIFICATION_TYPES.NOTIFY_INDICATOR;
215
+ item.params = JSON.stringify({
216
+ unit_name: 'EoH Office',
217
+ status: 'Very Poor',
218
+ sensor_type: 'air_quality',
219
+ unit_id: 5,
220
+ summary_id: 11,
221
+ sensor_id: '',
222
+ });
223
+ item.is_read = false;
224
+ act(() => {
225
+ tree = create(wrapComponent(item));
226
+ });
227
+ const instance = tree.root;
228
+ const button = instance.findByType(TouchableOpacity);
229
+ act(() => {
230
+ button.props.onPress();
231
+ });
232
+ expect(axios.post).toHaveBeenCalledWith(API.NOTIFICATION.SET_READ(1));
233
+ expect(mockNavigate).toHaveBeenCalledWith(Routes.UnitStack, {
234
+ screen: Routes.UnitSummary,
235
+ params: {
236
+ summaryId: 11,
237
+ unitId: 5,
238
+ },
239
+ });
240
+ });
241
+
242
+ test('test render Notify not in any case', () => {
243
+ item.content_code = 'NEW CASE';
244
+ item.params = JSON.stringify({
245
+ unit_id: 1,
246
+ });
247
+ act(() => {
248
+ tree = create(wrapComponent(item));
249
+ });
250
+ const instance = tree.root;
251
+ const button = instance.findByType(TouchableOpacity);
252
+ act(() => {
253
+ button.props.onPress();
254
+ });
255
+ expect(mockNavigate).not.toHaveBeenCalledWith();
256
+ });
75
257
  });