@eohjsc/react-native-smart-city 0.3.62 → 0.3.64

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 (78) hide show
  1. package/package.json +1 -1
  2. package/src/commons/Dashboard/MyPinnedSharedUnit/index.js +10 -0
  3. package/src/commons/Dashboard/MyUnit/index.js +9 -3
  4. package/src/commons/Device/HorizontalBarChart.js +3 -3
  5. package/src/commons/Device/WindSpeed/Anemometer/index.js +10 -26
  6. package/src/commons/FourButtonFilterHistory/index.js +1 -1
  7. package/src/configs/API.js +14 -0
  8. package/src/configs/Constants.js +1 -0
  9. package/src/context/actionType.ts +1 -0
  10. package/src/context/reducer.ts +10 -0
  11. package/src/navigations/AllGatewayStack.js +19 -9
  12. package/src/navigations/UnitStack.js +1 -1
  13. package/src/screens/AllGateway/DetailConfigActionInternal/__test__/index.test.js +104 -0
  14. package/src/screens/AllGateway/DetailConfigActionInternal/index.js +97 -0
  15. package/src/screens/{Gateway/DetailConfigActionModbus → AllGateway/DetailConfigActionInternal}/styles.js +0 -0
  16. package/src/screens/{Gateway → AllGateway}/DetailConfigActionModbus/__test__/index.test.js +0 -0
  17. package/src/screens/{Gateway → AllGateway}/DetailConfigActionModbus/index.js +0 -0
  18. package/src/screens/{Gateway/DeviceGatewayInfo → AllGateway/DetailConfigActionModbus}/styles.js +0 -0
  19. package/src/screens/{Gateway → AllGateway}/DetailConfigActionZigbee/__test__/index.test.js +0 -0
  20. package/src/screens/{Gateway → AllGateway}/DetailConfigActionZigbee/index.js +0 -0
  21. package/src/screens/{Gateway → AllGateway}/DetailConfigActionZigbee/styles.js +0 -0
  22. package/src/screens/{Gateway → AllGateway}/DeviceGatewayInfo/__test__/index.test.js +0 -0
  23. package/src/screens/{Gateway → AllGateway}/DeviceGatewayInfo/index.js +26 -2
  24. package/src/screens/{Gateway/GatewayInfo → AllGateway/DeviceGatewayInfo}/styles.js +0 -0
  25. package/src/screens/AllGateway/DeviceInternalDetail/__test__/index.test.js +387 -0
  26. package/src/screens/AllGateway/DeviceInternalDetail/index.js +188 -0
  27. package/src/screens/{Gateway/DeviceModbusDetail → AllGateway/DeviceInternalDetail}/styles.js +0 -0
  28. package/src/screens/{Gateway → AllGateway}/DeviceModbusDetail/__test__/index.test.js +0 -0
  29. package/src/screens/{Gateway → AllGateway}/DeviceModbusDetail/index.js +9 -17
  30. package/src/screens/{Gateway/DeviceZigbeeDetail → AllGateway/DeviceModbusDetail}/styles.js +0 -0
  31. package/src/screens/{Gateway → AllGateway}/DeviceZigbeeDetail/__test__/index.test.js +0 -0
  32. package/src/screens/{Gateway → AllGateway}/DeviceZigbeeDetail/index.js +9 -17
  33. package/src/screens/{Gateway/GatewayDetail → AllGateway/DeviceZigbeeDetail}/styles.js +0 -0
  34. package/src/screens/{Gateway → AllGateway}/GatewayConnectionMethods/__test__/index.test.js +0 -0
  35. package/src/screens/{Gateway → AllGateway}/GatewayConnectionMethods/index.js +0 -0
  36. package/src/screens/{Gateway → AllGateway}/GatewayConnectionMethods/styles.js +0 -0
  37. package/src/screens/{Gateway → AllGateway}/GatewayDetail/__test__/index.test.js +71 -31
  38. package/src/screens/{Gateway → AllGateway}/GatewayDetail/index.js +62 -42
  39. package/src/screens/AllGateway/GatewayDetail/styles.js +12 -0
  40. package/src/screens/{Gateway → AllGateway}/GatewayInfo/__test__/index.test.js +0 -0
  41. package/src/screens/{Gateway → AllGateway}/GatewayInfo/index.js +14 -17
  42. package/src/screens/AllGateway/GatewayInfo/styles.js +12 -0
  43. package/src/screens/{Gateway → AllGateway}/__test__/index.test.js +0 -0
  44. package/src/screens/{Gateway → AllGateway}/components/Detail/__test__/index.test.js +0 -0
  45. package/src/screens/{Gateway → AllGateway}/components/Detail/index.js +0 -0
  46. package/src/screens/{Gateway → AllGateway}/components/Detail/styles.js +0 -0
  47. package/src/screens/{Gateway → AllGateway}/components/DetailActionModbus/__test__/index.test.js +0 -0
  48. package/src/screens/{Gateway → AllGateway}/components/DetailActionModbus/index.js +0 -0
  49. package/src/screens/{Gateway → AllGateway}/components/DetailActionModbus/styles.js +0 -0
  50. package/src/screens/{Gateway → AllGateway}/components/DetailConfigAction/__test__/index.test.js +0 -0
  51. package/src/screens/{Gateway → AllGateway}/components/DetailConfigAction/index.js +0 -0
  52. package/src/screens/{Gateway → AllGateway}/components/DetailConfigAction/styles.js +0 -0
  53. package/src/screens/{Gateway → AllGateway}/components/GatewayItem/__test__/index.test.js +0 -0
  54. package/src/screens/{Gateway → AllGateway}/components/GatewayItem/index.js +0 -0
  55. package/src/screens/{Gateway → AllGateway}/components/GatewayItem/styles.js +0 -0
  56. package/src/screens/{Gateway → AllGateway}/components/Information/__test__/index.test.js +0 -0
  57. package/src/screens/{Gateway → AllGateway}/components/Information/index.js +0 -0
  58. package/src/screens/{Gateway → AllGateway}/components/Information/styles.js +0 -0
  59. package/src/screens/{Gateway → AllGateway}/components/RowItem/__test__/index.test.js +0 -0
  60. package/src/screens/{Gateway → AllGateway}/components/RowItem/index.js +0 -0
  61. package/src/screens/{Gateway → AllGateway}/components/RowItem/styles.js +0 -0
  62. package/src/screens/{Gateway → AllGateway}/components/TabPaneCT/__test__/index.test.js +0 -0
  63. package/src/screens/{Gateway → AllGateway}/components/TabPaneCT/index.js +0 -0
  64. package/src/screens/{Gateway → AllGateway}/components/TabPaneCT/styles.js +0 -0
  65. package/src/screens/{Gateway → AllGateway}/hooks/__test__/index.test.js +15 -2
  66. package/src/screens/{Gateway → AllGateway}/hooks/useGateway.js +91 -11
  67. package/src/screens/{Gateway → AllGateway}/index.js +2 -2
  68. package/src/screens/{Gateway → AllGateway}/styles.js +0 -0
  69. package/src/screens/{Gateway → AllGateway}/utils/index.js +0 -0
  70. package/src/screens/Device/__test__/DetailHistoryChart.test.js +25 -10
  71. package/src/screens/Device/components/DetailHistoryChart.js +72 -22
  72. package/src/screens/WaterQualityGuide/__test__/index.test.js +8 -8
  73. package/src/screens/WaterQualityGuide/index.js +32 -53
  74. package/src/utils/Functions/preloadImages.js +39 -0
  75. package/src/utils/I18n/translations/en.json +21 -16
  76. package/src/utils/I18n/translations/vi.json +21 -19
  77. package/src/utils/Route/index.js +2 -0
  78. package/src/utils/Storage.js +6 -0
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@eohjsc/react-native-smart-city",
3
3
  "title": "React Native Smart Home",
