@eohjsc/react-native-smart-city 0.2.86 → 0.2.87

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 (74) hide show
  1. package/assets/images/brightnessBlack.svg +12 -0
  2. package/index.js +4 -0
  3. package/package.json +1 -1
  4. package/src/Images/SmartIr/AC.svg +14 -0
  5. package/src/Images/SmartIr/DIY.svg +3 -0
  6. package/src/Images/SmartIr/Fan.svg +10 -0
  7. package/src/Images/SmartIr/Fridge.svg +5 -0
  8. package/src/Images/SmartIr/TV.svg +10 -0
  9. package/src/Images/SmartIr/WM.svg +11 -0
  10. package/src/Images/SmartIr/index.js +7 -0
  11. package/src/commons/ActionGroup/OnOffSmartLock/AutoLock/AutoLockStyles.js +40 -0
  12. package/src/commons/ActionGroup/OnOffSmartLock/AutoLock/ButtonWrapper.js +65 -0
  13. package/src/commons/ActionGroup/OnOffSmartLock/AutoLock/ButtonWrapperStyles.js +43 -0
  14. package/src/commons/ActionGroup/OnOffSmartLock/AutoLock/__test__/index.test.js +48 -0
  15. package/src/commons/ActionGroup/OnOffSmartLock/AutoLock/index.js +57 -0
  16. package/src/commons/ActionGroup/{OnOffSmartLock.js → OnOffSmartLock/OnOffSmartLock.js} +5 -5
  17. package/src/commons/ActionGroup/{OnOffSmartLockStyle.js → OnOffSmartLock/OnOffSmartLockStyle.js} +1 -1
  18. package/src/commons/ActionGroup/OnOffSmartLock/PasscodeList/ItemPasscode.js +48 -0
  19. package/src/commons/ActionGroup/OnOffSmartLock/PasscodeList/ItemPasscodeStyles.js +42 -0
  20. package/src/commons/ActionGroup/OnOffSmartLock/PasscodeList/PasscodeListStyles.js +49 -0
  21. package/src/commons/ActionGroup/OnOffSmartLock/PasscodeList/index.js +66 -0
  22. package/src/commons/ActionGroup/OnOffSmartLock/SetupGeneratePasscode/ButtonWrapper.js +96 -0
  23. package/src/commons/ActionGroup/OnOffSmartLock/SetupGeneratePasscode/SetupGeneratePasscodeStyles.js +98 -0
  24. package/src/commons/ActionGroup/OnOffSmartLock/SetupGeneratePasscode/__test__/index.test.js +62 -0
  25. package/src/commons/ActionGroup/OnOffSmartLock/SetupGeneratePasscode/index.js +249 -0
  26. package/src/commons/ActionGroup/OnOffTemplate/index.js +4 -2
  27. package/src/commons/ActionGroup/OptionsDropdownActionTemplate.js +2 -1
  28. package/src/commons/ActionGroup/SmartTiviActionTemplate/SmartTiviActionTemplate.js +188 -186
  29. package/src/commons/ActionGroup/StatesGridActionTemplate.js +2 -1
  30. package/src/commons/ActionGroup/index.js +1 -1
  31. package/src/commons/Device/DisconnectedView.js +7 -1
  32. package/src/commons/Device/LinearChart.js +3 -40
  33. package/src/commons/Device/__test__/DisconnectedView.test.js +13 -2
  34. package/src/commons/RowItem/index.js +12 -7
  35. package/src/commons/WheelDateTimePicker/index.js +18 -4
  36. package/src/configs/API.js +1 -1
  37. package/src/configs/Colors.js +1 -0
  38. package/src/configs/Constants.js +11 -0
  39. package/src/context/mockStore.ts +1 -0
  40. package/src/iot/RemoteControl/Bluetooth.js +3 -3
  41. package/src/navigations/SmartIrStack.js +31 -0
  42. package/src/navigations/SmartLockStack.js +51 -0
  43. package/src/navigations/UnitStack.js +12 -3
  44. package/src/screens/AddCommon/__test__/SelectSubUnit.test.js +1 -1
  45. package/src/screens/AddNewGateway/PlugAndPlay/ConnectWifiWarning.js +77 -55
  46. package/src/screens/AddNewGateway/PlugAndPlay/GatewayWifiList.js +141 -27
  47. package/src/screens/AddNewGateway/PlugAndPlay/__test__/ConnectWifiWarning.test.js +58 -0
  48. package/src/screens/AddNewGateway/PlugAndPlay/__test__/GatewayWifiList.test.js +26 -2
  49. package/src/screens/Device/components/SensorConnectStatusViewHeader.js +13 -2
  50. package/src/screens/Device/detail.js +49 -10
  51. package/src/screens/Device/hooks/useDisconnectedDevice.js +21 -5
  52. package/src/screens/GuestInfo/components/AccessScheduleItem.js +9 -2
  53. package/src/screens/GuestInfo/components/RecurringDetail.js +3 -2
  54. package/src/screens/GuestInfo/components/TemporaryDetail.js +3 -2
  55. package/src/screens/GuestInfo/styles/AccessScheduleItemStyles.js +3 -0
  56. package/src/screens/Notification/__test__/NotificationItem.test.js +1 -0
  57. package/src/screens/Notification/components/NotificationItem.js +16 -0
  58. package/src/screens/SmartIr/__test__/GroupButtonByType.test.js +54 -0
  59. package/src/screens/SmartIr/__test__/SelectBrand.test.js +74 -0
  60. package/src/screens/SmartIr/__test__/SelectDeviceType.test.js +64 -0
  61. package/src/screens/SmartIr/__test__/SmartIr.test.js +1 -0
  62. package/src/screens/SmartIr/components/GroupButtonByType/GroupButtonByType.js +86 -0
  63. package/src/screens/SmartIr/components/GroupButtonByType/GroupButtonByTypeStyles.js +76 -0
  64. package/src/screens/SmartIr/components/SelectBrand.js +61 -0
  65. package/src/screens/SmartIr/components/SelectBrandStyles.js +14 -0
  66. package/src/screens/SmartIr/components/SelectDeviceType.js +96 -0
  67. package/src/screens/SmartIr/components/SelectDeviceTypeStyles.js +30 -0
  68. package/src/screens/SmartIr/index.js +8 -3
  69. package/src/screens/Unit/Detail.js +7 -3
  70. package/src/screens/Unit/components/MyUnitDevice/index.js +2 -4
  71. package/src/screens/Unit/components/__test__/MyUnitDevice.test.js +38 -9
  72. package/src/utils/I18n/translations/en.json +24 -1
  73. package/src/utils/I18n/translations/vi.json +24 -1
  74. package/src/utils/Route/index.js +9 -1
