@eohjsc/react-native-smart-city 0.7.20 → 0.7.22

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 (67) hide show
  1. package/assets/images/Schedule.svg +39 -0
  2. package/assets/images/ValueChange.svg +49 -0
  3. package/package.json +1 -1
  4. package/src/Images/Common/default_end_device.png +0 -0
  5. package/src/commons/Automate/ButtonAddCondition.js +51 -0
  6. package/src/commons/Automate/ItemConditionScriptDetail.js +28 -15
  7. package/src/commons/Automate/ItemConditionScriptDetailStyles.js +9 -0
  8. package/src/commons/Dashboard/MyUnit/index.js +19 -20
  9. package/src/commons/DevMode/Search.js +1 -1
  10. package/src/commons/Device/RainningSensor/CurrentRainSensor.js +5 -5
  11. package/src/commons/Widgets/IFrameWithConfig/IFrameWithConfig.js +1 -3
  12. package/src/commons/Widgets/IFrameWithConfig/__tests__/IFrameWithConfig.test.js +1 -1
  13. package/src/configs/API.js +16 -1
  14. package/src/configs/AccessibilityLabel.js +9 -1
  15. package/src/configs/Images.js +1 -0
  16. package/src/context/actionType.ts +5 -0
  17. package/src/context/reducer.ts +30 -1
  18. package/src/navigations/AddMemberStack.js +3 -3
  19. package/src/navigations/UnitStack.js +8 -0
  20. package/src/screens/AddCommon/SelectUnit.js +3 -2
  21. package/src/screens/AddLocationMaps/__test__/index.test.js +13 -13
  22. package/src/screens/Automate/AddNewAction/SetupConfigCondition.js +73 -30
  23. package/src/screens/Automate/AddNewAction/__test__/ChooseConfig.test.js +9 -11
  24. package/src/screens/Automate/AddNewAction/__test__/SetupConfigCondition.test.js +115 -10
  25. package/src/screens/Automate/AddNewAutoSmart/AddTypeSmart.js +7 -3
  26. package/src/screens/Automate/AddNewAutoSmart/__test__/AddAutomationTypeSmart.test.js +31 -0
  27. package/src/screens/Automate/ScriptDetail/Components/DeleteCondition.js +51 -0
  28. package/src/screens/Automate/ScriptDetail/Components/ModalAddCondition.js +196 -0
  29. package/src/screens/Automate/ScriptDetail/Styles/indexStyles.js +18 -0
  30. package/src/screens/Automate/ScriptDetail/__test__/index.test.js +441 -47
  31. package/src/screens/Automate/ScriptDetail/index.js +359 -72
  32. package/src/screens/Automate/ScriptDetail/utils.js +7 -31
  33. package/src/screens/Automate/SetSchedule/AddEditConditionSchedule.js +173 -0
  34. package/src/screens/Automate/SetSchedule/__test__/AddEditConditionSchedule.test.js +211 -0
  35. package/src/screens/ConfirmUnitDeletion/__test__/ConfirmUnitDeletion.test.js +69 -13
  36. package/src/screens/ConfirmUnitDeletion/index.js +14 -14
  37. package/src/screens/Sharing/Components/ConfigItem.js +34 -0
  38. package/src/screens/Sharing/Components/DeviceItem.js +77 -0
  39. package/src/screens/Sharing/Components/ItemChangeRole.js +3 -4
  40. package/src/screens/Sharing/Components/ShareDeviceSelector.js +255 -0
  41. package/src/screens/Sharing/Components/Styles/CheckBoxCustomStyles.js +1 -1
  42. package/src/screens/Sharing/Components/Styles/DeviceItemStyles.js +11 -27
  43. package/src/screens/Sharing/{Styles/SelectPermissionStyles.js → Components/Styles/ShareDeviceSelectorStyles.js} +3 -11
  44. package/src/screens/Sharing/Components/SubUnitItem.js +28 -0
  45. package/src/screens/Sharing/Components/SubUnitTreeView.js +68 -0
  46. package/src/screens/Sharing/Components/TitleCheckBox.js +23 -41
  47. package/src/screens/Sharing/Components/__test__/ItemChangeRole.test.js +7 -7
  48. package/src/screens/Sharing/Components/__test__/ShareDeviceSelector.test.js +298 -0
  49. package/src/screens/Sharing/Components/index.js +14 -1
  50. package/src/screens/Sharing/InfoMemberUnit.js +20 -20
  51. package/src/screens/Sharing/SelectShareDevice.js +11 -255
  52. package/src/screens/Sharing/SelectUser.js +12 -12
  53. package/src/screens/Sharing/UpdateShareDevice.js +45 -301
  54. package/src/screens/Sharing/__test__/InfoMemberUnit.test.js +58 -11
  55. package/src/screens/Sharing/__test__/SelectShareDevice.test.js +51 -160
  56. package/src/screens/Sharing/__test__/SelectUser.test.js +72 -10
  57. package/src/screens/Sharing/__test__/UpdateShareDevice.test.js +49 -209
  58. package/src/utils/I18n/translations/en.js +22 -1
  59. package/src/utils/I18n/translations/vi.js +23 -3
  60. package/src/utils/Route/index.js +1 -0
  61. package/src/commons/Sharing/StationDevicePermissions.js +0 -204
  62. package/src/screens/Sharing/Components/CheckBoxConfig.js +0 -44
  63. package/src/screens/Sharing/Components/CheckBoxSubUnit.js +0 -35
  64. package/src/screens/Sharing/Components/EndDevice.js +0 -93
  65. package/src/screens/Sharing/Components/Styles/CheckBoxConfigStyles.js +0 -18
  66. package/src/screens/Sharing/Components/Styles/TitleCheckBoxStyles.js +0 -21
  67. package/src/screens/Sharing/Components/__test__/TitleCheckBox.test.js +0 -31