4
- "version": "0.3.62",
4
+ "version": "0.3.64",
5
5
  "description": "TODO",
6
6
  "main": "index.js",
7
7
  "files": [
@@ -11,6 +11,8 @@ import { AccessibilityLabel } from '../../../configs/Constants';
11
11
  import { useTranslations } from '../../../hooks/Common/useTranslations';
12
12
  import SharedUnit from '../../Unit/SharedUnit';
13
13
  import { fetchWithCache } from '../../../utils/Apis/axios';
14
+ import { preloadImagesFromUnits } from '../../../utils/Functions/preloadImages';
15
+ import { STORAGE_KEY } from '../../../utils/Storage';
14
16
 
15
17
  const MyPinnedSharedUnit = ({ refreshing }) => {
16
18
  const t = useTranslations();
@@ -40,6 +42,14 @@ const MyPinnedSharedUnit = ({ refreshing }) => {
40
42
  }
41
43
  }, [fetchSharedUnitDashboard, isFocused, refreshing]);
42
44
 
45
+ useEffect(() => {
46
+ sharedUnits?.length &&
47
+ preloadImagesFromUnits(
48
+ sharedUnits,
49
+ STORAGE_KEY.IS_FIRST_TIME_LOAD_MY_SHARE_UNIT
50
+ );
51
+ }, [sharedUnits]);
52
+
43
53
  return (
44
54
  <>
45
55
  <Section>
@@ -30,6 +30,8 @@ import Carousel from 'react-native-snap-carousel';
30
30
  import { AccessibilityLabel, DEVICE_TYPE } from '../../../configs/Constants';
31
31
  import Routes from '../../../utils/Route';
32
32
  import MyUnitDevice from '../../../screens/Unit/components/MyUnitDevice';
33
+ import { STORAGE_KEY } from '../../../utils/Storage';
34
+ import { preloadImagesFromUnits } from '../../../utils/Functions/preloadImages';
33
35
 
34
36
  let screenWidth = Dimensions.get('window').width;
35
37
 
@@ -106,12 +108,11 @@ const MyUnit = ({ refreshing }) => {
106
108
  useWatchConfigs(configsNeedWatching);
107
109
 
108
110
  const goToDetail = useCallback(
109
- (item) => {
111
+ (item) => () => {
110
112
  navigation.navigate(Routes.UnitStack, {
111
113
  screen: Routes.UnitDetail,
112
114
  params: {
113
115
  unitId: item.id,
114
- unitData: item,
115
116
  },
116
117
  });
117
118
  },
@@ -130,7 +131,7 @@ const MyUnit = ({ refreshing }) => {
130
131
  }}
131
132
  >
132
133
  <TouchableOpacity
133
- onPress={() => goToDetail(item)}
134
+ onPress={goToDetail(item)}
134
135
  style={styles.btnItem}
135
136
  activeOpacity={0.75}
136
137
  accessibilityLabel={`${AccessibilityLabel.MY_UNIT_GO_TO_DETAIL}-${index}`}
@@ -153,6 +154,11 @@ const MyUnit = ({ refreshing }) => {
153
154
  [myUnits, goToDetail]
154
155
  );
155
156
 
157
+ useEffect(() => {
158
+ myUnits?.length &&
159
+ preloadImagesFromUnits(myUnits, STORAGE_KEY.IS_FIRST_TIME_LOAD_MY_UNITS);
160
+ }, [myUnits]);
161
+
156
162
  return (
157
163
  <>
158
164
  <Section style={styles.boxTxtMyUnit}>
@@ -105,7 +105,7 @@ const HorizontalBarChart = memo(({ datas, config }) => {
105
105
  });
106
106
 
107
107
  const heightChart = useMemo(() => {
108
- const dataX = datas[0].data.map((item) => item.x);
108
+ const dataX = (datas[0]?.data || []).map((item) => item.x);
109
109
  return dataX.length > 1
110
110
  ? dataX.length === 2
111
111
  ? dataX.length * 55 + 30
@@ -114,13 +114,13 @@ const HorizontalBarChart = memo(({ datas, config }) => {
114
114
  }, [datas]);
115
115
 
116
116
  useEffect(() => {
117
- const dataY = datas[0].data.map((item, index) => {
117
+ const dataY = (datas[0]?.data || []).map((item, index) => {
118
118
  return {
119
119
  color: index % 2 === 0 ? Colors.Primary + '20' : Colors.Primary + '16',
120
120
  y: item.y,
121
121
  };
122
122
  });
123
- const dataX = datas[0].data.map((item) => item.x);
123
+ const dataX = (datas[0].data || []).map((item) => item.x);
124
124
  const maxY = getMaxValueIndex(dataY);
125
125
  if (!isEmpty(maxY.max)) {
126
126
  dataY.splice(maxY._index, 1, { ...maxY.max, color: Colors.Primary });
@@ -1,5 +1,5 @@
1
1
  import React, { memo, useCallback } from 'react';
2
- import Svg, { Path, Text, G, Circle } from 'react-native-svg';
2
+ import Svg, { Path, Text, Circle } from 'react-native-svg';
3
3
  import { View, StyleSheet } from 'react-native';
4
4
 
5
5
  import {
@@ -28,6 +28,8 @@ const Anemometer = memo(
28
28
  };
29
29
 
30
30
  const value = data.length ? data[0].value : 0;
31
+ const measure = data.length ? data[0].measure : 'm/s';
32
+
31
33
  const radius = (size - strokeWidth) / 2;
32
34
  const viewBox = `0 0 ${width} ${width}`;
33
35
  const d = drawArc(center.x, center.y, radius, startAngle, endAngle);
@@ -35,8 +37,6 @@ const Anemometer = memo(
35
37
  const strokeAngle = (endAngle - startAngle) / numberOfSection;
36
38
  const strokeLength = (strokeAngle * circumference) / 360 - 1;
37
39
  const strokeDasharrayBg = `${strokeLength} 1`;
38
- const totalAngle = (3 * PI) / 2;
39
- const alpha = (value * totalAngle) / maxValue;
40
40
  const arc = circumference * 0.75;
41
41
  const offset = arc - (value / maxValue) * arc;
42
42
 
@@ -116,7 +116,6 @@ const Anemometer = memo(
116
116
  maxValue,
117
117
  txtColor,
118
118
  ]);
119
- const needleAngle = -21 + (alpha / PI) * 180;
120
119
 
121
120
  return (
122
121
  <View style={styles.standard}>
@@ -145,10 +144,11 @@ const Anemometer = memo(
145
144
  />
146
145
  {textAngles()}
147
146
  <Text
148
- fill={Colors.Gray8}
149
- fontSize="24"
147
+ fill={Colors.Lime6}
148
+ fontSize={48}
149
+ fontWeight="bold"
150
150
  x={width / 2}
151
- y={width / 2 + 64}
151
+ y={width / 2 + 16}
152
152
  textAnchor="middle"
153
153
  fontFamily={Fonts.Regular}
154
154
  >
@@ -156,30 +156,14 @@ const Anemometer = memo(
156
156
  </Text>
157
157
  <Text
158
158
  fill={Colors.Gray8}
159
- fontSize="16"
159
+ fontSize={16}
160
160
  x={width / 2}
161
- y={width / 2 + 88}
161
+ y={width / 2 + 64}
162
162
  textAnchor="middle"
163
163
  fontFamily={Fonts.Regular}
164
164
  >
165
- m/s
165
+ {measure}
166
166
  </Text>
167
-
168
- <G
169
- x={width / 2 - 50}
170
- y={width / 2 - 12}
171
- rotation={needleAngle}
172
- origin="50,10."
173
- >
174
- <Path
175
- fillRule="evenodd"
176
- clipRule="evenodd"
177
- // eslint-disable-next-line max-len
178
- d="M6.75518 30.5986L46.6732 5.59447C49.7242 3.68338 53.7596 4.87054 55.2897 8.12934C56.8321 11.4146 55.1275 15.3065 51.667 16.4005L6.75518 30.5986Z"
179
- fill="#595959"
180
- />
181
- <Circle cx={49.5} cy={10.5762} r={3.5} fill="white" />
182
- </G>
183
167
  </Svg>
184
168
  </View>
185
169
  );
@@ -47,7 +47,7 @@ const FourButtonFilterHistory = memo(({ groupBy, setGroupBy }) => {
47
47
 
48
48
  const onPressButton = useCallback(
49
49
  (data) => () => {
50
- setGroupBy(data);
50
+ setGroupBy && setGroupBy(data);
51
51
  },
52
52
  [setGroupBy]
53
53
  );
@@ -219,6 +219,20 @@ const API = {
219
219
  DETAIL: (id) => `/chip_manager/developer_mode_chips/${id}/`,
220
220
  REBOOT: (id) => `/chip_manager/developer_mode_chips/${id}/reboot_chip/`,
221
221
  },
222
+ ARDUINO: {
223
+ DEVICE: (gatewayId) =>
224
+ `/iot/modules/arduino/gateways/${gatewayId}/devices/`,
225
+ DEVICE_DETAIL: (gatewayId, deviceId) =>
226
+ `/iot/modules/arduino/gateways/${gatewayId}/devices/${deviceId}/`,
227
+ CONFIG_PINS: (gatewayId, deviceId) =>
228
+ `/iot/modules/arduino/gateways/${gatewayId}/devices/${deviceId}/pins/`,
229
+ CONFIG_PIN_DETAIL: (gatewayId, deviceId, configPinId) =>
230
+ `/iot/modules/arduino/gateways/${gatewayId}/devices/${deviceId}/pins/${configPinId}/`,
231
+ ACTION: (gatewayId, deviceId) =>
232
+ `/iot/modules/arduino/gateways/${gatewayId}/devices/${deviceId}/actions/`,
233
+ ACTION_DETAIL: (gatewayId, deviceId, actionId) =>
234
+ `/iot/modules/arduino/gateways/${gatewayId}/devices/${deviceId}/actions/${actionId}/`,
235
+ },
222
236
  ZIGBEE: {
223
237
  SEARCH_DEVICE: (id) => `/iot/modules/zigbee/chips/${id}/search_device/`,
224
238
  DEVICE_CONFIGURATION: (id, deviceId) =>
@@ -83,6 +83,7 @@ export const DEVICE_TYPE = {
83
83
  GOOGLE_HOME: 'GOOGLE_HOME',
84
84
  WIFI_DEVICE: 'WIFI_DEVICE',
85
85
  MODBUS: 'MODBUS',
86
+ INTERNAL: 'INTERNAL',
86
87
  };
87
88
  export const PERMISSION_TYPE = {
88
89
  ACTION: 'ACTION',
@@ -37,6 +37,7 @@ export const Action = {
37
37
  SET_WIDGET_DRAGGING: 'SET_WIDGET_DRAGGING',
38
38
  SET_IS_EDITING_TEMPLATE: 'SET_IS_EDITING_TEMPLATE',
39
39
  SET_IS_IN_EDIT_TEMPLATE_SCREEN: 'SET_IS_IN_EDIT_TEMPLATE_SCREEN',
40
+ LOGOUT: 'LOGOUT',
40
41
  };
41
42
 
42
43
  export type AuthData = {
@@ -15,6 +15,7 @@ import {
15
15
  BluetoothType,
16
16
  } from './actionType';
17
17
  import { uniq, reduce } from 'lodash';
18
+ import { STORAGE_KEY, removeMultiple } from '../utils/Storage.js';
18
19
 
19
20
  export type ContextData = {
20
21
  auth: AuthData;
@@ -481,6 +482,15 @@ export const reducer = (currentState: ContextData, action: Action) => {
481
482
  },
482
483
  };
483
484
 
485
+ case Action.LOGOUT:
486
+ removeMultiple([
487
+ STORAGE_KEY.IS_FIRST_TIME_LOAD_MY_UNITS,
488
+ STORAGE_KEY.IS_FIRST_TIME_LOAD_MY_SHARE_UNIT,
489
+ ]);
490
+ return {
491
+ ...currentState,
492
+ };
493
+
484
494
  default:
485
495
  return currentState;
486
496
  }
@@ -1,15 +1,17 @@
1
1
  import React, { memo } from 'react';
2
2
  import { createStackNavigator } from '@react-navigation/stack';
3
3
 
4
- import GatewayDetail from '../screens/Gateway/GatewayDetail';
5
- import GatewayInfo from '../screens/Gateway/GatewayInfo';
6
- import GatewayConnectionMethods from '../screens/Gateway/GatewayConnectionMethods';
7
- import DeviceZigbeeDetail from '../screens/Gateway/DeviceZigbeeDetail';
8
- import DeviceGatewayInfo from '../screens/Gateway/DeviceGatewayInfo';
9
- import DetailConfigActionZigbee from '../screens/Gateway/DetailConfigActionZigbee';
10
- import DeviceModbusDetail from '../screens/Gateway/DeviceModbusDetail';
11
- import DetailConfigActionModbus from '../screens/Gateway/DetailConfigActionModbus';
12
- import DetailChildConfigActionModbus from '../screens/Gateway/DetailConfigActionModbus';
4
+ import GatewayDetail from '../screens/AllGateway/GatewayDetail';
5
+ import GatewayInfo from '../screens/AllGateway/GatewayInfo';
6
+ import GatewayConnectionMethods from '../screens/AllGateway/GatewayConnectionMethods';
7
+ import DeviceZigbeeDetail from '../screens/AllGateway/DeviceZigbeeDetail';
8
+ import DeviceInternalDetail from '../screens/AllGateway/DeviceInternalDetail';
9
+ import DeviceGatewayInfo from '../screens/AllGateway/DeviceGatewayInfo';
10
+ import DetailConfigActionZigbee from '../screens/AllGateway/DetailConfigActionZigbee';
11
+ import DeviceModbusDetail from '../screens/AllGateway/DeviceModbusDetail';
12
+ import DetailConfigActionModbus from '../screens/AllGateway/DetailConfigActionModbus';
13
+ import DetailChildConfigActionModbus from '../screens/AllGateway/DetailConfigActionModbus';
14
+ import DetailConfigActionInterval from '../screens/AllGateway/DetailConfigActionInternal';
13
15
  import Route from '../utils/Route'; // utils/Route
14
16
  import { screenOptions } from './utils';
15
17
 
@@ -33,6 +35,10 @@ export const AllGatewayStack = memo(() => {
33
35
  component={GatewayConnectionMethods}
34
36
  name={Route.GatewayConnectionMethods}
35
37
  />
38
+ <Stack.Screen
39
+ component={DeviceInternalDetail}
40
+ name={Route.DeviceInternalDetail}
41
+ />
36
42
  <Stack.Screen
37
43
  component={DeviceZigbeeDetail}
38
44
  name={Route.DeviceZigbeeDetail}
@@ -45,6 +51,10 @@ export const AllGatewayStack = memo(() => {
45
51
  component={DetailConfigActionZigbee}
46
52
  name={Route.DetailConfigActionZigbee}
47
53
  />
54
+ <Stack.Screen
55
+ component={DetailConfigActionInterval}
56
+ name={Route.DetailConfigActionInterval}
57
+ />
48
58
  <Stack.Screen
49
59
  component={DetailConfigActionModbus}
50
60
  name={Route.DetailConfigActionModbus}
@@ -53,7 +53,7 @@ import EmergencySetting from '../screens/EmergencySetting';
53
53
  import ConfirmUnitDeletion from '../screens/ConfirmUnitDeletion';
54
54
  import InfoMemberUnit from '../screens/Sharing/InfoMemberUnit';
55
55
  import EnterPassword from '../screens/EnterPassword';
56
- import AllGateway from '../screens/Gateway';
56
+ import AllGateway from '../screens/AllGateway';
57
57
  import SelectAddToFavorites from '../screens/Unit/SelectAddToFavorites';
58
58
  import { HanetCameraStack } from './HanetCameraStack';
59
59
  import { axiosGet, fetchWithCache } from '../utils/Apis/axios';
@@ -0,0 +1,104 @@
1
+ import React from 'react';
2
+ import { create, act } from 'react-test-renderer';
3
+ import { useRoute } from '@react-navigation/native';
4
+
5
+ import { SCProvider } from '../../../../context';
6
+ import { mockSCStore } from '../../../../context/mockStore';
7
+ import DetailConfigAction from '../../components/DetailConfigAction';
8
+ import DetailConfigActionInternal from '..';
9
+
10
+ const wrapComponent = () => (
11
+ <SCProvider initState={mockSCStore({})}>
12
+ <DetailConfigActionInternal />
13
+ </SCProvider>
14
+ );
15
+
16
+ jest.mock('@react-navigation/native', () => {
17
+ return {
18
+ ...jest.requireActual('@react-navigation/native'),
19
+ useRoute: jest.fn(),
20
+ };
21
+ });
22
+
23
+ const mockNavigate = jest.fn();
24
+ jest.mock('@react-navigation/native', () => {
25
+ return {
26
+ ...jest.requireActual('@react-navigation/native'),
27
+ useNavigation: () => ({
28
+ navigate: mockNavigate,
29
+ pop: jest.fn(),
30
+ }),
31
+ useRoute: jest.fn(),
32
+ useIsFocused: () => true,
33
+ };
34
+ });
35
+
36
+ describe('Test DetailConfigActionInternal', () => {
37
+ let tree;
38
+ it('test render DetailConfigActionInternal isConfigRead', async () => {
39
+ useRoute.mockReturnValue({
40
+ params: {
41
+ isConfigRead: true,
42
+ isConfigWrite: false,
43
+ isAction: false,
44
+ itemActionConfig: {
45
+ id: 1,
46
+ config: { name: 'config1' },
47
+ value_type: 'boolean',
48
+ pin_number: 0,
49
+ pin_mode: 1,
50
+ },
51
+ },
52
+ });
53
+ await act(async () => {
54
+ tree = await create(wrapComponent());
55
+ });
56
+ const instance = tree.root;
57
+ const detailConfigAction = instance?.findAllByType(DetailConfigAction);
58
+ expect(detailConfigAction).toHaveLength(1);
59
+ });
60
+ it('test render DetailConfigActionInternal isConfigWrite', async () => {
61
+ useRoute.mockReturnValue({
62
+ params: {
63
+ isConfigRead: false,
64
+ isConfigWrite: true,
65
+ isAction: false,
66
+ itemActionConfig: {
67
+ id: 1,
68
+ config: { name: 'config1' },
69
+ value_type: 'boolean',
70
+ pin_number: 0,
71
+ pin_mode: 1,
72
+ },
73
+ },
74
+ });
75
+ await act(async () => {
76
+ tree = await create(wrapComponent());
77
+ });
78
+ const instance = tree.root;
79
+ const detailConfigAction = instance?.findAllByType(DetailConfigAction);
80
+ expect(detailConfigAction).toHaveLength(1);
81
+ });
82
+ it('test render DetailConfigActionInternal isAction', async () => {
83
+ useRoute.mockReturnValue({
84
+ params: {
85
+ isConfigRead: false,
86
+ isConfigWrite: false,
87
+ isAction: true,
88
+ isChildAction: false,
89
+ itemActionConfig: {
90
+ id: 1,
91
+ action: { name: 'config1' },
92
+ pin: 'boolean',
93
+ default_value: 0,
94
+ },
95
+ },
96
+ });
97
+ await act(async () => {
98
+ tree = await create(wrapComponent());
99
+ });
100
+ const instance = tree.root;
101
+ const detailConfigAction = instance?.findAllByType(DetailConfigAction);
102
+ expect(detailConfigAction).toHaveLength(1);
103
+ });
104
+ });
@@ -0,0 +1,97 @@
1
+ import React, { memo, useMemo } from 'react';
2
+ import { View } from 'react-native';
3
+ import { useRoute } from '@react-navigation/native';
4
+
5
+ import styles from './styles';
6
+ import DetailConfigAction from '../components/DetailConfigAction';
7
+
8
+ const DetailConfigActionInternal = () => {
9
+ const { params = {} } = useRoute();
10
+ const {
11
+ device = {},
12
+ itemActionConfig,
13
+ isConfigRead,
14
+ isConfigWrite,
15
+ isAction,
16
+ } = params;
17
+
18
+ const listData = useMemo(() => {
19
+ if (isConfigRead || isConfigWrite) {
20
+ return [
21
+ {
22
+ id: 1,
23
+ title: 'config_name',
24
+ data: itemActionConfig?.config?.name || '--',
25
+ },
26
+ {
27
+ id: 2,
28
+ title: 'config_type',
29
+ data:
30
+ itemActionConfig?.value_type === 'boolean'
31
+ ? 'Digital'
32
+ : itemActionConfig?.value_type === 'integer'
33
+ ? 'Analog'
34
+ : '--',
35
+ },
36
+ {
37
+ id: 3,
38
+ title: 'pin',
39
+ data: itemActionConfig?.pin_number || '0',
40
+ },
41
+ {
42
+ id: 4,
43
+ title: 'pin_mode',
44
+ data: itemActionConfig?.pin_mode || '--',
45
+ },
46
+ ];
47
+ }
48
+ if (isAction) {
49
+ return [
50
+ {
51
+ id: 1,
52
+ title: 'action_name',
53
+ data: itemActionConfig?.action?.name || '--',
54
+ },
55
+ {
56
+ id: 2,
57
+ title: 'pin_number',
58
+ data: itemActionConfig?.pin || '0',
59
+ },
60
+ {
61
+ id: 3,
62
+ title: 'default_value',
63
+ data: itemActionConfig?.default_value || '--',
64
+ },
65
+ ];
66
+ }
67
+ return [];
68
+ }, [isAction, isConfigRead, isConfigWrite, itemActionConfig]);
69
+
70
+ const title = useMemo(
71
+ () =>
72
+ ((isConfigRead || isConfigWrite) && itemActionConfig?.config?.name) ||
73
+ (isAction && itemActionConfig?.action?.name) ||
74
+ '',
75
+ [
76
+ isConfigRead,
77
+ isConfigWrite,
78
+ itemActionConfig?.config?.name,
79
+ itemActionConfig?.action?.name,
80
+ isAction,
81
+ ]
82
+ );
83
+
84
+ const subTitle = useMemo(() => device?.sensor?.name || '--', [device]);
85
+
86
+ return (
87
+ <View style={styles.wrap}>
88
+ <DetailConfigAction
89
+ title={title}
90
+ subTitle={subTitle}
91
+ listData={listData}
92
+ />
93
+ </View>
94
+ );
95
+ };
96
+
97
+ export default memo(DetailConfigActionInternal);
@@ -8,7 +8,12 @@ import Information from '../components/Information';
8
8
 
9
9
  const DeviceGatewayInfo = () => {
10
10
  const { params = {} } = useRoute();
11
- const { device = {}, isZigbee = false, isModbus = false } = params;
11
+ const {
12
+ device = {},
13
+ isZigbee = false,
14
+ isModbus = false,
15
+ isInternal = false,
16
+ } = params;
12
17
  const {
13
18
  ieee_address = '',
14
19
  model_name = '',
@@ -16,9 +21,26 @@ const DeviceGatewayInfo = () => {
16
21
  delay = '',
17
22
  index = '',
18
23
  sensor = {},
24
+ used_pins = [],
19
25
  } = device;
20
26
  const { name = '', connection_time = '' } = sensor;
21
27
 
28
+ const deviceInformationInternal = useMemo(
29
+ () => [
30
+ {
31
+ id: 1,
32
+ title: 'device_name',
33
+ data: name,
34
+ },
35
+ {
36
+ id: 2,
37
+ title: 'used_pin',
38
+ data: used_pins?.join(','),
39
+ },
40
+ ],
41
+ [name, used_pins]
42
+ );
43
+
22
44
  const deviceInformationZigbee = useMemo(
23
45
  () => [
24
46
  {
@@ -81,7 +103,9 @@ const DeviceGatewayInfo = () => {
81
103
  <Information
82
104
  buttonBackStyles={styles.buttonBack}
83
105
  listInformation={
84
- isZigbee
106
+ isInternal
107
+ ? deviceInformationInternal
108
+ : isZigbee
85
109
  ? deviceInformationZigbee
86
110
  : isModbus
87
111
  ? deviceInformationModbus