@eohjsc/react-native-smart-city 0.2.45 → 0.2.49

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 (98) hide show
  1. package/README.md +9 -0
  2. package/index.js +6 -0
  3. package/package.json +23 -3
  4. package/src/Images/Common/logo.png +0 -0
  5. package/src/Images/Common/logo@2x.png +0 -0
  6. package/src/Images/Common/logo@3x.png +0 -0
  7. package/src/commons/ActionTemplate/index.js +40 -25
  8. package/src/commons/Automate/ItemAutomate.js +2 -2
  9. package/src/commons/Dashboard/MyPinnedSharedUnit/index.js +82 -0
  10. package/src/commons/Dashboard/MyPinnedSharedUnit/styles.js +78 -0
  11. package/src/commons/Dashboard/MyUnit/__test__/MyUnit.test.js +60 -0
  12. package/src/commons/Dashboard/MyUnit/index.js +111 -0
  13. package/src/commons/Dashboard/MyUnit/styles.js +61 -0
  14. package/src/commons/Device/ConnectedViewHeader.js +4 -1
  15. package/src/commons/Form/TextInput.js +1 -1
  16. package/src/commons/MediaPlayer/index.js +6 -1
  17. package/src/commons/OneTapTemplate/OptionsDropdownActionTemplate.js +3 -3
  18. package/src/{screens/Unit/components → commons}/SearchLocation/RowLocation.js +2 -2
  19. package/src/{screens/Unit/components → commons}/SearchLocation/RowLocationStyles.js +1 -1
  20. package/src/{screens/Unit/components → commons}/SearchLocation/SearchBarLocationStyles.js +1 -1
  21. package/src/{screens/Unit/components → commons}/SearchLocation/__test__/RowLocation.test.js +2 -2
  22. package/src/{screens/Unit/components → commons}/SearchLocation/index.js +2 -2
  23. package/src/commons/SubUnit/OneTap/ItemOneTap.js +3 -1
  24. package/src/commons/SubUnit/OneTap/__test__/SubUnitAutomate.test.js +2 -0
  25. package/src/commons/SubUnit/ShortDetail.js +1 -1
  26. package/src/commons/Unit/SharedUnit.js +2 -2
  27. package/src/configs/API.js +11 -4
  28. package/src/configs/Constants.js +19 -6
  29. package/src/configs/Images.js +1 -0
  30. package/src/iot/RemoteControl/Bluetooth.js +10 -1
  31. package/src/iot/RemoteControl/Internet.js +0 -2
  32. package/src/navigations/AddDeviceStack.js +5 -0
  33. package/src/navigations/AddUnitStack.js +2 -0
  34. package/src/navigations/UnitStack.js +8 -0
  35. package/src/screens/ActivityLog/FilterPopup.js +24 -17
  36. package/src/screens/ActivityLog/ItemLog.js +26 -22
  37. package/src/screens/ActivityLog/__test__/FilterPopup.test.js +1 -0
  38. package/src/screens/ActivityLog/__test__/ItemLog.test.js +0 -20
  39. package/src/screens/ActivityLog/__test__/index.test.js +3 -0
  40. package/src/screens/ActivityLog/hooks/__test__/index.test.js +8 -0
  41. package/src/screens/ActivityLog/hooks/index.js +5 -9
  42. package/src/screens/ActivityLog/index.js +4 -4
  43. package/src/screens/ActivityLog/styles/filterPopupStyles.js +3 -0
  44. package/src/screens/AddCommon/SelectSubUnit.js +10 -1
  45. package/src/screens/AddCommon/SelectUnit.js +11 -0
  46. package/src/screens/AddLocationMaps/index.js +124 -74
  47. package/src/screens/AddLocationMaps/indexStyle.js +58 -0
  48. package/src/screens/AddNewAction/SelectAction.js +59 -4
  49. package/src/screens/AddNewAction/SelectSensorDevices.js +27 -5
  50. package/src/screens/AddNewAction/SetupSensor.js +1 -6
  51. package/src/screens/AddNewAction/__test__/SelectAction.test.js +6 -4
  52. package/src/screens/AddNewAutoSmart/__test__/AddNewAutoSmart.test.js +11 -1
  53. package/src/screens/AddNewAutoSmart/index.js +24 -13
  54. package/src/screens/AddNewDevice/ConnectingDevices.js +3 -0
  55. package/src/screens/AddNewGateway/ConnectingGatewayStyles.js +10 -1
  56. package/src/screens/AddNewOneTap/__test__/AddNewOneTap.test.js +9 -1
  57. package/src/screens/AddNewOneTap/index.js +11 -6
  58. package/src/screens/Automate/MultiUnits.js +14 -53
  59. package/src/screens/Automate/__test__/MultiUnits.test.js +5 -246
  60. package/src/screens/Automate/__test__/index.test.js +1 -0
  61. package/src/screens/Automate/index.js +1 -0
  62. package/src/screens/Device/__test__/detail.test.js +14 -0
  63. package/src/screens/Device/components/DetailHistoryChart.js +63 -0
  64. package/src/screens/Device/components/EmergencyCountdown.js +29 -0
  65. package/src/screens/Device/components/SensorConnectStatusViewHeader.js +57 -0
  66. package/src/screens/Device/components/SensorDisplayItem.js +127 -0
  67. package/src/screens/Device/detail.js +81 -294
  68. package/src/screens/Device/hooks/useDisconnectedDevice.js +63 -0
  69. package/src/screens/Device/styles.js +0 -10
  70. package/src/screens/GuestInfo/components/RecurringDetail.js +2 -2
  71. package/src/screens/Notification/components/NotificationItem.js +31 -14
  72. package/src/screens/Notification/styles/NotificationItemStyles.js +5 -0
  73. package/src/screens/ScanChipQR/__test__/ScanChipQR.test.js +12 -3
  74. package/src/screens/ScanChipQR/components/QRScan/__test__/QRScan.test.js +11 -2
  75. package/src/screens/ScanSensorQR/__test__/ScanSensorQR.test.js +12 -3
  76. package/src/screens/ScriptDetail/__test__/index.test.js +83 -3
  77. package/src/screens/ScriptDetail/hooks/index.js +4 -0
  78. package/src/screens/ScriptDetail/index.js +65 -4
  79. package/src/screens/SetSchedule/__test__/SelectWeekday.test.js +2 -2
  80. package/src/screens/SetSchedule/__test__/index.test.js +8 -0
  81. package/src/screens/SetSchedule/components/SelectWeekday.js +13 -7
  82. package/src/screens/SetSchedule/index.js +28 -6
  83. package/src/screens/Sharing/Components/__test__/TitleCheckBox.test.js +38 -0
  84. package/src/screens/SubUnit/AddSubUnit.js +113 -29
  85. package/src/screens/SubUnit/AddSubUnitStyles.js +10 -0
  86. package/src/screens/SubUnit/__test__/AddSubUnit.test.js +1 -0
  87. package/src/screens/TDSGuide/index.js +15 -19
  88. package/src/screens/Unit/MoreMenu.js +6 -1
  89. package/src/screens/Unit/SelectLocation.js +2 -3
  90. package/src/screens/Unit/SmartAccount.js +141 -0
  91. package/src/screens/Unit/SmartAccountItem.js +51 -0
  92. package/src/screens/Unit/SmartAccountStyles.js +46 -0
  93. package/src/screens/Unit/__test__/SmartAccount.test.js +58 -0
  94. package/src/screens/Unit/hook/useStateAlertRemove.js +36 -0
  95. package/src/utils/I18n/translations/en.json +26 -2
  96. package/src/utils/I18n/translations/vi.json +38 -14
  97. package/src/utils/Route/index.js +4 -0
  98. package/src/utils/Validation.js +3 -1