@@ -0,0 +1,39 @@
1
+ <svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <g clip-path="url(#clip0_3584_6742)">
3
+ <path d="M16.332 21.377L18.5464 25.1419L20.0979 23.5904L16.332 21.377Z" fill="url(#paint0_linear_3584_6742)"/>
4
+ <path d="M19.5576 26.1531L23.322 28.3659L21.1088 24.6016L19.5576 26.1531Z" fill="url(#paint1_linear_3584_6742)"/>
5
+ <path d="M19.2852 7.71777V8.49292H20.7137V7.71777C20.241 7.79895 19.7579 7.79895 19.2852 7.71777Z" fill="url(#paint2_linear_3584_6742)"/>
6
+ <path d="M20 9.92188C11.7157 9.92188 5 16.6376 5 24.9219C5 33.2062 11.7157 39.9219 20 39.9219C28.2843 39.9219 35 33.2062 35 24.9219C34.9906 16.6415 28.2803 9.93134 20 9.92188ZM20 38.4934C12.5046 38.4934 6.42853 32.4173 6.42853 24.9219C6.42853 17.4265 12.5046 11.3504 20 11.3504C27.4951 11.3504 33.5715 17.4265 33.5715 24.9219C33.5633 32.4137 27.4918 38.4851 20 38.4934Z" fill="url(#paint3_linear_3584_6742)"/>
7
+ <path d="M19.9996 6.35041C21.7748 6.35041 23.2137 4.9115 23.2137 3.13629C23.2137 1.36109 21.7748 -0.078125 19.9996 -0.078125C18.2244 -0.078125 16.7852 1.36109 16.7852 3.13629C16.7873 4.91059 18.2253 6.34858 19.9996 6.35041ZM19.9996 2.42188C20.3942 2.42188 20.7137 2.7417 20.7137 3.13629C20.7137 3.53058 20.3939 3.85041 19.9996 3.85041C19.605 3.85041 19.2852 3.53058 19.2852 3.13629C19.2852 2.7417 19.605 2.42188 19.9996 2.42188Z" fill="url(#paint4_linear_3584_6742)"/>
8
+ <path d="M20.0004 12.7793C13.2941 12.7793 7.85742 18.216 7.85742 24.9223C7.85742 31.6285 13.2941 37.0652 20.0004 37.0652C26.7066 37.0652 32.1433 31.6285 32.1433 24.9223C32.1357 18.2191 26.7036 12.7869 20.0004 12.7793ZM19.286 14.9222C19.286 14.5277 19.6058 14.2078 20.0004 14.2078C20.395 14.2078 20.7145 14.5277 20.7145 14.9222V16.3508C20.7145 16.7454 20.3947 17.0652 20.0004 17.0652C19.6058 17.0652 19.286 16.7454 19.286 16.3508V14.9222ZM11.4289 25.6367H10.0004C9.60578 25.6367 9.28595 25.3168 9.28595 24.9223C9.28595 24.5277 9.60578 24.2078 10.0004 24.2078H11.4289C11.8235 24.2078 12.1433 24.5277 12.1433 24.9223C12.1433 25.3168 11.8235 25.6367 11.4289 25.6367ZM20.7145 34.9223C20.7145 35.3169 20.3947 35.6364 20.0004 35.6364C19.6058 35.6364 19.286 35.3169 19.286 34.9223V33.4937C19.286 33.0991 19.6058 32.7793 20.0004 32.7793C20.395 32.7793 20.7145 33.0991 20.7145 33.4937V34.9223ZM25.8381 30.8829C25.608 31.1131 25.2515 31.1585 24.9711 30.9937L18.0375 26.9172C18.0311 26.9135 18.0283 26.9065 18.0216 26.9022C17.9819 26.872 17.9459 26.8375 17.9139 26.7994C17.8696 26.7634 17.83 26.7216 17.7961 26.6758C17.7924 26.67 17.786 26.6679 17.7833 26.6624L13.7052 19.7288C13.5044 19.3891 13.6164 18.9512 13.9561 18.7501C14.1804 18.617 14.4593 18.617 14.6839 18.7501L21.6181 22.8266C21.6245 22.8309 21.6276 22.8379 21.634 22.8416C21.673 22.8721 21.7091 22.9066 21.7417 22.9444C21.7857 22.9807 21.825 23.0222 21.8589 23.068C21.8626 23.0735 21.869 23.0765 21.8723 23.0823L25.9489 30.0156C26.114 30.2964 26.0682 30.6528 25.8381 30.8829ZM30.0004 25.6367H28.5719C28.1773 25.6367 27.8574 25.3168 27.8574 24.9223C27.8574 24.5277 28.1773 24.2078 28.5719 24.2078H30.0004C30.395 24.2078 30.7148 24.5277 30.7148 24.9223C30.7145 25.3168 30.3947 25.6367 30.0004 25.6367Z" fill="url(#paint5_linear_3584_6742)"/>
9
+ </g>
10
+ <defs>
11
+ <linearGradient id="paint0_linear_3584_6742" x1="16.332" y1="21.377" x2="20.0928" y2="25.1428" gradientUnits="userSpaceOnUse">
12
+ <stop stop-color="#2B6B9F"/>
13
+ <stop offset="1" stop-color="#D5FFCB"/>
14
+ </linearGradient>
15
+ <linearGradient id="paint1_linear_3584_6742" x1="19.5576" y1="24.6016" x2="23.3178" y2="28.3659" gradientUnits="userSpaceOnUse">
16
+ <stop stop-color="#2B6B9F"/>
17
+ <stop offset="1" stop-color="#D5FFCB"/>
18
+ </linearGradient>
19
+ <linearGradient id="paint2_linear_3584_6742" x1="19.2852" y1="7.71777" x2="19.9339" y2="8.91471" gradientUnits="userSpaceOnUse">
20
+ <stop stop-color="#2B6B9F"/>
21
+ <stop offset="1" stop-color="#D5FFCB"/>
22
+ </linearGradient>
23
+ <linearGradient id="paint3_linear_3584_6742" x1="5" y1="9.92187" x2="34.9668" y2="39.9219" gradientUnits="userSpaceOnUse">
24
+ <stop stop-color="#2B6B9F"/>
25
+ <stop offset="1" stop-color="#D5FFCB"/>
26
+ </linearGradient>
27
+ <linearGradient id="paint4_linear_3584_6742" x1="16.7852" y1="-0.078125" x2="23.2066" y2="6.3504" gradientUnits="userSpaceOnUse">
28
+ <stop stop-color="#2B6B9F"/>
29
+ <stop offset="1" stop-color="#D5FFCB"/>
30
+ </linearGradient>
31
+ <linearGradient id="paint5_linear_3584_6742" x1="7.85742" y1="12.7793" x2="32.1165" y2="37.0652" gradientUnits="userSpaceOnUse">
32
+ <stop stop-color="#2B6B9F"/>
33
+ <stop offset="1" stop-color="#D5FFCB"/>
34
+ </linearGradient>
35
+ <clipPath id="clip0_3584_6742">
36
+ <rect width="40" height="40" fill="white"/>
37
+ </clipPath>
38
+ </defs>
39
+ </svg>
@@ -0,0 +1,49 @@
1
+ <svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <g clip-path="url(#clip0_3603_7308)">
3
+ <path d="M39.9611 19.4151C39.9611 16.0576 37.5369 13.2553 34.3463 12.6674C34.4471 7.7329 29.6477 3.91545 24.7269 5.38009C23.237 2.22626 20.0431 0 16.2575 0C11.2143 0 7.08953 4.01089 6.90707 9.01047C2.92807 9.87659 0.0392761 13.4122 0.0392761 17.5438C0.0392761 22.3593 3.9566 26.2766 8.77217 26.2766H33.0995C36.8827 26.2766 39.9611 23.1983 39.9611 19.4151Z" fill="url(#paint0_linear_3603_7308)"/>
4
+ <path d="M27.4197 28.2794C26.8035 27.9714 26.054 28.221 25.7459 28.8374L23.2508 33.8276C22.8332 34.6629 23.4489 35.6334 24.3657 35.6334C24.8234 35.6334 25.264 35.3806 25.4825 34.9435L27.9776 29.9533C28.2857 29.337 28.036 28.5876 27.4197 28.2794Z" fill="url(#paint1_linear_3603_7308)"/>
5
+ <path d="M38.6473 28.2794C38.0311 27.9714 37.2816 28.221 36.9736 28.8374L34.4785 33.8276C34.0609 34.6629 34.6765 35.6334 35.5934 35.6334C36.051 35.6334 36.4916 35.3806 36.7102 34.9435L39.2053 29.9533C39.5134 29.337 39.2636 28.5876 38.6473 28.2794Z" fill="url(#paint2_linear_3603_7308)"/>
6
+ <path d="M16.1915 28.2794C15.5753 27.9714 14.8258 28.221 14.5177 28.8374L12.0226 33.8276C11.605 34.6629 12.2206 35.6334 13.1375 35.6334C13.5951 35.6334 14.0358 35.3806 14.2543 34.9435L16.7494 29.9533C17.0575 29.337 16.8077 28.5876 16.1915 28.2794Z" fill="url(#paint3_linear_3603_7308)"/>
7
+ <path d="M4.9638 28.2794C4.34766 27.9714 3.59811 28.221 3.29004 28.8374L0.79493 33.8276C0.37731 34.6629 0.99298 35.6334 1.90986 35.6334C2.36748 35.6334 2.8081 35.3806 3.02665 34.9435L5.52177 29.9533C5.82984 29.337 5.58009 28.5876 4.9638 28.2794Z" fill="url(#paint4_linear_3603_7308)"/>
8
+ <path d="M19.934 32.6459C19.3178 32.3378 18.5683 32.5875 18.2603 33.2038L15.7652 38.1941C15.3475 39.0293 15.9632 39.9998 16.8801 39.9998C17.3377 39.9998 17.7783 39.747 17.9969 39.3099L20.492 34.3197C20.8001 33.7034 20.5503 32.954 19.934 32.6459Z" fill="url(#paint5_linear_3603_7308)"/>
9
+ <path d="M31.1622 32.6459C30.546 32.3378 29.7965 32.5875 29.4885 33.2038L26.9933 38.1941C26.5757 39.0293 27.1914 39.9998 28.1083 39.9998C28.5659 39.9998 29.0065 39.747 29.2251 39.3099L31.7202 34.3197C32.0282 33.7034 31.7785 32.954 31.1622 32.6459Z" fill="url(#paint6_linear_3603_7308)"/>
10
+ <path d="M8.70636 32.6459C8.09014 32.3378 7.34067 32.5875 7.03261 33.2038L4.53749 38.1941C4.11987 39.0293 4.73554 39.9998 5.65242 39.9998C6.11004 39.9998 6.55066 39.747 6.76922 39.3099L9.26433 34.3197C9.5724 33.7034 9.32265 32.954 8.70636 32.6459Z" fill="url(#paint7_linear_3603_7308)"/>
11
+ </g>
12
+ <defs>
13
+ <linearGradient id="paint0_linear_3603_7308" x1="0.0392761" y1="0" x2="24.1368" y2="36.6517" gradientUnits="userSpaceOnUse">
14
+ <stop stop-color="#2B6B9F"/>
15
+ <stop offset="1" stop-color="#D5FFCB"/>
16
+ </linearGradient>
17
+ <linearGradient id="paint1_linear_3603_7308" x1="23.1174" y1="28.1475" x2="30.0236" y2="32.7581" gradientUnits="userSpaceOnUse">
18
+ <stop stop-color="#2B6B9F"/>
19
+ <stop offset="1" stop-color="#D5FFCB"/>
20
+ </linearGradient>
21
+ <linearGradient id="paint2_linear_3603_7308" x1="34.3451" y1="28.1475" x2="41.2513" y2="32.7581" gradientUnits="userSpaceOnUse">
22
+ <stop stop-color="#2B6B9F"/>
23
+ <stop offset="1" stop-color="#D5FFCB"/>
24
+ </linearGradient>
25
+ <linearGradient id="paint3_linear_3603_7308" x1="11.8892" y1="28.1475" x2="18.7954" y2="32.7582" gradientUnits="userSpaceOnUse">
26
+ <stop stop-color="#2B6B9F"/>
27
+ <stop offset="1" stop-color="#D5FFCB"/>
28
+ </linearGradient>
29
+ <linearGradient id="paint4_linear_3603_7308" x1="0.661537" y1="28.1475" x2="7.56774" y2="32.7581" gradientUnits="userSpaceOnUse">
30
+ <stop stop-color="#2B6B9F"/>
31
+ <stop offset="1" stop-color="#D5FFCB"/>
32
+ </linearGradient>
33
+ <linearGradient id="paint5_linear_3603_7308" x1="15.6318" y1="32.5139" x2="22.5379" y2="37.1246" gradientUnits="userSpaceOnUse">
34
+ <stop stop-color="#2B6B9F"/>
35
+ <stop offset="1" stop-color="#D5FFCB"/>
36
+ </linearGradient>
37
+ <linearGradient id="paint6_linear_3603_7308" x1="26.86" y1="32.5139" x2="33.7661" y2="37.1246" gradientUnits="userSpaceOnUse">
38
+ <stop stop-color="#2B6B9F"/>
39
+ <stop offset="1" stop-color="#D5FFCB"/>
40
+ </linearGradient>
41
+ <linearGradient id="paint7_linear_3603_7308" x1="4.4041" y1="32.5139" x2="11.3103" y2="37.1246" gradientUnits="userSpaceOnUse">
42
+ <stop stop-color="#2B6B9F"/>
43
+ <stop offset="1" stop-color="#D5FFCB"/>
44
+ </linearGradient>
45
+ <clipPath id="clip0_3603_7308">
46
+ <rect width="40" height="40" fill="white"/>
47
+ </clipPath>
48
+ </defs>
49
+ </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.7.20",
4
+ "version": "0.7.22",
5
5
  "description": "TODO",
