@eohjsc/react-native-smart-city 0.3.39 → 0.3.41

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 (48) hide show
  1. package/assets/images/AddNewDevice/gateway-icon.svg +12 -0
  2. package/package.json +1 -1
  3. package/src/commons/Header/HeaderCustom.js +9 -6
  4. package/src/commons/SelectGateway/index.js +63 -21
  5. package/src/commons/SelectGateway/styles.js +25 -4
  6. package/src/commons/SelectSubUnit/index.js +2 -3
  7. package/src/commons/SelectSubUnit/styles.js +1 -3
  8. package/src/commons/StatusBox/index.js +19 -0
  9. package/src/commons/StatusBox/styles.js +30 -0
  10. package/src/commons/SubUnit/ShortDetail.js +7 -4
  11. package/src/commons/SubUnit/__test__/ShortDetail.test.js +3 -1
  12. package/src/commons/index.js +8 -1
  13. package/src/configs/API.js +4 -0
  14. package/src/configs/AccessibilityLabel.js +2 -1
  15. package/src/configs/Colors.js +1 -0
  16. package/src/screens/AddCommon/__test__/SelectSubUnit.test.js +2 -2
  17. package/src/screens/AddNewGateway/ConnectingDevice.js +6 -2
  18. package/src/screens/AddNewGateway/ConnectingModbusDevice.js +4 -2
  19. package/src/screens/AddNewGateway/ConnectingWifiDevice.js +15 -7
  20. package/src/screens/AddNewGateway/ConnectingWifiGuide.js +4 -3
  21. package/src/screens/AddNewGateway/ConnectingZigbeeDevice.js +3 -2
  22. package/src/screens/AddNewGateway/RenameNewDevices.js +85 -50
  23. package/src/screens/AddNewGateway/RenameNewDevicesStyles.js +18 -14
  24. package/src/screens/AddNewGateway/ScanGatewayQR.js +2 -1
  25. package/src/screens/AddNewGateway/ScanModbusQR.js +5 -5
  26. package/src/screens/AddNewGateway/SelectDeviceSubUnit.js +3 -0
  27. package/src/screens/AddNewGateway/SelectDeviceType.js +7 -6
  28. package/src/screens/AddNewGateway/SelectModbusGateway.js +19 -3
  29. package/src/screens/AddNewGateway/SelectZigbeeGateway.js +3 -2
  30. package/src/screens/AddNewGateway/ShareWifiPassword.js +12 -2
  31. package/src/screens/AddNewGateway/__test__/ConnectingZigbeeDevice.test.js +6 -3
  32. package/src/screens/AddNewGateway/__test__/RenameNewDevices.test.js +28 -9
  33. package/src/screens/AddNewGateway/__test__/ScanModbusQR.test.js +1 -3
  34. package/src/screens/AddNewGateway/__test__/SelectModbusGateway.test.js +1 -1
  35. package/src/screens/Device/detail.js +14 -10
  36. package/src/screens/Gateway/__test__/index.test.js +32 -5
  37. package/src/screens/Gateway/components/GatewayItem/__test__/index.test.js +83 -0
  38. package/src/screens/Gateway/components/GatewayItem/index.js +27 -0
  39. package/src/screens/Gateway/components/GatewayItem/styles.js +62 -0
  40. package/src/screens/Gateway/hooks/useGateway.js +38 -0
  41. package/src/screens/Gateway/index.js +77 -5
  42. package/src/screens/Gateway/styles.js +32 -0
  43. package/src/screens/SubUnit/Detail.js +2 -1
  44. package/src/screens/Unit/AddMenu.js +1 -1
  45. package/src/screens/Unit/Detail.js +3 -1
  46. package/src/utils/I18n/translations/en.json +17 -1
  47. package/src/utils/I18n/translations/vi.json +16 -0
  48. package/src/utils/Route/index.js +1 -0