@@ -0,0 +1,57 @@
1
+ import React from 'react';
2
+ import { ConnectedViewHeader, DisconnectedView } from '../../../commons/Device';
3
+ import { DEVICE_TYPE } from '../../../configs/Constants';
4
+
5
+ export const SensorConnectStatusViewHeader = (props) => {
6
+ if (!!props.sensor && !props.sensor.is_other_device) {
7
+ if (props.connected) {
8
+ return (
9
+ <>
10
+ <ConnectedViewHeader
11
+ lastUpdated={props.lastUpdated}
12
+ isDisplayTime={props.isDisplayTime}
13
+ showWindDirection={props.showWindDirection}
14
+ />
15
+ {props.children}
16
+ </>
17
+ );
18
+ } else if (props.connectedBlt) {
19
+ return (
20
+ <>
21
+ <ConnectedViewHeader
22
+ lastUpdated={props.lastUpdated}
23
+ type={'Bluetooth'}
24
+ isDisplayTime={props.isDisplayTime}
25
+ showWindDirection={props.showWindDirection}
26
+ />
27
+ {props.children}
28
+ </>
29
+ );
30
+ } else {
31
+ return <DisconnectedView sensor={props.sensor} />;
32
+ }
33
+ } else {
34
+ if (props.sensor.device_type === DEVICE_TYPE.LG_THINQ) {
35
+ return (
36
+ <>
37
+ <ConnectedViewHeader lastUpdated={props.lastUpdated} />
38
+ {props.children}
39
+ </>
40
+ );
41
+ } else {
42
+ if (props.isGGHomeConnected) {
43
+ return (
44
+ <>
45
+ <ConnectedViewHeader
46
+ lastUpdated={props.lastUpdated}
47
+ type={'GoogleHome'}
48
+ />
49
+ {props.children}
50
+ </>
51
+ );
52
+ } else {
53
+ return <DisconnectedView sensor={props.sensor} type={'GoogleHome'} />;
54
+ }
55
+ }
56
+ }
57
+ };
@@ -0,0 +1,127 @@
1
+ import React, { useCallback } from 'react';
2
+ import { View } from 'react-native';
3
+ import ActionGroup from '../../../commons/ActionGroup';
4
+ import { Card } from '../../../commons/CardShadow';
5
+ import MediaPlayer from '../../../commons/MediaPlayer';
6
+ import { Device } from '../../../configs';
7
+ import { TESTID } from '../../../configs/Constants';
8
+ import { useTranslations } from '../../../hooks/Common/useTranslations';
9
+ import { standardizeCameraScreenSize } from '../../../utils/Utils';
10
+ import { DetailHistoryChart } from './DetailHistoryChart';
11
+ import { sendRemoteCommand } from '../../../iot/RemoteControl';
12
+ import CurrentRainSensor from '../../../commons/Device/RainningSensor/CurrentRainSensor';
13
+ import PMSensorIndicatior from '../../../commons/Device/PMSensor/PMSensorIndicatior';
14
+ import Anemometer from '../../../commons/Device/WindSpeed/Anemometer';
15
+ import styles from '../styles';
16
+ import Compass from '../../../commons/Device/WindDirection/Compass';
17
+ import DeviceAlertStatus from '../../../commons/Device/DeviceAlertStatus';
18
+ import FlatListItems from '../../../commons/Device/FlatListItems';
19
+ import ListQualityIndicator from '../../../commons/Device/WaterQualitySensor/ListQualityIndicator';
20
+ import EmergencyDetail from '../../../commons/Device/Emergency/EmergencyDetail';
21
+ import EmergencyButton from '../../../commons/Device/Emergency/EmergencyButton';
22
+ import FooterInfo from '../../../commons/Device/FooterInfo';
23
+
24
+ const { standardizeHeight, standardizeWidth } = standardizeCameraScreenSize(
25
+ Device.screenWidth - 32
26
+ );
27
+
28
+ export const SensorDisplayItem = ({
29
+ item,
30
+ sensor,
31
+ emergency,
32
+ getData,
33
+ maxValue,
34
+ offsetTitle,
35
+ setOffsetTitle,
36
+ setShowWindDirection,
37
+ background,
38
+ }) => {
39
+ const t = useTranslations();
40
+ const doAction = useCallback(
41
+ (action, data) => {
42
+ sendRemoteCommand(sensor, action, data);
43
+ },
44
+ [sensor]
45
+ );
46
+ if (item.configuration.type === 'compass') {
47
+ setShowWindDirection(true);
48
+ }
49
+ switch (item.type) {
50
+ case 'camera':
51
+ return (
52
+ <Card title={t('camera')}>
53
+ <View style={styles.mediaContainer}>
54
+ <MediaPlayer
55
+ testID={TESTID.DEVICE_DETAIL_MEDIA_PLAYER}
56
+ uri={item.configuration.uri}
57
+ style={{ height: standardizeHeight }}
58
+ ratioWidth={standardizeWidth - 32}
59
+ thumbnail={{
60
+ uri: item.configuration.preview_uri,
61
+ }}
62
+ background={{ uri: background }}
63
+ />
64
+ </View>
65
+ </Card>
66
+ );
67
+ case 'action':
68
+ return (
69
+ <ActionGroup
70
+ testID={TESTID.DEVICE_DETAIL_ACTION_GROUP}
71
+ actionGroup={item.configuration}
72
+ doAction={doAction}
73
+ sensor={sensor}
74
+ />
75
+ );
76
+ case 'history':
77
+ return <DetailHistoryChart item={item} sensor={sensor} />;
78
+ case 'value':
79
+ switch (item.configuration.type) {
80
+ case 'circle':
81
+ return <CurrentRainSensor data={getData(item)} />;
82
+ case 'simple_list':
83
+ return (
84
+ <PMSensorIndicatior
85
+ data={getData(item)}
86
+ style={styles.simpleList}
87
+ />
88
+ );
89
+ case 'gauge':
90
+ return <Anemometer data={getData(item)} maxValue={maxValue} />;
91
+ case 'compass':
92
+ return <Compass data={getData(item)} />;
93
+ case 'alert_status':
94
+ return (
95
+ <DeviceAlertStatus
96
+ data={getData(item)}
97
+ style={styles.marginLeft}
98
+ offsetTitle={offsetTitle}
99
+ setOffsetTitle={setOffsetTitle}
100
+ />
101
+ );
102
+ case 'flat_list':
103
+ return (
104
+ <FlatListItems
105
+ title={item.configuration.title}
106
+ data={getData(item)}
107
+ style={[styles.marginLeft, styles.marginVertical]}
108
+ offsetTitle={offsetTitle}
109
+ />
110
+ );
111
+ default:
112
+ return <ListQualityIndicator data={getData(item)} />;
113
+ }
114
+ case 'emergency':
115
+ switch (item.configuration.type) {
116
+ case 'detail':
117
+ return <EmergencyDetail item={item} />;
118
+ default:
119
+ return <EmergencyButton emergency={emergency} />;
120
+ }
121
+ case 'info':
122
+ return <FooterInfo data={item.configuration} />;
123
+ default:
124
+ break;
125
+ }
126
+ return false;
127
+ };
@@ -1,5 +1,4 @@
1
1
  import React, {
2
- memo,
3
2
  useCallback,
4
3
  useEffect,
5
4
  useMemo,
@@ -7,7 +6,6 @@ import React, {
7
6
  useRef,
8
7
  } from 'react';
9
8
  import { View, TouchableOpacity } from 'react-native';
10
- import { connect } from 'react-redux';
11
9
  import { useTranslations } from '../../hooks/Common/useTranslations';
12
10
  import moment from 'moment';
13
11
  import _ from 'lodash';
@@ -18,55 +16,42 @@ import { Icon } from '@ant-design/react-native';
18
16
 
19
17
  import { useCountUp } from './hooks/useCountUp';
20
18
  import { getData as getLocalData } from '../../utils/Storage';
21
- import { API, Colors, Device } from '../../configs';
19
+ import { API, Colors } from '../../configs';
22
20
  import { axiosGet, axiosPost } from '../../utils/Apis/axios';
23
21
  import {
24
22
  isDeviceConnected,
25
23
  scanBluetoothDevices,
26
24
  } from '../../iot/RemoteControl/Bluetooth';
27
25
  import WrapHeaderScrollable from '../../commons/Sharing/WrapHeaderScrollable';
28
- import ActionGroup, { getActionComponent } from '../../commons/ActionGroup';
29
- import { ConnectedViewHeader, DisconnectedView } from '../../commons/Device';
30
- import HistoryChart from '../../commons/Device/HistoryChart';
31
- import PMSensorIndicatior from '../../commons/Device/PMSensor/PMSensorIndicatior';
32
- import CurrentRainSensor from '../../commons/Device/RainningSensor/CurrentRainSensor';
33
- import ListQualityIndicator from '../../commons/Device/WaterQualitySensor/ListQualityIndicator';
34
- import Anemometer from '../../commons/Device/WindSpeed/Anemometer';
35
- import Compass from '../../commons/Device/WindDirection/Compass';
36
- import DeviceAlertStatus from '../../commons/Device/DeviceAlertStatus';
37
- import FlatListItems from '../../commons/Device/FlatListItems';
38
- import MediaPlayer from '../../commons/MediaPlayer';
26
+ import { getActionComponent } from '../../commons/ActionGroup';
39
27
  import { AlertSendConfirm } from '../../commons/EmergencyButton/AlertSendConfirm';
40
28
  import { AlertSent } from '../../commons/EmergencyButton/AlertSent';
41
29
  import {
42
30
  useAlertResolveEmergency,
43
31
  useEmergencyButton,
44
32
  } from './hooks/useEmergencyButton';
45
- import EmergencyDetail from '../../commons/Device/Emergency/EmergencyDetail';
46
33
  import BottomButtonView from '../../commons/BottomButtonView';
47
34
  import Text from '../../commons/Text';
48
35
  import { transformDatetime } from '../../utils/Converter/time';
49
36
  import { AlertAction, ButtonPopup, MenuActionMore } from '../../commons';
50
- import EmergencyButton from '../../commons/Device/Emergency/EmergencyButton';
51
- import { DEVICE_TYPE, TESTID } from '../../configs/Constants';
52
- import FooterInfo from '../../commons/Device/FooterInfo';
37
+ import { TESTID } from '../../configs/Constants';
53
38
  import Routes from '../../utils/Route';
54
- import { sendRemoteCommand } from '../../iot/RemoteControl';
55
39
  import { usePopover } from '../../hooks/Common';
56
40
  import { useConfigGlobalState } from '../../iot/states';
57
- import { standardizeCameraScreenSize } from '../../utils/Utils';
58
41
  import { useNavigation } from '@react-navigation/native';
59
42
  import styles from './styles';
60
- import { Card } from '../../commons/CardShadow';
61
43
  import { useIsOwnerOfUnit, useBoolean } from '../../hooks/Common';
62
-
63
- const { standardizeHeight, standardizeWidth } = standardizeCameraScreenSize(
64
- Device.screenWidth - 32
65
- );
66
-
67
- const DeviceDetail = ({ account, route }) => {
44
+ import { SensorDisplayItem } from './components/SensorDisplayItem';
45
+ import { useSCContextSelector } from '../../context';
46
+ import { EmergencyCountdown } from './components/EmergencyCountdown';
47
+ import { SensorConnectStatusViewHeader } from './components/SensorConnectStatusViewHeader';
48
+ import { useDisconnectedDevice } from './hooks/useDisconnectedDevice';
49
+ import { useNetInfo } from '@react-native-community/netinfo';
50
+
51
+ const DeviceDetail = ({ route }) => {
68
52
  const t = useTranslations();
69
53
  const navigation = useNavigation();
54
+ const token = useSCContextSelector((state) => state.auth.account.token);
70
55
  const [offsetTitle, setOffsetTitle] = useState(1);
71
56
  const [display, setDisplay] = useState({ items: [] });
72
57
  const [displayValues, setDisplayValues] = useState([]);
@@ -82,7 +67,7 @@ const DeviceDetail = ({ account, route }) => {
82
67
  // eslint-disable-next-line no-unused-vars
83
68
  const [configValues, setConfigValues] = useConfigGlobalState('configValues');
84
69
 
85
- const { unit, sensor, isGGHomeConnected } = route.params;
70
+ const { unit, sensor, isGGHomeConnected, station } = route.params;
86
71
  const [isFavourite, setIsFavourite] = useState(sensor.is_favourite);
87
72
  const { isOwner } = useIsOwnerOfUnit(unit.user_id);
88
73
  const [sensorName, setSensorName] = useState(sensor?.name);
@@ -94,6 +79,10 @@ const DeviceDetail = ({ account, route }) => {
94
79
  [sensor]
95
80
  );
96
81
 
82
+ useDisconnectedDevice(isConnected, sensorName);
83
+
84
+ const netInfo = useNetInfo();
85
+
97
86
  const isShowSetupEmergencyContact =
98
87
  display.items.filter(
99
88
  (item) =>
@@ -127,7 +116,7 @@ const DeviceDetail = ({ account, route }) => {
127
116
  }, [currentUserId, unit]);
128
117
 
129
118
  const fetchDataDeviceDetail = useCallback(async () => {
130
- if (!account.token) {
119
+ if (!token) {
131
120
  return;
132
121
  }
133
122
  if (!sensor) {
@@ -169,7 +158,7 @@ const DeviceDetail = ({ account, route }) => {
169
158
  if (controlResult.success) {
170
159
  setControlOptions(controlResult.data);
171
160
  }
172
- }, [account.token, sensor, setDeviceId, setLastEvent]);
161
+ }, [token, sensor, setDeviceId, setLastEvent]);
173
162
 
174
163
  const {
175
164
  deviceId: emergencyDeviceId,
@@ -204,30 +193,44 @@ const DeviceDetail = ({ account, route }) => {
204
193
  ) {
205
194
  menuItems.push({
206
195
  route: Routes.ActivityLog,
207
- data: { id: sensor.id, type: 'action' },
196
+ data: {
197
+ id: sensor.id,
198
+ type: 'action',
199
+ filterEnabled: {
200
+ date: false,
201
+ user: false,
202
+ },
203
+ },
208
204
  text: t('activity_log'),
209
205
  });
210
- if (isOwner) {
211
- menuItems.push({
212
- text: t('edit'),
213
- route: Routes.EditDevice,
214
- data: {
215
- sensor,
216
- setSensorNameDetail: setSensorName,
217
- sensorNameDetail: sensorName,
218
- },
219
- });
220
- menuItems.push({
221
- route: Routes.ManageAccess,
222
- data: { unit, sensor },
223
- text: t('manage_access'),
224
- });
225
- }
206
+ }
207
+ if (isOwner) {
208
+ menuItems.push({
209
+ text: t('edit'),
210
+ route: Routes.EditDevice,
211
+ data: {
212
+ sensor,
213
+ setSensorNameDetail: setSensorName,
214
+ sensorNameDetail: sensorName,
215
+ },
216
+ });
217
+ menuItems.push({
218
+ route: Routes.ManageAccess,
219
+ data: { unit, sensor },
220
+ text: t('manage_access'),
221
+ });
226
222
  }
227
223
  if (isShowSetupEmergencyContact) {
228
224
  menuItems.push({
229
225
  route: Routes.ActivityLog,
230
- data: { id: emergencyDeviceId, type: 'emergency_event' },
226
+ data: {
227
+ id: emergencyDeviceId,
228
+ type: 'emergency_event',
229
+ filterEnabled: {
230
+ date: false,
231
+ user: false,
232
+ },
233
+ },
231
234
  text: t('activity_log'),
232
235
  });
233
236
  }
@@ -384,86 +387,36 @@ const DeviceDetail = ({ account, route }) => {
384
387
 
385
388
  // replace isConnected=True to see template
386
389
  const renderSensorConnected = () => {
387
- if (!!sensor && !sensor.is_other_device) {
388
- if (isDeviceConnectedViaBle || isConnected) {
389
- return (
390
- <>
391
- <ConnectedViewHeader
392
- lastUpdated={lastUpdated}
393
- isDisplayTime={
394
- isShowSetupEmergencyContact ? false : isDisplayTime
395
- }
396
- showWindDirection={showWindDirection}
397
- />
398
- {display.items.map((item) => (
399
- <SensorDisplayItem
400
- testID={TESTID.SENSOR_DISPLAY_ITEM}
401
- key={item.id.toString()}
402
- item={item}
403
- emergency={onEmergencyButtonPress}
404
- sensor={sensor}
405
- getData={getData}
406
- maxValue={maxValue}
407
- offsetTitle={offsetTitle}
408
- setOffsetTitle={setOffsetTitle}
409
- setShowWindDirection={setShowWindDirection}
410
- />
411
- ))}
412
- </>
413
- );
414
- } else {
415
- return <DisconnectedView sensor={sensor} />;
416
- }
417
- } else {
418
- if (sensor.device_type === DEVICE_TYPE.LG_THINQ) {
419
- return (
420
- <>
421
- <ConnectedViewHeader lastUpdated={lastUpdated} />
422
- {display.items.map((item) => (
423
- <SensorDisplayItem
424
- testID={TESTID.SENSOR_DISPLAY_ITEM}
425
- key={item.id.toString()}
426
- item={item}
427
- emergency={onEmergencyButtonPress}
428
- sensor={sensor}
429
- getData={getData}
430
- maxValue={maxValue}
431
- offsetTitle={offsetTitle}
432
- setOffsetTitle={setOffsetTitle}
433
- setShowWindDirection={setShowWindDirection}
434
- />
435
- ))}
436
- </>
437
- );
438
- } else {
439
- if (isGGHomeConnected) {
440
- return (
441
- <>
442
- <ConnectedViewHeader
443
- lastUpdated={lastUpdated}
444
- type={'GoogleHome'}
445
- />
446
- {display.items.map((item) => (
447
- <SensorDisplayItem
448
- testID={TESTID.SENSOR_DISPLAY_ITEM}
449
- key={item.id.toString()}
450
- item={item}
451
- emergency={onEmergencyButtonPress}
452
- sensor={sensor}
453
- getData={getData}
454
- maxValue={maxValue}
455
- offsetTitle={offsetTitle}
456
- setOffsetTitle={setOffsetTitle}
457
- setShowWindDirection={setShowWindDirection}
458
- />
459
- ))}
460
- </>
461
- );
462
- } else {
463
- return <DisconnectedView sensor={sensor} type={'GoogleHome'} />;
390
+ return (
391
+ <SensorConnectStatusViewHeader
392
+ sensor={sensor}
393
+ connected={netInfo.isConnected && isConnected}
394
+ connectedBlt={
395
+ (!netInfo.isConnected || (netInfo.isConnected && !isConnected)) &&
396
+ isDeviceConnectedViaBle
464
397
  }
465
- }
466
- }
398
+ lastUpdated={lastUpdated}
399
+ isDisplayTime={isShowSetupEmergencyContact ? false : isDisplayTime}
400
+ showWindDirection={showWindDirection}
401
+ isGGHomeConnected={isGGHomeConnected}
402
+ >
403
+ {display.items.map((item) => (
404
+ <SensorDisplayItem
405
+ testID={TESTID.SENSOR_DISPLAY_ITEM}
406
+ key={item.id.toString()}
407
+ item={item}
408
+ emergency={onEmergencyButtonPress}
409
+ sensor={sensor}
410
+ getData={getData}
411
+ maxValue={maxValue}
412
+ offsetTitle={offsetTitle}
413
+ setOffsetTitle={setOffsetTitle}
414
+ setShowWindDirection={setShowWindDirection}
415
+ background={station?.background}
416
+ />
417
+ ))}
418
+ </SensorConnectStatusViewHeader>
419
+ );
467
420
  };
468
421
 
469
422
  const getDataFromLocal = async () => {
@@ -636,170 +589,4 @@ const DeviceDetail = ({ account, route }) => {
636
589
  );
637
590
  };
638
591
 
639
- const DetailHistoryChart = ({ item, sensor }) => {
640
- const [chartData, setChartData] = useState(item.configuration.configs);
641
- const [startDate, setStartDate] = useState(
642
- moment().subtract(1, 'days').valueOf()
643
- );
644
- const [endDate, setEndDate] = useState(moment().valueOf());
645
- useEffect(() => {
646
- const fetchData = async () => {
647
- let params = new URLSearchParams();
648
- item.configuration.configs.map((config) => {
649
- params.append('config', config.id);
650
- });
651
- params.append('date_from', startDate / 1000);
652
- params.append('date_to', endDate / 1000);
653
- const { success, data } = await axiosGet(
654
- API.SENSOR.DISPLAY_HISTORY(sensor.id),
655
- { params }
656
- );
657
- if (success) {
658
- for (let i = 0; i < data.length; i++) {
659
- for (let j = 0; j < data[i].data.length; j++) {
660
- data[i].data[j].x = moment(data[i].data[j].x).toDate();
661
- }
662
- }
663
-
664
- const formatData = item.configuration.configs.map((config) => {
665
- const dataChart = data.find((k) => k.config === config.id) || {
666
- data: [],
667
- };
668
- return { ...config, data: dataChart.data };
669
- });
670
- setChartData(formatData);
671
- }
672
- };
673
- fetchData();
674
- }, [startDate, endDate, item, sensor]);
675
- if (!chartData.length) {
676
- return false;
677
- }
678
-
679
- return (
680
- <HistoryChart
681
- configuration={item.configuration}
682
- datas={chartData}
683
- style={styles.chartStyle}
684
- setStartDate={setStartDate}
685
- setEndDate={setEndDate}
686
- />
687
- );
688
- };
689
-
690
- const SensorDisplayItem = ({
691
- item,
692
- sensor,
693
- emergency,
694
- getData,
695
- maxValue,
696
- offsetTitle,
697
- setOffsetTitle,
698
- setShowWindDirection,
699
- }) => {
700
- const t = useTranslations();
701
- const doAction = useCallback(
702
- (action, data) => {
703
- sendRemoteCommand(sensor, action, data);
704
- },
705
- [sensor]
706
- );
707
- if (item.configuration.type === 'compass') {
708
- setShowWindDirection(true);
709
- }
710
- switch (item.type) {
711
- case 'camera':
712
- return (
713
- <Card title={t('camera')}>
714
- <View style={styles.mediaContainer}>
715
- <MediaPlayer
716
- testID={TESTID.DEVICE_DETAIL_MEDIA_PLAYER}
717
- uri={item.configuration.uri}
718
- style={{ height: standardizeHeight }}
719
- ratioWidth={standardizeWidth - 32}
720
- />
721
- </View>
722
- </Card>
723
- );
724
- case 'action':
725
- return (
726
- <ActionGroup
727
- testID={TESTID.DEVICE_DETAIL_ACTION_GROUP}
728
- actionGroup={item.configuration}
729
- doAction={doAction}
730
- sensor={sensor}
731
- />
732
- );
733
- case 'history':
734
- return <DetailHistoryChart item={item} sensor={sensor} />;
735
- case 'value':
736
- switch (item.configuration.type) {
737
- case 'circle':
738
- return <CurrentRainSensor data={getData(item)} />;
739
- case 'simple_list':
740
- return (
741
- <PMSensorIndicatior
742
- data={getData(item)}
743
- style={styles.simpleList}
744
- />
745
- );
746
- case 'gauge':
747
- return <Anemometer data={getData(item)} maxValue={maxValue} />;
748
- case 'compass':
749
- return <Compass data={getData(item)} />;
750
- case 'alert_status':
751
- return (
752
- <DeviceAlertStatus
753
- data={getData(item)}
754
- style={styles.marginLeft}
755
- offsetTitle={offsetTitle}
756
- setOffsetTitle={setOffsetTitle}
757
- />
758
- );
759
- case 'flat_list':
760
- return (
761
- <FlatListItems
762
- title={item.configuration.title}
763
- data={getData(item)}
764
- style={[styles.marginLeft, styles.marginVertical]}
765
- offsetTitle={offsetTitle}
766
- />
767
- );
768
- default:
769
- return <ListQualityIndicator data={getData(item)} />;
770
- }
771
- case 'emergency':
772
- switch (item.configuration.type) {
773
- case 'detail':
774
- return <EmergencyDetail item={item} />;
775
- default:
776
- return <EmergencyButton emergency={emergency} />;
777
- }
778
- case 'info':
779
- return <FooterInfo data={item.configuration} />;
780
- default:
781
- break;
782
- }
783
- return false;
784
- };
785
-
786
- const EmergencyCountdown = memo(({ countUpStr }) => {
787
- const t = useTranslations();
788
- return (
789
- <View style={styles.countDown}>
790
- <Text type="Label" center style={styles.messageCountDown}>
791
- {t('time_since_the_emergency_button_was_pressed')}
792
- </Text>
793
- <Text type="H3" center semibold color={Colors.Red6}>
794
- {countUpStr}
795
- </Text>
796
- </View>
797
- );
798
- });
799
-
800
- const mapStateToProps = (state) => ({
801
- account: state.auth.account,
802
- });
803
- const mapDispatchToProps = {};
804
-
805
- export default connect(mapStateToProps, mapDispatchToProps)(DeviceDetail);
592
+ export default DeviceDetail;