@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.
- package/assets/images/brightnessBlack.svg +12 -0
- package/index.js +4 -0
- package/package.json +1 -1
- package/src/Images/SmartIr/AC.svg +14 -0
- package/src/Images/SmartIr/DIY.svg +3 -0
- package/src/Images/SmartIr/Fan.svg +10 -0
- package/src/Images/SmartIr/Fridge.svg +5 -0
- package/src/Images/SmartIr/TV.svg +10 -0
- package/src/Images/SmartIr/WM.svg +11 -0
- package/src/Images/SmartIr/index.js +7 -0
- package/src/commons/ActionGroup/OnOffSmartLock/AutoLock/AutoLockStyles.js +40 -0
- package/src/commons/ActionGroup/OnOffSmartLock/AutoLock/ButtonWrapper.js +65 -0
- package/src/commons/ActionGroup/OnOffSmartLock/AutoLock/ButtonWrapperStyles.js +43 -0
- package/src/commons/ActionGroup/OnOffSmartLock/AutoLock/__test__/index.test.js +48 -0
- package/src/commons/ActionGroup/OnOffSmartLock/AutoLock/index.js +57 -0
- package/src/commons/ActionGroup/{OnOffSmartLock.js → OnOffSmartLock/OnOffSmartLock.js} +5 -5
- package/src/commons/ActionGroup/{OnOffSmartLockStyle.js → OnOffSmartLock/OnOffSmartLockStyle.js} +1 -1
- package/src/commons/ActionGroup/OnOffSmartLock/PasscodeList/ItemPasscode.js +48 -0
- package/src/commons/ActionGroup/OnOffSmartLock/PasscodeList/ItemPasscodeStyles.js +42 -0
- package/src/commons/ActionGroup/OnOffSmartLock/PasscodeList/PasscodeListStyles.js +49 -0
- package/src/commons/ActionGroup/OnOffSmartLock/PasscodeList/index.js +66 -0
- package/src/commons/ActionGroup/OnOffSmartLock/SetupGeneratePasscode/ButtonWrapper.js +96 -0
- package/src/commons/ActionGroup/OnOffSmartLock/SetupGeneratePasscode/SetupGeneratePasscodeStyles.js +98 -0
- package/src/commons/ActionGroup/OnOffSmartLock/SetupGeneratePasscode/__test__/index.test.js +62 -0
- package/src/commons/ActionGroup/OnOffSmartLock/SetupGeneratePasscode/index.js +249 -0
- package/src/commons/ActionGroup/OnOffTemplate/index.js +4 -2
- package/src/commons/ActionGroup/OptionsDropdownActionTemplate.js +2 -1
- package/src/commons/ActionGroup/SmartTiviActionTemplate/SmartTiviActionTemplate.js +188 -186
- package/src/commons/ActionGroup/StatesGridActionTemplate.js +2 -1
- package/src/commons/ActionGroup/index.js +1 -1
- package/src/commons/Device/DisconnectedView.js +7 -1
- package/src/commons/Device/LinearChart.js +3 -40
- package/src/commons/Device/__test__/DisconnectedView.test.js +13 -2
- package/src/commons/RowItem/index.js +12 -7
- package/src/commons/WheelDateTimePicker/index.js +18 -4
- package/src/configs/API.js +1 -1
- package/src/configs/Colors.js +1 -0
- package/src/configs/Constants.js +11 -0
- package/src/context/mockStore.ts +1 -0
- package/src/iot/RemoteControl/Bluetooth.js +3 -3
- package/src/navigations/SmartIrStack.js +31 -0
- package/src/navigations/SmartLockStack.js +51 -0
- package/src/navigations/UnitStack.js +12 -3
- package/src/screens/AddCommon/__test__/SelectSubUnit.test.js +1 -1
- package/src/screens/AddNewGateway/PlugAndPlay/ConnectWifiWarning.js +77 -55
- package/src/screens/AddNewGateway/PlugAndPlay/GatewayWifiList.js +141 -27
- package/src/screens/AddNewGateway/PlugAndPlay/__test__/ConnectWifiWarning.test.js +58 -0
- package/src/screens/AddNewGateway/PlugAndPlay/__test__/GatewayWifiList.test.js +26 -2
- package/src/screens/Device/components/SensorConnectStatusViewHeader.js +13 -2
- package/src/screens/Device/detail.js +49 -10
- package/src/screens/Device/hooks/useDisconnectedDevice.js +21 -5
- package/src/screens/GuestInfo/components/AccessScheduleItem.js +9 -2
- package/src/screens/GuestInfo/components/RecurringDetail.js +3 -2
- package/src/screens/GuestInfo/components/TemporaryDetail.js +3 -2
- package/src/screens/GuestInfo/styles/AccessScheduleItemStyles.js +3 -0
- package/src/screens/Notification/__test__/NotificationItem.test.js +1 -0
- package/src/screens/Notification/components/NotificationItem.js +16 -0
- package/src/screens/SmartIr/__test__/GroupButtonByType.test.js +54 -0
- package/src/screens/SmartIr/__test__/SelectBrand.test.js +74 -0
- package/src/screens/SmartIr/__test__/SelectDeviceType.test.js +64 -0
- package/src/screens/SmartIr/__test__/SmartIr.test.js +1 -0
- package/src/screens/SmartIr/components/GroupButtonByType/GroupButtonByType.js +86 -0
- package/src/screens/SmartIr/components/GroupButtonByType/GroupButtonByTypeStyles.js +76 -0
- package/src/screens/SmartIr/components/SelectBrand.js +61 -0
- package/src/screens/SmartIr/components/SelectBrandStyles.js +14 -0
- package/src/screens/SmartIr/components/SelectDeviceType.js +96 -0
- package/src/screens/SmartIr/components/SelectDeviceTypeStyles.js +30 -0
- package/src/screens/SmartIr/index.js +8 -3
- package/src/screens/Unit/Detail.js +7 -3
- package/src/screens/Unit/components/MyUnitDevice/index.js +2 -4
- package/src/screens/Unit/components/__test__/MyUnitDevice.test.js +38 -9
- package/src/utils/I18n/translations/en.json +24 -1
- package/src/utils/I18n/translations/vi.json +24 -1
- 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
|
|
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
|
-
|
|
11
|
-
|
|
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
|
|
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
|
|
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(
|
|
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
|
}
|
package/src/utils/Route/index.js
CHANGED
|
@@ -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
|
-
|
|
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;
|