@@ -0,0 +1,61 @@
1
+ import React, { memo, useCallback, useState } from 'react';
2
+ import { View, ScrollView } from 'react-native';
3
+ import { useNavigation } from '@react-navigation/native';
4
+ import { HeaderCustom } from '../../../commons/Header';
5
+ import { useTranslations } from '../../../hooks/Common/useTranslations';
6
+ import Routes from '../../../utils/Route';
7
+ import { RowItem } from '../../../commons/RowItem';
8
+ import { IconOutline } from '@ant-design/icons-react-native';
9
+ import { Colors } from '../../../configs';
10
+
11
+ import styles from './SelectBrandStyles';
12
+
13
+ const SelectDeviceType = memo(({ route }) => {
14
+ const t = useTranslations();
15
+ const { navigate } = useNavigation();
16
+ const tempBrand = [
17
+ { id: 1, name: 'Samsung' },
18
+ { id: 2, name: 'LG' },
19
+ { id: 3, name: 'Apple' },
20
+ ];
21
+ const [deviceBrand] = useState(tempBrand);
22
+
23
+ const handleOnPressItem = useCallback(
24
+ (item) => () => {
25
+ navigate(Routes.SmartIrStack, {
26
+ screen: Routes.GroupButtonByType,
27
+ params: {
28
+ device_type: item || {},
29
+ brand: item || {},
30
+ },
31
+ });
32
+ },
33
+ [navigate]
34
+ );
35
+
36
+ return (
37
+ <View style={styles.container}>
38
+ <HeaderCustom title={t('select_brand')} />
39
+ <ScrollView>
40
+ <View style={styles.listBrands}>
41
+ {!!deviceBrand &&
42
+ deviceBrand.map((item, index) => {
43
+ return (
44
+ <RowItem
45
+ onPress={handleOnPressItem(item)}
46
+ text={item?.name}
47
+ key={index.toString()}
48
+ isShowSubText={false}
49
+ rightComponent={
50
+ <IconOutline name="right" size={20} color={Colors.Gray7} />
51
+ }
52
+ />
53
+ );
54
+ })}
55
+ </View>
56
+ </ScrollView>
57
+ </View>
58
+ );
59
+ });
60
+
61
+ export default SelectDeviceType;
@@ -0,0 +1,14 @@
1
+ import { StyleSheet } from 'react-native';
2
+ import { Colors } from '../../../configs';
3
+
4
+ export default StyleSheet.create({
5
+ container: {
6
+ flex: 1,
7
+ backgroundColor: Colors.White,
8
+ },
9
+ listBrands: {
10
+ flex: 1,
11
+ paddingTop: 16,
12
+ paddingHorizontal: 16,
13
+ },
14
+ });
@@ -0,0 +1,96 @@
1
+ import React, { memo, useCallback, useState } from 'react';
2
+ import { View, TouchableOpacity, ScrollView } from 'react-native';
3
+ import { useNavigation } from '@react-navigation/native';
4
+ import Text from '../../../commons/Text';
5
+ import { HeaderCustom } from '../../../commons/Header';
6
+ import { useTranslations } from '../../../hooks/Common/useTranslations';
7
+ import { AC, DIY, Fan, Fridge, TV, WM } from '../../../Images/SmartIr';
8
+ import Routes from '../../../utils/Route';
9
+
10
+ import styles from './SelectDeviceTypeStyles';
11
+
12
+ const SelectDeviceType = memo(() => {
13
+ const t = useTranslations();
14
+ const { navigate } = useNavigation();
15
+ const tempDeviceType = [
16
+ { id: 1, icon: 'tv', name: 'TV' },
17
+ { id: 2, icon: 'fan', name: 'Fan' },
18
+ { id: 3, icon: 'ac', name: 'AC' },
19
+ { id: 4, icon: 'wm', name: 'wm' },
20
+ { id: 5, icon: 'fridge', name: 'Fridge' },
21
+ { id: 6, icon: 'diy', name: 'DIY' },
22
+ ];
23
+ const [deviceType] = useState(tempDeviceType);
24
+
25
+ const handleOnPressItem = useCallback(
26
+ (item) => () => {
27
+ navigate(Routes.SmartIrStack, {
28
+ screen: Routes.SelectBrand,
29
+ params: {
30
+ device_type: item || {},
31
+ },
32
+ });
33
+ },
34
+ [navigate]
35
+ );
36
+
37
+ const IconDevice = ({ icon, width, height }) => {
38
+ switch (icon) {
39
+ case 'tv':
40
+ return <TV width={width} height={height} />;
41
+ case 'fan':
42
+ return <Fan width={width} height={height} />;
43
+ case 'ac':
44
+ return <AC width={width} height={height} />;
45
+ case 'wm':
46
+ return <WM width={width} height={height} />;
47
+ case 'fridge':
48
+ return <Fridge width={width} height={height} />;
49
+ case 'diy':
50
+ return <DIY width={width} height={height} />;
51
+ default:
52
+ return <></>;
53
+ }
54
+ };
55
+ const ItemDevice = useCallback(
56
+ ({ onPress, buttonStyle, textStyle, wrapStyle, name, icon }) => {
57
+ return (
58
+ <TouchableOpacity
59
+ style={[styles.buttonItem, buttonStyle]}
60
+ onPress={onPress}
61
+ >
62
+ <View style={[styles.wrapItem, wrapStyle]}>
63
+ {!!icon && <IconDevice width={60} height={60} icon={icon} />}
64
+ {!!name && (
65
+ <Text style={[styles.textDevice, textStyle]}> {name} </Text>
66
+ )}
67
+ </View>
68
+ </TouchableOpacity>
69
+ );
70
+ },
71
+ []
72
+ );
73
+
74
+ return (
75
+ <View style={styles.container}>
76
+ <HeaderCustom title={t('select_device_type')} />
77
+ <ScrollView>
78
+ <View style={styles.listDevices}>
79
+ {!!deviceType &&
80
+ deviceType.map((item, index) => {
81
+ return (
82
+ <ItemDevice
83
+ onPress={handleOnPressItem(item)}
84
+ name={item?.name}
85
+ icon={item?.icon}
86
+ key={index.toString()}
87
+ />
88
+ );
89
+ })}
90
+ </View>
91
+ </ScrollView>
92
+ </View>
93
+ );
94
+ });
95
+
96
+ export default SelectDeviceType;
@@ -0,0 +1,30 @@
1
+ import { StyleSheet } from 'react-native';
2
+ import { Colors, Constants } from '../../../configs';
3
+
4
+ export default StyleSheet.create({
5
+ container: {
6
+ flex: 1,
7
+ backgroundColor: Colors.White,
8
+ },
9
+ wrapItem: {
10
+ justifyContent: 'center',
11
+ alignItems: 'center',
12
+ paddingTop: 34,
13
+ paddingBottom: 60,
14
+ paddingHorizontal: 52,
15
+ },
16
+ listDevices: {
17
+ paddingTop: 16,
18
+ flexDirection: 'row',
19
+ justifyContent: 'space-between',
20
+ flexWrap: 'wrap',
21
+ paddingHorizontal: 16,
22
+ },
23
+ buttonItem: {
24
+ width: Constants.width / 2 - 25,
25
+ borderRadius: 10,
26
+ borderWidth: 1,
27
+ borderColor: Colors.Gray4,
28
+ marginBottom: 15,
29
+ },
30
+ });
@@ -1,14 +1,19 @@
1
1
  import React, { memo, useCallback } from 'react';