6
6
  "main": "index.js",
7
7
  "files": [
@@ -0,0 +1,51 @@
1
+ import React, { useCallback } from 'react';
2
+ import { View, TouchableOpacity } from 'react-native';
3
+ import Text from '../Text';
4
+ import { Colors } from '../../configs';
5
+ import styles from './ItemConditionScriptDetailStyles';
6
+ import { AccessibilityLabel } from '../../configs/Constants';
7
+ import { useTranslations } from '../../hooks/Common/useTranslations';
8
+
9
+ import Add from '../../../assets/images/Add.svg';
10
+ import { ToastBottomHelper } from '../../utils/Utils';
11
+
12
+ const ButtonAddCondition = ({
13
+ setIsShowAddCondition,
14
+ numberConditionsUsed,
15
+ max_conditions_per_automation,
16
+ }) => {
17
+ const t = useTranslations();
18
+ const onPressAddCondition = useCallback(async () => {
19
+ if (numberConditionsUsed > 0) {
20
+ setIsShowAddCondition(true);
21
+ } else {
22
+ ToastBottomHelper.error(
23
+ t('reach_max_conditions_per_automation', {
24
+ length: max_conditions_per_automation,
25
+ })
26
+ );
27
+ }
28
+ }, [
29
+ max_conditions_per_automation,
30
+ numberConditionsUsed,
31
+ setIsShowAddCondition,
32
+ t,
33
+ ]);
34
+
35
+ return (
36
+ <View style={styles.wrap}>
37
+ <TouchableOpacity
38
+ onPress={onPressAddCondition}
39
+ style={styles.row}
40
+ accessibilityLabel={AccessibilityLabel.BUTTON_ADD_CONDITION}
41
+ >
42
+ <Add />
43
+ <Text color={Colors.Gray8} style={styles.addCondition}>
44
+ {t('add_condition')}
45
+ </Text>
46
+ </TouchableOpacity>
47
+ </View>
48
+ );
49
+ };
50
+
51
+ export default ButtonAddCondition;
@@ -1,10 +1,14 @@
1
- import React, { useMemo } from 'react';
1
+ import React, { useCallback, useMemo, useRef } from 'react';
2
2
  import { View, TouchableOpacity } from 'react-native';
3
3
  import MaterialIcons from 'react-native-vector-icons/MaterialIcons';
4
4
  import Text from '../Text';
5
5
  import { Colors } from '../../configs';
6
6
  import styles from './ItemConditionScriptDetailStyles';
7
- import { AccessibilityLabel, AUTOMATES } from '../../configs/Constants';
7
+ import {
8
+ AccessibilityLabel,
9
+ AUTOMATE_TYPE,
10
+ AUTOMATES,
11
+ } from '../../configs/Constants';
8
12
  import { useTranslations } from '../../hooks/Common/useTranslations';
9
13
  import { generateAutomationConditionText } from '../../screens/Automate/ScriptDetail/utils';
10
14
  import { useGetEvaluateValue } from '../../screens/Device/hooks/useEvaluateValue';
@@ -13,18 +17,21 @@ const ItemConditionScriptDetail = ({
13
17
  automate,
14
18
  enableScript = true,
15
19
  handleShowMenuAction1,
16
- refMenuAction1,
20
+ condition,
17
21
  }) => {
22
+ const refMenuAction1 = useRef();
18
23
  const t = useTranslations();
19
- const { type, config, unit } = automate;
24
+ const { unit } = automate;
25
+ const { type, config } = condition;
20
26
  /* istanbul ignore next */
21
27
  const item = AUTOMATES[type] || {};
22
28
  const { icon: Icon, title } = item;
23
29
  const valueEvaluations = useGetEvaluateValue(config, unit);
24
30
 
25
31
  const textCondition = useMemo(
26
- () => generateAutomationConditionText(automate, valueEvaluations, t),
27
- [automate, valueEvaluations, t]
32
+ () =>
33
+ generateAutomationConditionText(automate, condition, valueEvaluations, t),
34
+ [automate, condition, valueEvaluations, t]
28
35
  );
29
36
 
30
37
  const renderText = useMemo(() => {
@@ -34,6 +41,10 @@ const ItemConditionScriptDetail = ({
34
41
  return t('quick_button_create_at_dashboard');
35
42
  }, [textCondition, t]);
36
43
 
44
+ const onPress = useCallback(() => {
45
+ handleShowMenuAction1(condition, refMenuAction1);
46
+ }, [condition, handleShowMenuAction1]);
47
+
37
48
  return (
38
49
  <View style={styles.wrap}>
39
50
  <View style={styles.col}>
@@ -51,15 +62,17 @@ const ItemConditionScriptDetail = ({
51
62
  </Text>
52
63
  </View>
53
64
  </View>
54
- <View>
55
- <TouchableOpacity
56
- onPress={handleShowMenuAction1}
57
- ref={refMenuAction1}
58
- accessibilityLabel={AccessibilityLabel.ICON_MENU_POPUP}
59
- >
60
- <MaterialIcons name="more-vert" size={27} color={Colors.Black} />
61
- </TouchableOpacity>
62
- </View>
65
+ {type !== AUTOMATE_TYPE.ONE_TAP && (
66
+ <View>
67
+ <TouchableOpacity
68
+ onPress={onPress}
69
+ ref={refMenuAction1}
70
+ accessibilityLabel={AccessibilityLabel.ICON_MENU_POPUP}
71
+ >
72
+ <MaterialIcons name="more-vert" size={27} color={Colors.Black} />
73
+ </TouchableOpacity>
74
+ </View>
75
+ )}
63
76
  </View>
64
77
  );
65
78
  };
@@ -25,6 +25,15 @@ export default StyleSheet.create({
25
25
  alignItems: 'center',
26
26
  flexDirection: 'row',
27
27
  },
28
+ row: {
29
+ width: '100%',
30
+ flexDirection: 'row',
31
+ justifyContent: 'center',
32
+ alignItems: 'center',
33
+ },
34
+ addCondition: {
35
+ marginLeft: 20,
36
+ },
28
37
  wrapIcon: {
29
38
  justifyContent: 'center',
30
39
  flexDirection: 'row',
@@ -1,40 +1,39 @@
1
+ import { API, Colors, Images, SCConfig } from '../../../configs';
2
+ import { AccessibilityLabel, DEVICE_TYPE } from '../../../configs/Constants';
3
+ import { Dimensions, TouchableOpacity, View } from 'react-native';
1
4
  import React, {
2
5
  memo,
3
6
  useCallback,
4
- useEffect,
5
- useState,
6
7
  useContext,
8
+ useEffect,
7
9
  useMemo,
8
10
  useRef,
11
+ useState,
9
12
  } from 'react';
10
- import { View, TouchableOpacity, Dimensions } from 'react-native';
13
+ import { SCContext, useSCContextSelector } from '../../../context';
14
+ import { axiosGet, fetchWithCache } from '../../../utils/Apis/axios';
15
+ import { useBluetoothConnection, useWatchConfigs } from '../../../hooks/IoT';
11
16
  import {
12
- useNavigation,
13
- useIsFocused,
14
17
  useFocusEffect,
18
+ useIsFocused,
19
+ useNavigation,
15
20
  } from '@react-navigation/native';
16
- import NetInfo from '@react-native-community/netinfo';
17
- import { BleManager } from 'react-native-ble-plx';
18
- import { API, Colors, Images, SCConfig } from '../../../configs';
19
- import Text from '../../Text';
20
- import { axiosGet, fetchWithCache } from '../../../utils/Apis/axios';
21
21
 
22
- import styles from './styles';
23
- import { Section } from '../../Section';
24
- import { useTranslations } from '../../../hooks/Common/useTranslations';
25
- import { useUnitConnectRemoteDevices } from '../../../screens/Unit/hook/useUnitConnectRemoteDevices';
26
- import { useWatchConfigs, useBluetoothConnection } from '../../../hooks/IoT';
27
- import { SCContext, useSCContextSelector } from '../../../context';
28
22
  import { Action } from '../../../context/actionType';
29
-
23
+ import { BleManager } from 'react-native-ble-plx';
30
24
  import Carousel from 'react-native-new-snap-carousel';
31
- import { AccessibilityLabel, DEVICE_TYPE } from '../../../configs/Constants';
32
- import Routes from '../../../utils/Route';
25
+ import FImage from '../../FImage';
33
26
  import MyUnitDevice from '../../../screens/Unit/components/MyUnitDevice';
27
+ import NetInfo from '@react-native-community/netinfo';
28
+ import Routes from '../../../utils/Route';
34
29
  import { STORAGE_KEY } from '../../../utils/Storage';
30
+ import { Section } from '../../Section';
31
+ import Text from '../../Text';
35
32
  import { preloadImagesFromUnits } from '../../../utils/Functions/preloadImages';
36
- import FImage from '../../FImage';
33
+ import styles from './styles';
37
34
  import { usePrevious } from '../../../hooks';
35
+ import { useTranslations } from '../../../hooks/Common/useTranslations';
36
+ import { useUnitConnectRemoteDevices } from '../../../screens/Unit/hook/useUnitConnectRemoteDevices';
38
37
 
39
38
  let screenWidth = Dimensions.get('window').width;
40
39
 
@@ -10,7 +10,7 @@ const Search = ({ onSearch }) => {
10
10
  <Image source={Images.search} style={styles.icon} />
11
11
  <TextInput
12
12
  style={styles.textInput}
13
- placeholder={t('what_are_you_looking_for')}
13
+ placeholder={t('search')}
14
14
  onChangeText={onSearch}
15
15
  />
16
16
  </View>
@@ -1,13 +1,13 @@
1
1
  import React, { useMemo } from 'react';
2
- import { View, StyleSheet } from 'react-native';
3
- import LinearGradient from 'react-native-linear-gradient';
2
+ import { StyleSheet, View } from 'react-native';
4
3
 
5
- import { Colors } from '../../../configs';
6
4
  import { CircleView } from '../../../commons';
7
- import Text from '../../../commons/Text';
5
+ import { Colors } from '../../../configs';
6
+ import FImage from '../../FImage';
8
7
  import IconComponent from '../../IconComponent';
8
+ import LinearGradient from 'react-native-linear-gradient';
9
+ import Text from '../../../commons/Text';
9
10
  import images from '../../../configs/Images';
10
- import FImage from '../../FImage';
11
11
  import { useTranslations } from '../../../hooks/Common/useTranslations';
12
12
 
13
13
  const CurrentRainSensor = ({
@@ -6,7 +6,6 @@ import { styles } from './IFrameWithConfigStyles';
6
6
  import IconComponent from '../../IconComponent';
7
7
  import { useConfigGlobalState } from '../../../iot/states';
8
8
  import { useFetchConfigHistory } from '../../UnitSummary/ConfigHistoryChart';
9
- import API from '../../../configs/API';
10
9
  import WebView from 'react-native-webview';
11
10
  import { TouchableOpacity, View } from 'react-native';
12
11
 
@@ -25,8 +24,7 @@ const IFrameWithConfig = memo(
25
24
  const [chartData, setChartData] = useState(configuration?.history_configs);
26
25
  const fetchDataDisplayHistory = useFetchConfigHistory(
27
26
  configuration?.history_configs,
28
- setChartData,
29
- API.CONFIG.DISPLAY_HISTORY_V4()
27
+ setChartData
30
28
  );
31
29
 
32
30
  const postMessage = useCallback((message) => {
@@ -252,7 +252,7 @@ describe('Test IFrame With Config', () => {
252
252
  });
253
253
 
254
254
  const mockAxios = new MockAdapter(api.axiosInstance);
255
- mockAxios.onGet(API.CONFIG.DISPLAY_HISTORY_V4()).reply(200, {
255
+ mockAxios.onGet(API.CONFIG.DISPLAY_HISTORY_V3()).reply(200, {
256
256
  configs: [
257
257
  {
258
258
  id: 1,
@@ -1,6 +1,9 @@
1
1
  import { SCConfig } from './SCConfig';
2
2
 
3
3
  const API = {
4
+ AUTH: {
5
+ PERMISSIONS: () => '/accounts/permissions/',
6
+ },
4
7
  UNIT: {
5
8
  MY_UNITS: () => '/property_manager/units/mine/',
6
9
  SHARED_UNITS: () => '/property_manager/shared_units/',
@@ -119,7 +122,8 @@ const API = {
119
122
  ADD_SCRIPT_EMAIL: (id) =>
120
123
  `/property_manager/automate/${id}/add_script_email/`,
121
124
  ADD_SCRIPT_SMS: (id) => `/property_manager/automate/${id}/add_script_sms/`,
122
- FETCH_AUTOMATE: (automateId) => `/property_manager/automate/${automateId}/`,
125
+ FETCH_AUTOMATE: (automateId) =>
126
+ `/property_manager/automate_v2/${automateId}/`,
123
127
  CREATE_AUTOMATE: () => '/property_manager/automate/',
124
128
  UPDATE_AUTOMATE: (automateId) =>
125
129
  `/property_manager/automate/${automateId}/`,
@@ -135,6 +139,13 @@ const API = {
135
139
  STARRED_SCRIPTS: () => '/property_manager/automate/starred_scripts/',
136
140
  ENABLE_LOCAL_CONTROL: (id) =>
137
141
  `/property_manager/automate/${id}/enable_local_control/`,
142
+ NEED_ALL_CONDITIONS: (id) =>
143
+ `/property_manager/automate/${id}/need_all_conditions/`,
144
+ ADD_CONDITION: (id) => `/property_manager/automate/${id}/condition/`,
145
+ UPDATE_CONDITION: (automateId, conditionId) =>
146
+ `/property_manager/automate/${automateId}/update_condition/${conditionId}/`,
147
+ DELETE_CONDITION: (automateId, conditionId) =>
148
+ `/property_manager/automate/${automateId}/delete_condition/${conditionId}/`,
138
149
  },
139
150
  HOME_ASSISTANT: {
140
151
  CHECK_SEND_EMAIL: () =>
@@ -147,6 +158,8 @@ const API = {
147
158
  UNITS: () => '/property_manager/sharing/units/',
148
159
  UNIT_PERMISSIONS: (id) =>
149
160
  `/property_manager/sharing/units/${id}/permissions/`,
161
+ UNIT_PERMISSIONS_v2: (id) =>
162
+ `/property_manager/sharing/units/${id}/permissions_v2/`,
150
163
  UNITS_MEMBERS: (id) => `/property_manager/sharing/units/${id}/members/`,
151
164
  UNITS_MEMBER_DETAIL: (id, shareId) =>
152
165
  `/property_manager/sharing/units/${id}/members/${shareId}/`,
@@ -154,6 +167,8 @@ const API = {
154
167
  `/property_manager/sharing/units/${unit_id}/member/${member_id}/information/`,
155
168
  UNIT_MEMBER_SHARE_DEVICE: (unit_id, member_id) =>
156
169
  `/property_manager/sharing/units/${unit_id}/member/${member_id}/shared_devices/`,
170
+ UNIT_MEMBER_SHARE_DEVICE_V2: (unit_id, member_id) =>
171
+ `/property_manager/sharing/units/${unit_id}/member/${member_id}/shared_devices_v2/`,
157
172
  SHARE: () => '/property_manager/sharing/share/',
158
173
  SHARE_V2: () => '/property_manager/sharing/share_v2/',
159
174
  SEARCH_USER_BY_PHONE: (phone) => `/accounts/search/phone/${phone}/`,
@@ -242,6 +242,8 @@ export default {
242
242
  BUTTON_ACTIVATE_ONE_TAP: 'BUTTON_ACTIVATE_ONE_TAP',
243
243
  BUTTON_EDIT_SCRIPT_ACTION: 'BUTTON_EDIT_SCRIPT_ACTION',
244
244
  BUTTON_ADD_SCRIPT_ACTION: 'BUTTON_ADD_SCRIPT_ACTION',
245
+ BUTTON_ADD_CONDITION: 'BUTTON_ADD_CONDITION',
246
+ BUTTON_CONTINUE: 'BUTTON_CONTINUE',
245
247
  ICON_CLOSE: 'ICON_CLOSE',
246
248
  ICON_MORE: 'ICON_MORE',
247
249
  ICON_MENU_POPUP: 'ICON_MENU_POPUP',
@@ -254,6 +256,10 @@ export default {
254
256
  AUTOMATE_SHOW_LOCAL_CONTROL: 'AUTOMATE_SHOW_LOCAL_CONTROL',
255
257
  AUTOMATE_DISABLE_LOCAL_CONTROL: 'AUTOMATE_DISABLE_LOCAL_CONTROL',
256
258
  AUTOMATE_ENABLE_LOCAL_CONTROL: 'AUTOMATE_ENABLE_LOCAL_CONTROL',
259
+ AUTOMATE_CONDITION: 'AUTOMATE_CONDITION',
260
+ AUTOMATE_SELECT_CONDITION: 'AUTOMATE_SELECT_CONDITION',
261
+ AUTOMATE_DELETE_CONDITION: 'AUTOMATE_DELETE_CONDITION',
262
+ AUTOMATE_NUMBER_CONDITION: 'AUTOMATE_NUMBER_CONDITION',
257
263
 
258
264
  // Parking input maunaly spot
259
265
  PARKING_SPOT_INFO_BUTTON: 'PARKING_SPOT_INFO_BUTTON',
@@ -446,7 +452,9 @@ export default {
446
452
  CHECK_BOX_CUSTOM: 'CHECK_BOX_CUSTOM',
447
453
  CHECK_BOX_CONFIG: 'CHECK_BOX_CONFIG',
448
454
  EXPAND_END_DEVICE: 'EXPAND_END_DEVICE',
449
- CLICK_NAME_END_DEVICE: 'CLICK_NAME_END_DEVICE',
455
+ NAME_END_DEVICE: 'CLICK_NAME_END_DEVICE',
456
+ ICON_END_DEVICE: 'ICON_END_DEVICE',
457
+ ICON_CHECK: 'ICON_CHECK',
450
458
  },
451
459
 
452
460
  // Select subunit
@@ -27,4 +27,5 @@ export default {
27
27
  inforCode: require('../Images/DevMode/inforCode.png'),
28
28
  activeCurrentSensor: require('../Images/Common/Sunny.png'),
29
29
  unitDefaultBackground: require('../Images/Common/unit_default_background.png'),
30
+ defaultEndDeviceIcon: require('../Images/Common/default_end_device.png'),
30
31
  };
@@ -1,6 +1,7 @@
1
1
  export const Action = {
2
2
  UPDATE_AUTH: 'UPDATE_AUTH',
3
3
  UPDATE_LANGUAGE: 'UPDATE_LANGUAGE',
4
+ UPDATE_PERMISSIONS: 'UPDATE_PERMISSIONS',
4
5
  STORE_STATUS_BAR: 'STORE_STATUS_BAR',
5
6
  LIST_DEVICE_TYPES: 'LIST_DEVICE_TYPES',
6
7
  LIST_ACTION: 'LIST_ACTION',
@@ -17,6 +18,8 @@ export const Action = {
17
18
  SET_STARRED_SCRIPTS: 'SET_STARRED_SCRIPTS',
18
19
  STAR_SCRIPTS: 'STAR_SCRIPTS',
19
20
  UNSTAR_SCRIPTS: 'UNSTAR_SCRIPTS',
21
+ IS_CREATE_CONDITION: 'IS_CREATE_CONDITION',
22
+ IS_UPDATE_CONDITION: 'IS_UPDATE_CONDITION',
20
23
  SET_BLUETOOTH_CONNECTED_DEVICE: 'SET_BLUETOOTH_CONNECTED_DEVICE',
21
24
  SET_BLUETOOTH_PERM_REQUESTED: 'SET_BLUETOOTH_PERM_REQUESTED',
22
25
  SET_BLUETOOTH_PERM_GRANTED: 'SET_BLUETOOTH_PERM_GRANTED',
@@ -80,6 +83,8 @@ export type UnitType = {
80
83
 
81
84
  export type AutomateType = {
82
85
  starredScriptIds: [];
86
+ isCreateCondition: false;
87
+ isUpdateCondition: false;
83
88
  };
84
89
 
85
90
  export type ActionType = keyof typeof Action;
@@ -114,6 +114,20 @@ export const reducer = (currentState: ContextData, action: Action) => {
114
114
  return { ...currentState, statusBar: payload };
115
115
  case Action.UPDATE_LANGUAGE:
116
116
  return { ...currentState, language: payload };
117
+ case Action.UPDATE_PERMISSIONS:
118
+ return {
119
+ ...currentState,
120
+ auth: {
121
+ ...currentState.auth,
122
+ account: {
123
+ ...currentState.auth.account,
124
+ user: {
125
+ ...currentState.auth.account.user,
126
+ permissions: payload,
127
+ },
128
+ },
129
+ },
130
+ };
117
131
  case Action.PERCENT_LOADED:
118
132
  // eslint-disable-next-line no-case-declarations
119
133
  const percent =
@@ -307,7 +321,22 @@ export const reducer = (currentState: ContextData, action: Action) => {
307
321
  ),
308
322
  },
309
323
  };
310
-
324
+ case Action.IS_CREATE_CONDITION:
325
+ return {
326
+ ...currentState,
327
+ automate: {
328
+ ...currentState.automate,
329
+ isCreateCondition: payload,
330
+ },
331
+ };
332
+ case Action.IS_UPDATE_CONDITION:
333
+ return {
334
+ ...currentState,
335
+ automate: {
336
+ ...currentState.automate,
337
+ isUpdateCondition: payload,
338
+ },
339
+ };
311
340
  case Action.SET_BLUETOOTH_CONNECTED_DEVICE:
312
341
  return {
313
342
  ...currentState,
@@ -1,12 +1,12 @@
1
- import { createNativeStackNavigator } from '@react-navigation/native-stack';
2
1
  import React, { memo } from 'react';
3
2
 
4
3
  import AddCommonSelectUnit from '../screens/AddCommon/SelectUnit';
5
4
  import Route from '../utils/Route';
6
- import { screenOptions } from './utils';
5
+ import SelectShareDevice from '../screens/Sharing/SelectShareDevice';
7
6
  import SharingInviteMembers from '../screens/Sharing/SelectUser';
8
7
  import UpdateShareDevice from '../screens/Sharing/UpdateShareDevice';
9
- import SelectShareDevice from '../screens/Sharing/SelectShareDevice';
8
+ import { createNativeStackNavigator } from '@react-navigation/native-stack';
9
+ import { screenOptions } from './utils';
10
10
 
11
11
  const Stack = createNativeStackNavigator();
12
12
 
@@ -75,6 +75,7 @@ import UpdateReceiverEmailScript from '../screens/Automate/EditActionsList/Updat
75
75
  import SetupScriptSms from '../screens/Automate/AddNewAction/SetupScriptSms';
76
76
  import SetupScriptReceiverSms from '../screens/Automate/AddNewAction/SetupScriptReceiverSms';
77
77
  import UpdateReceiverSmsScript from '../screens/Automate/EditActionsList/UpdateReceiverSmsScript';
78
+ import AddEditConditionSchedule from '../screens/Automate/SetSchedule/AddEditConditionSchedule';
78
79
 
79
80
  const Stack = createNativeStackNavigator();
80
81
 
@@ -547,6 +548,13 @@ export const UnitStack = memo((props) => {
547
548
  headerShown: false,
548
549
  }}
549
550
  />
551
+ <Stack.Screen
552
+ name={Route.AddEditConditionSchedule}
553
+ component={AddEditConditionSchedule}
554
+ options={{
555
+ headerShown: false,
556
+ }}
557
+ />
550
558
  <Stack.Screen
551
559
  name={Route.EmergencySetting}
552
560
  component={EmergencySetting}
@@ -1,8 +1,9 @@
1
- import { useNavigation } from '@react-navigation/native';
2
- import { useTranslations } from '../../hooks/Common/useTranslations';
3
1
  import React, { useCallback, useEffect, useState } from 'react';
2
+
4
3
  import Routes from '../../utils/Route';
5
4
  import SelectUnit from '../../commons/SelectUnit';
5
+ import { useNavigation } from '@react-navigation/native';
6
+ import { useTranslations } from '../../hooks/Common/useTranslations';
6
7
 
7
8
  const AddCommonSelectUnit = ({ route }) => {
8
9
  const t = useTranslations();
@@ -1,22 +1,22 @@
1
- import MockAdapter from 'axios-mock-adapter';
2
- import React from 'react';
3
- import { Alert } from 'react-native';
4
- import RNAndroidLocationEnabler from 'react-native-android-location-enabler';
5
- import RNP from 'react-native-permissions';
1
+ import {
2
+ GEOLOCATION_ERROR,
3
+ OpenSetting,
4
+ } from '../../../utils/Permission/common';
6
5
  import { act, create } from 'react-test-renderer';
7
6
 
8
- import { useNavigation } from '@react-navigation/native';
9
- import { RESULTS } from 'react-native-permissions';
10
7
  import { API } from '../../../configs';
11
8
  import { AccessibilityLabel } from '../../../configs/Constants';
9
+ import AddLocationMaps from '../index';
10
+ import { Alert } from 'react-native';
11
+ import MockAdapter from 'axios-mock-adapter';
12
+ import { RESULTS } from 'react-native-permissions';
13
+ import RNAndroidLocationEnabler from 'react-native-android-location-enabler';
14
+ import RNP from 'react-native-permissions';
15
+ import React from 'react';
12
16
  import { SCProvider } from '../../../context';
13
- import { mockSCStore } from '../../../context/mockStore';
14
17
  import api from '../../../utils/Apis/axios';
15
- import {
16
- GEOLOCATION_ERROR,
17
- OpenSetting,
18
- } from '../../../utils/Permission/common';
19
- import AddLocationMaps from '../index';
18
+ import { mockSCStore } from '../../../context/mockStore';
19
+ import { useNavigation } from '@react-navigation/native';
20
20
 
21
21
  const wrapComponent = (route) => (
22
22
  <SCProvider initState={mockSCStore({})}>