@@ -0,0 +1,12 @@
1
+ <svg width="30" height="29" viewBox="0 0 30 29" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M29.0034 24.0138C28.9656 24.138 28.9203 24.2621 28.8825 24.394C28.5351 25.4879 27.576 26.1862 26.3752 26.2095C26.1336 26.2172 25.8843 26.2095 25.6049 26.2095C25.6049 26.512 25.6049 26.7991 25.6049 27.0862C25.5974 27.6137 25.2273 28.0172 24.744 28.0094C24.2758 28.0017 23.9132 27.606 23.9057 27.0939C23.9057 26.8146 23.9057 26.5353 23.9057 26.2327C17.6375 26.2327 11.3843 26.2327 5.10101 26.2327C5.10101 26.512 5.10101 26.8069 5.10101 27.0939C5.09346 27.6215 4.71586 28.0249 4.24008 28.0094C3.77185 28.0017 3.40935 27.606 3.40179 27.0939C3.40179 26.8146 3.40179 26.5353 3.40179 26.2327C2.99398 26.2095 2.60127 26.2095 2.20856 26.1629C0.992679 26.0233 0.0109086 24.9138 0.00335648 23.6492C-0.0041956 21.9036 0.00335648 20.1579 0.00335648 18.4123C0.00335648 16.8684 1.09086 15.7357 2.59372 15.7046C3.11481 15.6969 3.62836 15.7046 4.14945 15.7046C11.4901 15.7046 18.8307 15.7046 26.1789 15.7046C27.6893 15.7046 28.5427 16.3641 28.9656 17.8537C28.9731 17.8692 28.9882 17.8847 29.0034 17.8925C29.0034 19.9407 29.0034 21.9734 29.0034 24.0138ZM18.808 20.957C18.808 20.6855 18.8156 20.414 18.808 20.1424C18.8005 19.5993 18.4455 19.2269 17.9471 19.2269C17.4638 19.2269 17.1164 19.5993 17.1088 20.1269C17.1013 20.6777 17.1013 21.2363 17.1088 21.7872C17.1164 22.3148 17.4713 22.6872 17.9547 22.6872C18.438 22.6872 18.7929 22.3225 18.808 21.8027C18.8156 21.5156 18.808 21.2363 18.808 20.957ZM22.2065 20.9648C22.2065 20.6777 22.214 20.3829 22.2065 20.0959C22.1838 19.5916 21.8289 19.2347 21.3606 19.2347C20.8924 19.2347 20.5299 19.5916 20.5148 20.1036C20.4997 20.6777 20.4997 21.2519 20.5148 21.8182C20.5224 22.3303 20.8849 22.6872 21.3531 22.6949C21.8364 22.7027 22.1989 22.338 22.214 21.8105C22.214 21.5234 22.2065 21.2441 22.2065 20.9648ZM23.9057 20.957C23.9057 21.2363 23.8981 21.5234 23.9057 21.8027C23.9208 22.3148 24.2682 22.6794 24.7364 22.6872C25.2198 22.6949 25.5898 22.338 25.6049 21.8182C25.62 21.2441 25.62 20.67 25.6049 20.1036C25.5974 19.5916 25.2349 19.2347 24.7666 19.2347C24.2833 19.2347 23.9284 19.5993 23.9132 20.1191C23.8981 20.3907 23.9057 20.6777 23.9057 20.957Z" fill="#00979D"/>
3
+ <path d="M22.9023 5.33144C22.5927 5.3392 22.3737 5.15299 22.1697 4.95128C20.9312 3.71769 19.5039 2.78669 17.8424 2.29791C13.7718 1.09536 10.1393 1.91775 6.95985 4.81938C6.74839 5.01334 6.50673 5.21506 6.2424 5.30816C5.89501 5.4323 5.50985 5.2073 5.33615 4.88145C5.1549 4.53232 5.20777 4.13665 5.48719 3.84183C6.27261 3.03496 7.13355 2.35222 8.08511 1.78586C10.4263 0.389349 12.9487 -0.19253 15.6296 0.0557383C18.6807 0.33504 21.3013 1.60741 23.4838 3.81079C23.7632 4.0901 23.8388 4.42371 23.7028 4.79611C23.5744 5.12972 23.2648 5.3392 22.9023 5.33144Z" fill="#00979D"/>
4
+ <path d="M21.3686 6.7746C21.3535 7.29441 21.1949 7.57372 20.8626 7.72113C20.5152 7.87629 20.2131 7.79871 19.9186 7.55044C19.4126 7.13149 18.9293 6.66599 18.378 6.33237C15.4251 4.54019 11.7623 4.98242 9.25504 7.40303C9.01337 7.63578 8.7717 7.8375 8.41676 7.79095C8.06936 7.7444 7.82014 7.5582 7.70686 7.20907C7.58603 6.85219 7.6691 6.54185 7.92587 6.27807C8.90009 5.27724 10.0254 4.5014 11.3394 4.05917C14.9644 2.8411 18.2118 3.53936 21.0212 6.216C21.1949 6.39444 21.2931 6.65823 21.3686 6.7746Z" fill="#00979D"/>
5
+ <path d="M5.834 13.9822C5.22984 13.9822 4.65588 13.99 4.08947 13.9745C4.0215 13.9745 3.93088 13.8271 3.89312 13.734C2.99442 11.5849 2.09572 9.43583 1.19702 7.279C0.849627 6.44885 0.49468 5.61095 0.154836 4.77304C-0.0566226 4.26875 0.13218 3.75669 0.585304 3.56274C1.03843 3.36878 1.49911 3.57825 1.71057 4.08255C3.06994 7.31779 4.42176 10.553 5.77359 13.7883C5.78869 13.8426 5.80379 13.8969 5.834 13.9822Z" fill="#00979D"/>
6
+ <path d="M23.1582 13.9898C23.4754 13.2218 23.7775 12.5002 24.0796 11.7865C25.1444 9.23396 26.2092 6.68145 27.2741 4.1367C27.5233 3.54706 28.0897 3.32983 28.5579 3.64016C28.928 3.88843 29.0488 4.33066 28.86 4.78841C28.2559 6.23922 27.6517 7.69004 27.0475 9.1331C26.4132 10.6615 25.7712 12.1899 25.1368 13.7261C25.0538 13.92 24.9632 14.0054 24.7441 13.9976C24.2306 13.9743 23.7246 13.9898 23.1582 13.9898Z" fill="#00979D"/>
7
+ <path d="M14.5042 7.03809C16.1128 7.08464 17.4948 7.58893 18.6427 8.7139C18.892 8.95441 19.0204 9.24147 18.9297 9.59835C18.8467 9.93972 18.6352 10.157 18.3105 10.2423C17.9782 10.3354 17.7063 10.2113 17.4646 9.97851C16.075 8.65959 14.0511 8.3958 12.4047 9.34233C12.1026 9.51301 11.8232 9.74576 11.5664 9.97851C11.136 10.3587 10.63 10.3819 10.2826 10.0018C9.93519 9.62163 9.98051 9.10182 10.4034 8.69062C11.5589 7.5579 12.9636 7.06912 14.5042 7.03809Z" fill="#00979D"/>
8
+ <path d="M16.5958 11.8411C16.5429 12.2213 16.3919 12.4851 16.0898 12.6403C15.7726 12.8032 15.4479 12.7721 15.1609 12.5472C14.6171 12.1282 14.3755 12.1282 13.8393 12.5472C13.4768 12.8342 12.9632 12.7877 12.6687 12.4463C12.3817 12.1127 12.3893 11.6006 12.6914 11.2593C13.6052 10.2274 15.4177 10.2274 16.3088 11.267C16.4447 11.4222 16.5052 11.6472 16.5958 11.8411Z" fill="#00979D"/>
9
+ <path d="M18.8084 20.9567C18.8084 21.236 18.816 21.523 18.8084 21.8023C18.7933 22.3299 18.4383 22.6946 17.955 22.6868C17.4717 22.6868 17.1167 22.3144 17.1092 21.7868C17.1016 21.236 17.1016 20.6774 17.1092 20.1265C17.1167 19.599 17.4717 19.2266 17.9475 19.2266C18.4459 19.2266 18.7933 19.5912 18.8084 20.1421C18.816 20.4136 18.8084 20.6851 18.8084 20.9567Z" fill="white"/>
10
+ <path d="M22.2079 20.9645C22.2079 21.2438 22.2155 21.5309 22.2079 21.8102C22.1928 22.33 21.8303 22.6946 21.347 22.6946C20.8788 22.6869 20.5238 22.3222 20.5087 21.8179C20.5012 21.2438 20.4936 20.6697 20.5087 20.1033C20.5238 19.599 20.8863 19.2344 21.3546 19.2344C21.8303 19.2344 22.1853 19.5913 22.2004 20.0956C22.2155 20.3749 22.2079 20.6697 22.2079 20.9645Z" fill="white"/>
11
+ <path d="M23.906 20.9568C23.906 20.6775 23.8984 20.3904 23.906 20.1111C23.9211 19.5913 24.276 19.2189 24.7594 19.2267C25.2276 19.2267 25.5901 19.5913 25.5977 20.0956C25.6128 20.6697 25.6128 21.2439 25.5977 21.8102C25.5826 22.33 25.2125 22.6947 24.7292 22.6792C24.2609 22.6714 23.9135 22.3068 23.8984 21.7947C23.8984 21.5154 23.906 21.2361 23.906 20.9568Z" fill="white"/>
12
+ </svg>
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.39",
4
+ "version": "0.3.41",
5
5
  "description": "TODO",