2
- import { View, Alert } from 'react-native';
2
+ import { View } from 'react-native';
3
3
  import { useTranslations } from '../../hooks/Common/useTranslations';
4
4
  import ItemAddNew from '../../commons/Device/ItemAddNew';
5
+ import Routes from '../../utils/Route';
6
+ import { useNavigation } from '@react-navigation/native';
5
7
  import styles from './styles';
6
8
 
7
9
  const SmartIr = memo(({ item }) => {
8
10
  const t = useTranslations();
11
+ const { navigate } = useNavigation();
9
12
  const AddRemoteControl = useCallback(() => {
10
- Alert.alert(t('feature_under_development'));
11
- }, [t]);
13
+ navigate(Routes.SmartIrStack, {
14
+ screen: Routes.SelectDeviceType,
15
+ });
16
+ }, [navigate]);
12
17
  return (
13
18
  <View style={styles.container}>
14
19
  <ItemAddNew
@@ -82,6 +82,7 @@ const UnitDetail = ({ route }) => {
82
82
  const [showAdd, setShowAdd, setHideAdd] = useBoolean();
83
83
  const [isFullScreen, setIsFullScreen] = useState(false);
84
84
  const [dataFullScreen, setDataFullScreen] = useState();
85
+ const [serverDown, setServerDown] = useState(false);
85
86
 
86
87
  const { childRef, showingPopover, showPopoverWithRef, hidePopover } =
87
88
  usePopover();
@@ -128,10 +129,13 @@ const UnitDetail = ({ route }) => {
128
129
  const fetchDetails = useCallback(async () => {
129
130
  getAutomates();
130
131
  await fetchWithCache(API.UNIT.UNIT_DETAIL(unitId), {}, (response) => {
131
- const { success, data } = response;
132
+ const { success, data, resp_status } = response;
132
133
  if (success) {
134
+ setServerDown(false);
133
135
  prepareData(data);
134
136
  setUnit(data);
137
+ } else if (resp_status >= 500) {
138
+ setServerDown(true);
135
139
  }
136
140
  });
137
141
  }, [setUnit, unitId, prepareData, getAutomates]);
@@ -311,7 +315,7 @@ const UnitDetail = ({ route }) => {
311
315
  isOwner={isOwner}
312
316
  favorites={favorites}
313
317
  wrapItemStyle={styles.wrapItemStyle}
314
- isNetworkConnected={isNetworkConnected}
318
+ isNetworkConnected={isNetworkConnected && !serverDown}
315
319
  isGGHomeConnected={isGGHomeConnected}
316
320
  />
317
321
  );
@@ -338,7 +342,7 @@ const UnitDetail = ({ route }) => {
338
342
  <ShortDetailSubUnit
339
343
  unit={unit}
340
344
  station={station}
341
- isNetworkConnected={isNetworkConnected}
345
+ isNetworkConnected={isNetworkConnected && !serverDown}
342
346
  isGGHomeConnected={isGGHomeConnected}
343
347
  />
344
348
  );
@@ -16,10 +16,8 @@ const MyUnitDevice = ({ sensor, unit }) => {
16
16
  navigate(Routes.UnitStack, {
17
17
  screen: Routes.DeviceDetail,
18
18
  params: {
19
- unit,
20
- sensor,
21
- title: sensor?.name,
22
- station: sensor?.station,
19
+ unitData: unit,
20
+ sensorData: sensor,
23
21
  },
24
22
  });
25
23
  }, [navigate, sensor, unit]);
@@ -1,33 +1,62 @@
1
1
  import React from 'react';
2
- import { View } from 'react-native';
2
+ import { View, TouchableOpacity } from 'react-native';
3
3
  import { act, create } from 'react-test-renderer';
4
4
  import { SCProvider } from '../../../../context';
5
5
  import { mockSCStore } from '../../../../context/mockStore';
6
6
  import MyUnitDevice from '../MyUnitDevice';
7
7
 
8
- const wrapComponent = (sensor) => (
8
+ const mockNavigate = jest.fn();
9
+ jest.mock('@react-navigation/native', () => {
10
+ return {
11
+ ...jest.requireActual('@react-navigation/native'),
12
+ useNavigation: () => ({
13
+ navigate: mockNavigate,
14
+ }),
15
+ };
16
+ });
17
+
18
+ const wrapComponent = (props) => (
9
19
  <SCProvider initState={mockSCStore({})}>
10
- <MyUnitDevice sensor={sensor} />
20
+ <MyUnitDevice {...props} />
11
21
  </SCProvider>
12
22
  );
13
23
 
14
24
  describe('Test MyUnitDevice', () => {
15
- let tree;
25
+ let tree, props;
26
+
27
+ beforeEach(() => {
28
+ props = {
29
+ sensor: {
30
+ status: 'Ok',
31
+ name: 'Test',
32
+ station_name: '',
33
+ },
34
+ unit: {
35
+ id: 1,
36
+ },
37
+ };
38
+ });
16
39
 
17
40
  it('Test render with status', async () => {
18
- await act(() => {
19
- tree = create(
20
- wrapComponent({ status: 'Ok', name: 'Test', station_name: '' })
21
- );
41
+ await act(async () => {
42
+ tree = await create(wrapComponent(props));
22
43
  });
23
44
  const instance = tree.root;
24
45
  const Views = instance.findAllByType(View);
25
46
  expect(Views).toHaveLength(10);
47
+
48
+ const touches = instance.findAllByType(TouchableOpacity);
49
+ expect(touches).toHaveLength(1);
50
+ await act(async () => {
51
+ await touches[0].props.onPress();
52
+ });
53
+ expect(mockNavigate).toHaveBeenCalled();
26
54
  });
27
55
 
28
56
  it('Test render without status', async () => {
57
+ props.sensor.status = undefined;
29
58
  await act(() => {
30
- tree = create(wrapComponent({ name: 'Test', station_name: '' }));
59
+ tree = create(wrapComponent(props));
31
60
  });
32
61
  const instance = tree.root;
33
62
  const Views = instance.findAllByType(View);
@@ -333,6 +333,11 @@
333
333
  "text_remove_sub_unit_fail": "Remove sub unit fail!",
334
334
  "camera": "Camera",
335
335
  "favorites": "Favorites",
336
+ "select_device_type": "Select device type",
337
+ "select_brand": "Select a brand",
338
+ "make_sure_3_button_available": "Please try to make sure more than 3 buttons is available",
339
+ "select_this_one": "Select this one",
340
+ "next_one": "Next one",
336
341
  "add_to_favorites": "Add to Favorites",
337
342
  "add_favorite": "Add Favorite",
338
343
  "remove_from_favorites": "Remove from Favorites",
@@ -358,6 +363,7 @@
358
363
  "suggestions": "Suggestions",
359
364
  "check_the_power": "Check the power on your device.",
360
365
  "check_the_wifi": "Check the Wi-Fi/Cellular signal or try to reset it.",
366
+ "check_the_ble": "Check your Bluetooth status and try use QUICK ACTION to control.",
361
367
  "disconnected": "Disconnected",
362
368
  "ggHomeDisconnected": "Google Home is disconnected",
363
369
  "rename_sub_unit": "Rename sub-unit",
@@ -682,6 +688,7 @@
682
688
  "text_notification_content_smoke": "Smoke appears in **%{unit_name}**. Please check your home and call the rescue team if there is a fire.",
683
689
  "text_notification_content_fire": "There is a fire at **%{unit_name}**, Please move out of the house immediately and call the rescue team.",
684
690
  "text_notification_content_active_sos": "SOS button is activating at **%{unit_name}**, Please check it NOW.",
691
+ "text_notification_content_replace_water_filter": "Filter **%{number_coil}** of **%{device_name}** in **%{unit_name}**: **%{sub_unit_name}** has less than 10h remaining. Check and replace now.",
685
692
  "text_notification_content_remove_unit_to_owner": "Unit **%{unit_name}** has been removed successfully.",
686
693
  "text_notification_content_remove_unit_to_member": "Unit **%{unit_name}** has been removed by **%{unit_owner_name}**. You cannot access to this unit anymore.",
687
694
  "text_notification_content_remove_member": "You were remove from **%{unit_name}** by **%{unit_owner_name}**. You cannot access to this unit anymore.",
@@ -922,5 +929,21 @@
922
929
  "lock": "LOCK",
923
930
  "unlock": "UNLOCK",
924
931
  "door_is_open": "Door is open | unlocked",
925
- "door_is_close": "Door is close | locked"
932
+ "door_is_close": "Door is close | locked",
933
+ "setup_generate_passcode": "Setup generate passcode",
934
+ "choose_user": "Choose user",
935
+ "auto_lock": "Auto Lock",
936
+ "your_door_will_lock": "Your door will lock as soon as it is closed. If it hasn’t been opened, it will re-lock shortly after it’s unlocked.",
937
+ "auto_lock_enabled": "Auto-Lock Enabled",
938
+ "auto_lock_when": "Auto-Lock When",
939
+ "instant":"Instant",
940
+ "re_lock_timing": "Re-lock Timing",
941
+ "re_lock_will_lock": "Re-lock will lock your door if it has been unlocked, but not opened within specified time.",
942
+ "code": "Code",
943
+ "user": "User",
944
+ "create_time": "Create time",
945
+ "status": "Status",
946
+ "delete_passcode": "Delete Passcode",
947
+ "passcode_list": "Passcode list",
948
+ "search": "Search"
926
949
  }
@@ -347,6 +347,11 @@
347
347
  "choose_on_map": "Chọn trên bản đồ",
348
348
  "plan_and_zoom_to_adjust": "Di chuyển và phóng to để điều chỉnh",
349
349
  "add_remote_control": "Thêm điều khiển từ xa",
350
+ "select_device_type": "Chọn loại thiết bị",
351
+ "select_brand": "Chọn một thương hiệu",
352
+ "make_sure_3_button_available": "Hãy cố gắng đảm bảo có nhiều hơn 3 nút",
353
+ "select_this_one": "Chọn cái này",
354
+ "next_one": "Tiếp theo",
350
355
  "manage_sub_unit": "Quản lý khu vực",
351
356
  "remove_sub_unit": "Xóa khu vực",
352
357
  "text_ble_is_powered_on": "Bluetooth đã được mở",
@@ -397,6 +402,7 @@
397
402
  "suggestions": "Gợi ý",
398
403
  "check_the_power": "Kiểm tra lại nguồn điện của thiết bị.",
399
404
  "check_the_wifi": "Kiểm tra lại Wi-Fi/tín hiệu di động hoặc thử khởi động lại.",
405
+ "check_the_ble": "Kiểm tra trạng thái Bluetooth của bạn và thử sử dụng HÀNH ĐỘNG NHANH để điều khiển",
400
406
  "disconnected": "Ngắt kết nối",
401
407
  "ggHomeDisconnected": "Google Home bị ngắt kết nối",
402
408
  "rename_sub_unit": "Đổi tên khu vực",
@@ -690,6 +696,7 @@
690
696
  "text_notification_content_smoke": "Xuất hiện khói tại **%{unit_name}**. Vui lòng kiểm tra nhà của bạn và gọi cho đội cứu hộ nếu xảy ra hỏa hoạn.",
691
697
  "text_notification_content_fire": "Có đám cháy tại **%{unit_name}**, Vui lòng di chuyển ra khỏi nhà ngay lập tức và gọi cho đội cứu hộ.",
692
698
  "text_notification_content_active_sos": "Nút SOS đang kích hoạt tại **%{unit_name}**. Vui lòng kiểm tra nó NGAY BÂY GIỜ.",
699
+ "text_notification_content_replace_water_filter": "Lõi lọc **%{number_coil}** của **%{device_name}** thuộc **%{unit_name}**: **%{sub_unit_name}** còn ít hơn 10 giờ lọc. Vui lòng kiểm tra và thay lõi lọc mới.",
693
700
  "text_notification_content_remove_unit_to_owner": "Địa điểm **%{unit_name}** vừa được xoá thành công.",
694
701
  "text_notification_content_remove_unit_to_member": "Địa điểm **%{unit_name}** vừa được xoá bởi **%{unit_owner_name}**. Bạn không thể truy cập vào địa điểm này được nữa.",
695
702
  "text_notification_content_remove_member": "Bạn vừa được xoá khỏi **%{unit_name}** bởi **%{unit_owner_name}**. Bạn không thể truy cập vào địa điểm này được nữa.",
@@ -924,5 +931,21 @@
924
931
  "lock": "KHÓA",
925
932
  "unlock": "MỞ KHÓA",
926
933
  "door_is_open": "Cửa mở | mở khóa",
927
- "door_is_close": "Cửa đóng | bị khóa"
934
+ "door_is_close": "Cửa đóng | bị khóa",
935
+ "setup_generate_passcode": "Thiết lập tạo mật mã",
936
+ "choose_user": "Chọn người dùng",
937
+ "auto_lock": "khóa tự động",
938
+ "your_door_will_lock": "Cửa của bạn sẽ khóa ngay sau khi nó được đóng lại.Nếu nó chưa được mở,nó sẽ khóa lại ngay sau khi được mở khóa.",
939
+ "auto_lock_enabled": "Tự động khóa được bật",
940
+ "auto_lock_when": "Tự động khóa khi",
941
+ "instant":"Ngay lập tức",
942
+ "re_lock_timing": "Thời gian khóa lại",
943
+ "re_lock_will_lock": "Re-lock sẽ khóa cửa của bạn nếu nó đã được mở khóa, nhưng không được mở trong thời gian quy định.",
944
+ "code": "Mã số",
945
+ "user": "Người dùng",
946
+ "create_time": "Thời gian tạo",
947
+ "status": "Trạng thái",
948
+ "delete_passcode": "Xóa mật mã",
949
+ "passcode_list": "Danh sách mật mã",
950
+ "search": "Tìm kiếm"
928
951
  }
@@ -15,6 +15,7 @@ const Routes = {
15
15
  AddMemberStack: 'AddMemberStack',
16
16
  AddUnitStack: 'AddUnitStack',
17
17
  AddGatewayStack: 'AddGatewayStack',
18
+ SmartIrStack: 'SmartIrStack',
18
19
  EditSubUnit: 'EditSubUnit',
19
20
  Language: 'Language',
20
21
  MyAllUnit: 'MyAllUnit',
@@ -129,7 +130,14 @@ const Routes = {
129
130
  ConfirmUnitDeletion: 'ConfirmUnitDeletion',
130
131
  SmartAccount: 'SmartAccount',
131
132
  SmartHomeDashboard: 'SmartHomeDashboard',
132
- SmartIrSelectDeviceType: 'SmartIrSelectDeviceType',
133
+ SetupGeneratePasscode: 'SetupGeneratePasscode',
134
+ SelectDeviceType: 'SelectDeviceType',
135
+ SelectBrand: 'SelectBrand',
136
+ GroupButtonByType: 'GroupButtonByType',
137
+ AutoLock: 'AutoLock',
138
+ SmartLockStack: 'SmartLockStack',
139
+ PasscodeList: 'PasscodeList',
140
+ ItemPasscode: 'ItemPasscode',
133
141
  };
134
142
 
135
143
  export default Routes;