6
6
  "main": "index.js",
7
7
  "files": [
@@ -24,6 +24,7 @@ const HeaderCustom = ({
24
24
  iconLeft,
25
25
  wrapTitleStyle,
26
26
  iconBackStyle,
27
+ isCanBack = true,
27
28
  }) => {
28
29
  const t = useTranslations();
29
30
  const { goBack } = useNavigation();
@@ -43,12 +44,14 @@ const HeaderCustom = ({
43
44
 
44
45
  return (
45
46
  <View style={[styles.wrap, isShowSeparator && styles.separator]}>
46
- <TouchableOpacity style={styles.buttonBack} onPress={handleGoback}>
47
- <Image
48
- source={iconLeft || Images.arrowBack}
49
- style={[styles.iconBack, iconBackStyle]}
50
- />
51
- </TouchableOpacity>
47
+ {isCanBack && (
48
+ <TouchableOpacity style={styles.buttonBack} onPress={handleGoback}>
49
+ <Image
50
+ source={iconLeft || Images.arrowBack}
51
+ style={[styles.iconBack, iconBackStyle]}
52
+ />
53
+ </TouchableOpacity>
54
+ )}
52
55
  <View style={[styles.wrapTitle, wrapTitleStyle]}>
53
56
  <Text
54
57
  style={[styles.title, titleStyles, !isShowRight && styles.title2]}
@@ -1,9 +1,12 @@
1
1
  import React, { memo, useCallback, useEffect, useState } from 'react';
2
2
  import { useIsFocused, useNavigation } from '@react-navigation/native';
3
3
  import { useTranslations } from '../../hooks/Common/useTranslations';
4
- import { SafeAreaView, ScrollView, TouchableOpacity, View } from 'react-native';
4
+ import { ScrollView, TouchableOpacity, View } from 'react-native';
5
5
 
6
6
  import { API } from '../../configs';
7
+ import { HeaderCustom } from '../Header';
8
+ import { ModalCustom } from '../Modal';
9
+ import { useBoolean } from '../../hooks/Common';
7
10
  import { RadioCircle, Section, ViewButtonBottom } from '../../commons';
8
11
  import { axiosGet } from '../../utils/Apis/axios';
9
12
  import Text from '../../commons/Text';
@@ -41,13 +44,21 @@ const GatewayItem = memo(({ index, item, selectedIndex, setSelectedIndex }) => {
41
44
  );
42
45
  });
43
46
 
44
- const SelectGateway = ({ onPressNext, unitId, type, title, subTitle }) => {
47
+ const SelectGateway = ({
48
+ onPressNext,
49
+ onPressOk,
50
+ unitId,
51
+ type,
52
+ title,
53
+ subTitle,
54
+ }) => {
45
55
  const t = useTranslations();
46
56
  const { goBack } = useNavigation();
47
57
  const isFocused = useIsFocused();
48
- const [selectedIndex, setSelectedIndex] = useState(-1);
49
-
58
+ const [selectedIndex, setSelectedIndex] = useState(0);
50
59
  const [gateways, setGateways] = useState([]);
60
+ const [showPopupGuide, setShowPopupGuide, setHidePopupGuide] =
61
+ useBoolean(false);
51
62
 
52
63
  const fetchDetails = useCallback(async () => {
53
64
  const { success, data } = await axiosGet(
@@ -58,18 +69,26 @@ const SelectGateway = ({ onPressNext, unitId, type, title, subTitle }) => {
58
69
  );
59
70
  if (success) {
60
71
  setGateways(data);
72
+ if (!data.length) {
73
+ setShowPopupGuide();
74
+ }
75
+ } else {
76
+ setShowPopupGuide();
61
77
  }
62
- }, [type, unitId]);
78
+ }, [setShowPopupGuide, type, unitId]);
79
+
80
+ const handleOk = () => {
81
+ setHidePopupGuide();
82
+ onPressOk();
83
+ };
63
84
 
64
85
  useEffect(() => {
65
86
  isFocused && fetchDetails();
66
87
  }, [fetchDetails, isFocused]);
67
88
 
68
89
  return (
69
- <SafeAreaView style={styles.container}>
70
- <Text semibold style={styles.title}>
71
- {title}
72
- </Text>
90
+ <View style={styles.container}>
91
+ <HeaderCustom title={title} isShowSeparator />
73
92
  <Text style={styles.subtitle}>{subTitle}</Text>
74
93
  <View style={styles.contentContainer}>
75
94
  <ScrollView
@@ -77,17 +96,19 @@ const SelectGateway = ({ onPressNext, unitId, type, title, subTitle }) => {
77
96
  showsVerticalScrollIndicator={false}
78
97
  scrollIndicatorInsets={{ right: 1 }}
79
98
  >
80
- <Section type={'border'}>
81
- {gateways.map((item, index) => (
82
- <GatewayItem
83
- key={index}
84
- item={item}
85
- setSelectedIndex={setSelectedIndex}
86
- selectedIndex={selectedIndex}
87
- index={index}
88
- />
89
- ))}
90
- </Section>
99
+ {gateways.length > 0 && (
100
+ <Section type={'border'}>
101
+ {gateways.map((item, index) => (
102
+ <GatewayItem
103
+ key={index}
104
+ item={item}
105
+ setSelectedIndex={setSelectedIndex}
106
+ selectedIndex={selectedIndex}
107
+ index={index}
108
+ />
109
+ ))}
110
+ </Section>
111
+ )}
91
112
  </ScrollView>
92
113
  <ViewButtonBottom
93
114
  leftTitle={t('cancel')}
@@ -97,8 +118,29 @@ const SelectGateway = ({ onPressNext, unitId, type, title, subTitle }) => {
97
118
  onRightClick={() => onPressNext(gateways[selectedIndex])}
98
119
  accessibilityLabelPrefix={AccessibilityLabel.PREFIX.SELECT_UNIT}
99
120
  />
121
+ <ModalCustom // todo Huy - make reused component
122
+ onBackButtonPress={goBack}
123
+ isVisible={showPopupGuide}
124
+ style={styles.modal}
125
+ >
126
+ <View style={styles.modalWrapper}>
127
+ <View style={styles.modalContent}>
128
+ <Text type="H4" semibold style={styles.txtCenter}>
129
+ {t('no_gateway')}
130
+ </Text>
131
+ <Text style={styles.txtCenter}>
132
+ {t('need_add_gateway_before_add_device')}
133
+ </Text>
134
+ </View>
135
+ <ViewButtonBottom
136
+ rightTitle={t('ok')}
137
+ onRightClick={handleOk}
138
+ styleButton={styles.bottomButton}
139
+ />
140
+ </View>
141
+ </ModalCustom>
100
142
  </View>
101
- </SafeAreaView>
143
+ </View>
102
144
  );
103
145
  };
104
146
 
@@ -1,12 +1,11 @@
1
1
  import { Colors } from '../../configs';
2
2
 
3
- import { StyleSheet, StatusBar, Platform } from 'react-native';
3
+ import { StyleSheet } from 'react-native';
4
4
 
5
5
  export default StyleSheet.create({
6
6
  container: {
7
7
  flex: 1,
8
- backgroundColor: Colors.Gray2,
9
- paddingTop: Platform.OS === 'android' ? StatusBar.currentHeight : 0,
8
+ backgroundColor: Colors.White,
10
9
  },
11
10
  contentContainer: {
12
11
  flex: 1,
@@ -29,7 +28,7 @@ export default StyleSheet.create({
29
28
  fontSize: 14,
30
29
  lineHeight: 22,
31
30
  marginLeft: 16,
32
- marginBottom: 16,
31
+ marginVertical: 16,
33
32
  },
34
33
  row: {
35
34
  flex: 1,
@@ -52,4 +51,26 @@ export default StyleSheet.create({
52
51
  buttonAdd: {
53
52
  marginHorizontal: 16,
54
53
  },
54
+ modal: {
55
+ flex: 1,
56
+ justifyContent: 'center',
57
+ alignItems: 'center',
58
+ },
59
+ modalWrapper: {
60
+ backgroundColor: Colors.White,
61
+ borderRadius: 10,
62
+ justifyContent: 'center',
63
+ alignItems: 'center',
64
+ width: 280,
65
+ },
66
+ modalContent: {
67
+ paddingHorizontal: 16,
68
+ paddingTop: 16,
69
+ },
70
+ txtCenter: {
71
+ textAlign: 'center',
72
+ },
73
+ bottomButton: {
74
+ paddingVertical: 11,
75
+ },
55
76
  });
@@ -11,6 +11,7 @@ import Text from '../../commons/Text';
11
11
  import AccessibilityLabel from '../../configs/AccessibilityLabel';
12
12
  import styles from './styles.js';
13
13
  import Routes from '../../utils/Route';
14
+ import { HeaderCustom } from '../Header';
14
15
 
15
16
  const SubUnitItem = memo(({ item, index, selectedIndex, setSelectedIndex }) => {
16
17
  const handleSelectIndex = useCallback(() => {
@@ -78,9 +79,7 @@ const SelectSubUnit = ({ unitId, title, subTitle, onPressNext, route }) => {
78
79
 
79
80
  return (
80
81
  <View style={styles.container}>
81
- <Text semibold style={styles.title}>
82
- {title}
83
- </Text>
82
+ <HeaderCustom title={title} isShowSeparator />
84
83
  <Text style={styles.subtitle}>{subTitle}</Text>
85
84
  <View style={styles.contentContainer}>
86
85
  <ScrollView
@@ -1,12 +1,10 @@
1
1
  import { StyleSheet } from 'react-native';
2
2
  import { Colors } from '../../configs';
3
- import { getStatusBarHeight } from '../../configs/Constants';
4
3
 
5
4
  export default StyleSheet.create({
6
5
  container: {
7
6
  flex: 1,
8
7
  backgroundColor: Colors.Gray2,
9
- paddingTop: getStatusBarHeight(),
10
8
  },
11
9
  contentContainer: {
12
10
  flex: 1,
@@ -29,7 +27,7 @@ export default StyleSheet.create({
29
27
  fontSize: 14,
30
28
  lineHeight: 22,
31
29
  marginLeft: 16,
32
- marginBottom: 16,
30
+ marginVertical: 16,
33
31
  },
34
32
  row: {
35
33
  flex: 1,
@@ -0,0 +1,19 @@
1
+ import React, { memo } from 'react';
2
+ import { View } from 'react-native';
3
+
4
+ import Text from '../Text';
5
+ import styles from './styles';
6
+ import { useTranslations } from '../../hooks/Common/useTranslations';
7
+
8
+ const StatusBox = ({ status }) => {
9
+ const t = useTranslations();
10
+ return (
11
+ <View style={[styles.viewStatus, status && styles.viewOnline]}>
12
+ <Text style={[styles.textStatus, status && styles.textOnline]}>
13
+ {t(status ? 'online' : 'offline')}
14
+ </Text>
15
+ </View>
16
+ );
17
+ };
18
+
19
+ export default memo(StatusBox);
@@ -0,0 +1,30 @@
1
+ import { StyleSheet } from 'react-native';
2
+ import { Colors } from '../../configs';
3
+
4
+ export default StyleSheet.create({
5
+ viewStatus: {
6
+ width: 65,
7
+ paddingHorizontal: 8,
8
+ paddingVertical: 4,
9
+ borderRadius: 54,
10
+ backgroundColor: Colors.White,
11
+ borderColor: Colors.Neutral.Neutral3,
12
+ borderWidth: 1,
13
+ },
14
+ textStatus: {
15
+ fontStyle: 'normal',
16
+ fontWeight: 600,
17
+ letterSpacing: 0.04,
18
+ fontSize: 12,
19
+ lineHeight: 16,
20
+ textTransform: 'uppercase',
21
+ textAlign: 'center',
22
+ },
23
+ textOnline: {
24
+ fontStyle: 'bold',
25
+ },
26
+ viewOnline: {
27
+ backgroundColor: Colors.LightGreen,
28
+ borderWidth: 0,
29
+ },
30
+ });
@@ -21,7 +21,7 @@ const { standardizeWidth, standardizeHeight } = standardizeCameraScreenSize(
21
21
  Device.screenWidth - 32
22
22
  );
23
23
 
24
- const ShortDetailSubUnit = ({ unit, station }) => {
24
+ const ShortDetailSubUnit = ({ unit, station, isOwner }) => {
25
25
  const t = useTranslations();
26
26
  const { navigate } = useNavigation();
27
27
 
@@ -100,11 +100,12 @@ const ShortDetailSubUnit = ({ unit, station }) => {
100
100
 
101
101
  const handleOnAddNew = () => {
102
102
  navigate(Routes.AddGatewayStack, {
103
- screen: Routes.FirstWarning,
103
+ screen: Routes.SelectDeviceType,
104
104
  params: {
105
- stationId: station?.id,
106
105
  unitId: unit.id,
107
106
  unitName: unit.name,
107
+ stationId: station?.id,
108
+ stationName: station?.name,
108
109
  },
109
110
  });
110
111
  };
@@ -154,7 +155,9 @@ const ShortDetailSubUnit = ({ unit, station }) => {
154
155
  );
155
156
  }
156
157
  })}
157
- <ItemAddNew title={t('add_new_device')} onAddNew={handleOnAddNew} />
158
+ {isOwner && (
159
+ <ItemAddNew title={t('add_new_device')} onAddNew={handleOnAddNew} />
160
+ )}
158
161
  </View>
159
162
  </Section>
160
163
  );
@@ -72,6 +72,7 @@ describe('test ShortDetail Subunit', () => {
72
72
  id: 71,
73
73
  name: 'Station 1',
74
74
  },
75
+ isOwner: true,
75
76
  isNetworkConnected: true,
76
77
  isGGHomeConnected: true,
77
78
  };
@@ -171,8 +172,9 @@ describe('test ShortDetail Subunit', () => {
171
172
  });
172
173
  await mock.request(keyPermission.CAMERA);
173
174
  expect(mockedNavigate).toHaveBeenCalledWith(Routes.AddGatewayStack, {
174
- screen: Routes.FirstWarning,
175
+ screen: Routes.SelectDeviceType,
175
176
  params: {
177
+ stationName: props.station.name,
176
178
  stationId: props.station.id,
177
179
  unitId: props.unit.id,
178
180
  unitName: props.unit.name,
@@ -16,7 +16,10 @@ import RadioCircle from './RadioCircle';
16
16
  import { CircleButton } from './CircleButton';
17
17
  import HorizontalPicker from './HorizontalPicker';
18
18
  import FullLoading from './FullLoading';
19
-
19
+ import Text from './Text';
20
+ import { HeaderCustom } from './Header';
21
+ import StatusBox from './StatusBox';
22
+ import WrapHeaderScrollable from './Sharing/WrapHeaderScrollable';
20
23
  export {
21
24
  ButtonPopup,
22
25
  CircleView,
@@ -36,4 +39,8 @@ export {
36
39
  CircleButton,
37
40
  HorizontalPicker,
38
41
  FullLoading,
42
+ Text,
43
+ HeaderCustom,
44
+ StatusBox,
45
+ WrapHeaderScrollable,
39
46
  };
@@ -211,6 +211,10 @@ const API = {
211
211
  GET_TEMPLATES: '/property_manager/iot_dashboard/dev_mode/templates/',
212
212
  GET_WIDGETS: (templateId) =>
213
213
  `/property_manager/iot_dashboard/dev_mode/templates/${templateId}/list_widgets/`,
214
+ GATEWAY: {
215
+ LIST: () => '/chip_manager/developer_mode_chips/',
216
+ DETAIL: (id) => `/chip_manager/developer_mode_chips/${id}/`,
217
+ },
214
218
  },
215
219
  };
216
220
 
@@ -638,7 +638,8 @@ export default {
638
638
  BUTTON_CANCEL_EDIT_ACTION_LIST: 'BUTTON_CANCEL_EDIT_ACTION_LIST',
639
639
  BUTTON_SAVE_EDIT_ACTION_LIST: 'BUTTON_SAVE_EDIT_ACTION_LIST',
640
640
  BUTTON_REMOVE_EDIT_ACTION_LIST: 'BUTTON_REMOVE_EDIT_ACTION_LIST',
641
-
641
+ // GATEWAY
642
+ LIST_GATEWAY: 'LIST_GATEWAY',
642
643
  //Notification
643
644
  CUSTOM_TEXT: 'CUSTOM_TEXT',
644
645
  //ButtonWrapper
@@ -60,6 +60,7 @@ export const Colors = {
60
60
  Gray17: '#D3D3D3',
61
61
  Gray18: '#9B9A9B',
62
62
  Gray19: '#E5E5E5',
63
+ Gray20: '#808080',
63
64
 
64
65
  // Range Green
65
66
  Green1: '#F6FFED',
@@ -63,7 +63,7 @@ describe('Test SelectSubUnit container', () => {
63
63
  let tree;
64
64
  const list_type = ['AddHassiDevice'];
65
65
  const result = [
66
- '',
66
+ 'Add new Sub-unit',
67
67
  '',
68
68
  'Select a sub-unit that you want to add this device in',
69
69
  ];
@@ -76,7 +76,7 @@ describe('Test SelectSubUnit container', () => {
76
76
  });
77
77
  const instance = tree.root;
78
78
  const button = instance.findAllByType(TouchableOpacity);
79
- expect(button.length).toBe(3);
79
+ expect(button.length).toBe(4);
80
80
  const button1 = instance.findAllByType(Text);
81
81
  expect(button1[1].props.children).toEqual(result[i]);
82
82
  });
@@ -10,23 +10,27 @@ const ConnectingDevice = ({
10
10
  onReady,
11
11
  unitId,
12
12
  stationId,
13
+ stationName,
13
14
  chipId,
14
15
  sensorId,
16
+ addDeviceType,
15
17
  }) => {
16
18
  const { navigate } = useNavigation();
17
19
 
18
20
  const [renameParams, setRenameParams] = useState({
19
21
  unitId,
20
22
  stationId,
23
+ stationName,
21
24
  chipId,
22
25
  sensorId,
26
+ addDeviceType,
23
27
  });
24
28
 
25
29
  const complete = useCallback(
26
30
  (deviceInfo) => {
27
- navigate(Routes.RenameNewDevices, renameParams);
31
+ navigate(Routes.RenameNewDevices, { ...renameParams, chipId, sensorId });
28
32
  },
29
- [navigate, renameParams]
33
+ [chipId, navigate, renameParams, sensorId]
30
34
  );
31
35
 
32
36
  const onMessage = useCallback(
@@ -8,7 +8,8 @@ import ConnectingDevice from './ConnectingDevice';
8
8
 
9
9
  const ConnectingModbusDevice = ({ route }) => {
10
10
  const t = useTranslations();
11
- const { unitId, stationId, chipId, qrData } = route?.params || {};
11
+ const { unitId, stationId, stationName, chipId, qrData } =
12
+ route?.params || {};
12
13
  const [sensorId, setSensorId] = useState(null);
13
14
  const { goBack } = useNavigation();
14
15
 
@@ -46,12 +47,13 @@ const ConnectingModbusDevice = ({ route }) => {
46
47
 
47
48
  return (
48
49
  <ConnectingDevice
49
- title={t('connecting_modbus_device')}
50
+ title={t('connect_device')}
50
51
  initState={t('connecting_to_gateway')}
51
52
  onReady={onReady}
52
53
  fail={addingModbusDeviceFail}
53
54
  unitId={unitId}
54
55
  stationId={stationId}
56
+ stationName={stationName}
55
57
  chipId={chipId}
56
58
  sensorId={sensorId}
57
59
  />
@@ -8,8 +8,15 @@ import ConnectingDevice from './ConnectingDevice';
8
8
 
9
9
  const ConnectingWifiDevice = ({ route }) => {
10
10
  const t = useTranslations();
11
- const { unitId, stationId, gateway, selectedWifi, qrData } =
12
- route?.params || {};
11
+ const {
12
+ unitId,
13
+ stationId,
14
+ stationName,
15
+ gateway,
16
+ selectedWifi,
17
+ qrData,
18
+ addDeviceType,
19
+ } = route?.params || {};
13
20
  const [chipId, setChipId] = useState(null);
14
21
  const { goBack } = useNavigation();
15
22
 
@@ -47,25 +54,26 @@ const ConnectingWifiDevice = ({ route }) => {
47
54
  setChipId(data.id);
48
55
  },
49
56
  [
50
- qrData,
51
57
  gateway,
52
- addingWifiDeviceFail,
58
+ selectedWifi,
53
59
  unitId,
60
+ qrData?.secret,
54
61
  stationId,
55
- selectedWifi.ssid,
56
- selectedWifi.password,
62
+ addingWifiDeviceFail,
57
63
  ]
58
64
  );
59
65
 
60
66
  return (
61
67
  <ConnectingDevice
62
- title={t('connecting_wifi_device')}
68
+ title={t('connect_device')}
63
69
  fail={addingWifiDeviceFail}
64
70
  initState={t('connecting_to_device')}
65
71
  onReady={onReady}
66
72
  unitId={unitId}
67
73
  stationId={stationId}
74
+ stationName={stationName}
68
75
  chipId={chipId}
76
+ addDeviceType={addDeviceType}
69
77
  />
70
78
  );
71
79
  };
@@ -23,7 +23,7 @@ import AccessibilityLabel from '../../configs/AccessibilityLabel';
23
23
 
24
24
  const ConnectingWifiGuide = ({ route }) => {
25
25
  const t = useTranslations();
26
- const { qrData, unitId, stationId } = route?.params || {};
26
+ const { qrData, unitId, stationId, addDeviceType } = route?.params || {};
27
27
  const { navigate, goBack } = useNavigation();
28
28
  const [wifiList, setWifiList] = useState([]);
29
29
  const [currentState, setCurrentState] = useState(0);
@@ -84,7 +84,7 @@ const ConnectingWifiGuide = ({ route }) => {
84
84
  } catch (e) {
85
85
  Alert.alert(
86
86
  t('cannot_connect_to_device_wifi'),
87
- t('try to turn on device or try again'),
87
+ t('try_turn_on_device_or_try_again'),
88
88
  buttons
89
89
  );
90
90
  return;
@@ -128,9 +128,10 @@ const ConnectingWifiGuide = ({ route }) => {
128
128
  stationId,
129
129
  wifiList,
130
130
  qrData: qrData,
131
+ addDeviceType,
131
132
  });
132
133
  }
133
- }, [navigate, qrData, stationId, unitId, wifiList]);
134
+ }, [addDeviceType, navigate, qrData, stationId, unitId, wifiList]);
134
135
 
135
136
  return (
136
137
  <SafeAreaView style={styles.container}>
@@ -9,7 +9,7 @@ import ConnectingDevice from './ConnectingDevice';
9
9
  const ConnectingZigbeeDevice = ({ route }) => {
10
10
  const t = useTranslations();
11
11
  const { goBack } = useNavigation();
12
- const { unitId, stationId, chipId } = route?.params || {};
12
+ const { unitId, stationId, stationName, chipId } = route?.params || {};
13
13
  const [sensorId, setSensorId] = useState(null);
14
14
 
15
15
  const fail = useCallback(
@@ -46,12 +46,13 @@ const ConnectingZigbeeDevice = ({ route }) => {
46
46
 
47
47
  return (
48
48
  <ConnectingDevice
49
- title={t('connecting_zigbee_device')}
49
+ title={t('connect_device')}
50
50
  fail={fail}
51
51
  initState={t('connecting_to_gateway')}
52
52
  onReady={onReady}
53
53
  unitId={unitId}
54
54
  stationId={stationId}
55
+ stationName={stationName}
55
56
  chipId={chipId}
56
57
  sensorId={sensorId}
57
58
  />