@eohjsc/react-native-smart-city 0.2.21 → 0.2.27

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 (404) hide show
  1. package/README.md +1 -1
  2. package/assets/images/Add.svg +5 -0
  3. package/assets/images/AddLocationMaps/Point.svg +3 -0
  4. package/assets/images/CheckCircle.svg +4 -0
  5. package/assets/images/Close.svg +3 -0
  6. package/assets/images/HowToStart.svg +14 -0
  7. package/assets/images/Illustrations.svg +83 -0
  8. package/assets/images/OneTap.svg +14 -0
  9. package/assets/images/OneTap@1x.svg +14 -0
  10. package/assets/images/Rearrange.svg +3 -0
  11. package/assets/images/Schedule.svg +39 -0
  12. package/assets/images/ValueChange.svg +49 -0
  13. package/index.js +2 -0
  14. package/package.json +14 -2
  15. package/src/Images/Common/ActiveButton.png +0 -0
  16. package/src/Images/Common/ActiveButton@2x.png +0 -0
  17. package/src/Images/Common/ActiveButton@3x.png +0 -0
  18. package/src/Images/Common/arrow-back.png +0 -0
  19. package/src/Images/Common/checked@2x.png +0 -0
  20. package/src/Images/Common/checked@3x.png +0 -0
  21. package/src/Images/Common/file.png +0 -0
  22. package/src/Images/Common/fullscreen.png +0 -0
  23. package/src/Images/Common/refresh.png +0 -0
  24. package/src/commons/ActionGroup/NumberUpDownActionTemplate.js +1 -1
  25. package/src/commons/ActionGroup/OnOffTemplate/index.js +9 -4
  26. package/src/commons/ActionGroup/OptionsDropdownActionTemplate.js +4 -3
  27. package/src/commons/ActionGroup/StatesGridActionTemplate.js +2 -2
  28. package/src/commons/ActionGroup/ThreeButtonTemplate.js +13 -6
  29. package/src/commons/ActionGroup/ThreeButtonTemplateStyle.js +1 -1
  30. package/src/commons/ActionGroup/TimerActionTemplate.js +158 -33
  31. package/src/commons/ActionGroup/__test__/NumberUpDownTemplate.test.js +294 -0
  32. package/src/commons/ActionGroup/__test__/NumberUpDownTemplateWithNullConfigValue.test.js +60 -0
  33. package/src/commons/ActionGroup/__test__/OnOffButtonTemplate.test.js +8 -13
  34. package/src/commons/ActionGroup/__test__/OnOffTemplate.test.js +3 -3
  35. package/src/commons/ActionGroup/__test__/OptionsDropdownTemplate.test.js +26 -45
  36. package/src/commons/ActionGroup/__test__/ThreeButtonTemplate.test.js +11 -5
  37. package/src/commons/ActionGroup/__test__/TimerActionTemplate.test.js +14 -8
  38. package/src/commons/ActionGroup/__test__/TimerActionTemplateWithutConfigValue.test.js +17 -23
  39. package/src/commons/ActionGroup/__test__/__snapshots__/ThreeButtonTemplate.test.js.snap +241 -223
  40. package/src/commons/ActionGroup/__test__/index.test.js +39 -107
  41. package/src/commons/ActionGroup/hooks/useDropdownAction.js +2 -1
  42. package/src/commons/ActionTemplate/ActionTemplateStyles.js +14 -0
  43. package/src/commons/ActionTemplate/OnOffButtonAction.js +40 -0
  44. package/src/commons/ActionTemplate/OnOffButtonActionStyles.js +11 -0
  45. package/src/commons/ActionTemplate/OneButtonAction.js +26 -0
  46. package/src/commons/ActionTemplate/OneButtonActionStyles.js +11 -0
  47. package/src/commons/ActionTemplate/ThreeButtonAction.js +55 -0
  48. package/src/commons/ActionTemplate/ThreeButtonActionStyles.js +11 -0
  49. package/src/commons/ActionTemplate/__test__/OnOffButtonAction.test.js +34 -0
  50. package/src/commons/ActionTemplate/__test__/OneButtonAction.test.js +33 -0
  51. package/src/commons/ActionTemplate/__test__/ThreeButtonAction.test.js +35 -0
  52. package/src/commons/ActionTemplate/__test__/index.test.js +71 -0
  53. package/src/commons/ActionTemplate/index.js +69 -0
  54. package/src/commons/AlertAction/__test__/AlertAction.test.js +6 -6
  55. package/src/commons/AlertAction/index.js +2 -0
  56. package/src/commons/Automate/ItemAddNewScriptActionStyles.js +38 -0
  57. package/src/commons/Automate/ItemAutomate.js +39 -0
  58. package/src/commons/Automate/ItemAutomateStyles.js +33 -0
  59. package/src/commons/Automate/ItemScriptAction.js +45 -0
  60. package/src/commons/Automate/ItemScriptActionStyles.js +42 -0
  61. package/src/commons/Automate/__test__/ItemAutomate.test.js +16 -0
  62. package/src/commons/Automate/__test__/ItemScriptAction.test.js +16 -0
  63. package/src/commons/BackDefault/__test__/BackDefault.test.js +21 -0
  64. package/src/commons/BottomScrollPicker/index.js +62 -0
  65. package/src/commons/BottomScrollPicker/styles.js +13 -0
  66. package/src/commons/BottomSheet/index.js +41 -0
  67. package/src/commons/BottomSheet/styles.js +37 -0
  68. package/src/commons/Button/index.js +6 -1
  69. package/src/commons/ButtonPopup/__test__/__snapshots__/ButtonPopup.test.js.snap +2 -0
  70. package/src/commons/ButtonPopup/index.js +2 -0
  71. package/src/commons/Calendar/index.js +72 -0
  72. package/src/commons/Calendar/styles.js +11 -0
  73. package/src/commons/CameraDevice/index.js +2 -1
  74. package/src/commons/ChartLoading/__test__/ChartLoading.test.js +9 -7
  75. package/src/commons/ChartLoading/index.js +2 -1
  76. package/src/commons/DateTimeRangeChange/index.js +2 -1
  77. package/src/commons/Device/ConnectedViewHeader.js +3 -1
  78. package/src/commons/Device/DeviceAlertStatus.js +5 -2
  79. package/src/commons/Device/DisconnectedView.js +34 -26
  80. package/src/commons/Device/Emergency/EmergencyButton.js +2 -1
  81. package/src/commons/Device/Emergency/EmergencyDetail.js +2 -1
  82. package/src/commons/Device/Emergency/__test__/EmergencyButton.test.js +14 -6
  83. package/src/commons/Device/Emergency/__test__/EmergencyDetail.test.js +10 -2
  84. package/src/commons/Device/FlatListItems.js +3 -2
  85. package/src/commons/Device/FooterInfo.js +2 -1
  86. package/src/commons/Device/HistoryChart.js +2 -1
  87. package/src/commons/Device/ItemAddNew/index.js +8 -3
  88. package/src/commons/Device/SensorConnectedStatus.js +2 -1
  89. package/src/commons/Device/WindDirection/Compass/Compass.test.js +19 -11
  90. package/src/commons/Device/WindDirection/Compass/index.js +1 -1
  91. package/src/commons/Device/WindSpeed/LinearChart/__test__/LinearChart.test.js +9 -3
  92. package/src/commons/Device/WindSpeed/LinearChart/__test__/__snapshots__/LinearChart.test.js.snap +0 -81
  93. package/src/commons/Device/WindSpeed/LinearChart/index.js +2 -1
  94. package/src/commons/Device/__test__/ConnectedViewHeader.test.js +16 -8
  95. package/src/commons/Device/__test__/DeviceAlertStatus.test.js +13 -5
  96. package/src/commons/Device/__test__/DisconnectedView.test.js +13 -5
  97. package/src/commons/Device/__test__/FlatListItems.test.js +9 -1
  98. package/src/commons/Device/__test__/FooterInfo.test.js +13 -4
  99. package/src/commons/Device/__test__/SensorConnectedStatus.test.js +9 -1
  100. package/src/commons/Device/__test__/__snapshots__/DisconnectedView.test.js.snap +20 -20
  101. package/src/commons/DisplayChecking/__test__/DisplayChecking.test.js +28 -0
  102. package/src/commons/EmergencyButton/AlertSendConfirm.js +2 -1
  103. package/src/commons/EmergencyButton/AlertSent.js +3 -2
  104. package/src/commons/Explore/CityItem/index.js +2 -1
  105. package/src/commons/Explore/HeaderExplore/index.js +2 -1
  106. package/src/commons/Explore/HeaderLabel/index.js +2 -1
  107. package/src/commons/Explore/SearchBox/__test__/SearchBox.test.js +9 -2
  108. package/src/commons/Explore/SearchBox/index.js +2 -1
  109. package/src/commons/Explore/__test__/CityItem.test.js +13 -15
  110. package/src/commons/Explore/__test__/HeaderExplore.test.js +11 -7
  111. package/src/commons/Explore/__test__/HeaderLabel.test.js +15 -9
  112. package/src/commons/Explore/__test__/LocationItem.test.js +31 -0
  113. package/src/commons/Header/HeaderCustom.js +22 -2
  114. package/src/commons/Header/Styles/HeaderCustomStyles.js +2 -2
  115. package/src/commons/Header/__test__/HeaderCT.test.js +12 -4
  116. package/src/commons/HeaderAni/index.js +36 -5
  117. package/src/commons/HorizontalPicker/index.js +134 -0
  118. package/src/commons/HorizontalPicker/styles.js +56 -0
  119. package/src/commons/ImagePicker/__test__/ImagePicker.test.js +19 -13
  120. package/src/commons/ImagePicker/index.js +3 -1
  121. package/src/commons/MediaPlayer/index.js +2 -1
  122. package/src/commons/MediaPlayerDetail/__test__/MediaPlayerDetail.test.js +14 -8
  123. package/src/commons/MediaPlayerDetail/index.js +4 -1
  124. package/src/commons/MenuActionAddnew/__test__/MenuActionAddNew.test.js +11 -20
  125. package/src/commons/MenuActionAddnew/index.js +2 -1
  126. package/src/commons/Modal/ModalBottom.js +51 -0
  127. package/src/commons/Modal/ModalFullVideo.js +2 -1
  128. package/src/commons/Modal/Styles/ModalBottomStyles.js +35 -0
  129. package/src/commons/Modal/__test__/ModalBottom.test.js +39 -0
  130. package/src/commons/Modal/index.js +2 -1
  131. package/src/commons/NavBar/index.js +2 -2
  132. package/src/commons/RowItem/__test__/RowItem.test.js +16 -0
  133. package/src/commons/RowItem/index.js +61 -0
  134. package/src/commons/RowItem/styles.js +53 -0
  135. package/src/commons/SelectActionCard/SelectActionStyles.js +16 -0
  136. package/src/commons/SelectActionCard/index.js +30 -0
  137. package/src/commons/Sharing/DevicePermissionsCheckbox.js +2 -1
  138. package/src/commons/Sharing/MemberList.js +3 -1
  139. package/src/commons/Sharing/RowMember.js +3 -2
  140. package/src/commons/Sharing/StationDevicePermissions.js +2 -1
  141. package/src/commons/Sharing/WrapHeaderScrollable.js +78 -74
  142. package/src/commons/Sharing/__test__/DevicePermissionsCheckbox.test.js +15 -9
  143. package/src/commons/Sharing/__test__/MemberList.test.js +17 -25
  144. package/src/commons/Sharing/__test__/StationDevicePermission.test.js +17 -12
  145. package/src/commons/Sharing/__test__/WrapHeaderScrollable.test.js +0 -9
  146. package/src/commons/SubUnit/OneTap/ItemOneTap.js +101 -0
  147. package/src/commons/SubUnit/OneTap/ItemOneTapStyles.js +41 -0
  148. package/src/commons/SubUnit/OneTap/OneTapStyles.js +36 -0
  149. package/src/commons/SubUnit/OneTap/__test__/SubUnitAutomate.test.js +195 -0
  150. package/src/commons/SubUnit/OneTap/index.js +39 -0
  151. package/src/commons/SubUnit/ShortDetail.js +11 -6
  152. package/src/commons/SubUnit/__test__/ShortDetail.test.js +14 -6
  153. package/src/commons/Today/__test__/Today.test.js +9 -1
  154. package/src/commons/Today/__test__/__snapshots__/Today.test.js.snap +1 -1
  155. package/src/commons/Today/index.js +2 -1
  156. package/src/commons/Unit/SharedUnit.js +2 -1
  157. package/src/commons/Unit/__test__/SharedUnit.test.js +330 -0
  158. package/src/commons/UnitSummary/AirQuality/SegmentedRoundDisplay/index.js +1 -2
  159. package/src/commons/UnitSummary/AirQuality/__test__/index.test.js +16 -17
  160. package/src/commons/UnitSummary/AirQuality/index.js +5 -120
  161. package/src/commons/UnitSummary/AirQuality/styles.js +112 -0
  162. package/src/commons/UnitSummary/TotalPowerConsumption/index.js +2 -1
  163. package/src/commons/UnitSummary/__test__/TotalPowerConsumption.test.js +15 -9
  164. package/src/commons/WheelDateTimePicker/Picker.js +57 -0
  165. package/src/commons/WheelDateTimePicker/index.js +168 -0
  166. package/src/commons/WheelDateTimePicker/styles.js +21 -0
  167. package/src/commons/index.js +2 -0
  168. package/src/configs/API.js +29 -0
  169. package/src/configs/Colors.js +1 -0
  170. package/src/configs/Constants.js +61 -0
  171. package/src/configs/Images.js +1 -0
  172. package/src/configs/SCConfig.js +7 -0
  173. package/src/configs/Theme.js +20 -0
  174. package/src/context/SCContext.tsx +9 -39
  175. package/src/context/actionType.ts +11 -0
  176. package/src/context/mockStore.ts +51 -0
  177. package/src/context/reducer.ts +23 -0
  178. package/src/hooks/Common/__test__/useStatusbar.test.js +28 -0
  179. package/src/hooks/Common/__test__/useTranslations.test.js +23 -0
  180. package/src/hooks/Common/index.js +2 -0
  181. package/src/hooks/Common/useGetIdUser.js +9 -0
  182. package/src/hooks/Common/useTranslations.ts +34 -0
  183. package/src/iot/Monitor.js +2 -1
  184. package/src/iot/RemoteControl/Bluetooth.js +2 -6
  185. package/src/iot/RemoteControl/GoogleHome.js +1 -1
  186. package/src/iot/RemoteControl/Internet.js +1 -1
  187. package/src/iot/RemoteControl/LG.js +57 -15
  188. package/src/iot/RemoteControl/__test__/Bluetooth.test.js +3 -5
  189. package/src/iot/RemoteControl/__test__/GoogleHome.test.js +3 -3
  190. package/src/iot/RemoteControl/__test__/Internet.test.js +1 -8
  191. package/src/iot/RemoteControl/__test__/LgThinq.test.js +7 -10
  192. package/src/iot/RemoteControl/index.js +1 -1
  193. package/src/iot/states.js +1 -0
  194. package/src/navigations/AutomateStack.js +45 -0
  195. package/src/navigations/SharedStack.js +2 -1
  196. package/src/navigations/UnitStack.js +86 -6
  197. package/src/navigations/utils.js +8 -0
  198. package/src/screens/AQIGuide/__test__/AQIGuide.test.js +9 -1
  199. package/src/screens/AQIGuide/index.js +2 -2
  200. package/src/screens/ActivityLog/__test__/index.test.js +14 -39
  201. package/src/screens/ActivityLog/index.js +2 -1
  202. package/src/screens/AddCommon/SelectSubUnit.js +5 -4
  203. package/src/screens/AddCommon/SelectUnit.js +3 -2
  204. package/src/screens/AddCommon/__test__/SelectSubUnit.test.js +61 -0
  205. package/src/screens/AddCommon/__test__/SelectUnit.test.js +18 -10
  206. package/src/screens/AddLocationMaps/index.js +2 -1
  207. package/src/screens/AddNewAction/Components/LoadingSelectAction.js +40 -0
  208. package/src/screens/AddNewAction/Components/index.js +3 -0
  209. package/src/screens/AddNewAction/Device/DeviceStyles.js +43 -0
  210. package/src/screens/AddNewAction/Device/__test__/index.test.js +42 -0
  211. package/src/screens/AddNewAction/Device/index.js +33 -0
  212. package/src/screens/AddNewAction/SelectAction.js +237 -0
  213. package/src/screens/AddNewAction/SelectSensorDevices.js +150 -0
  214. package/src/screens/AddNewAction/SetupSensor.js +221 -0
  215. package/src/screens/AddNewAction/Styles/SelectActionStyles.js +62 -0
  216. package/src/screens/AddNewAction/Styles/SelectSensorDevicesStyles.js +36 -0
  217. package/src/screens/AddNewAction/Styles/SetupSensorStyles.js +76 -0
  218. package/src/screens/AddNewAction/__test__/SelectAction.test.js +153 -0
  219. package/src/screens/AddNewAction/__test__/SelectSensorDevices.test.js +191 -0
  220. package/src/screens/AddNewAction/__test__/SetupSensor.test.js +125 -0
  221. package/src/screens/AddNewAutoSmart/__test__/AddNewAutoSmart.test.js +112 -0
  222. package/src/screens/AddNewAutoSmart/index.js +113 -0
  223. package/src/screens/AddNewAutoSmart/styles/AddNewAutoSmartStyles.js +36 -0
  224. package/src/screens/AddNewDevice/ConnectDevices.js +2 -1
  225. package/src/screens/AddNewDevice/ConnectingDevices.js +2 -1
  226. package/src/screens/AddNewDevice/__test__/AddNewDevice.test.js +29 -13
  227. package/src/screens/AddNewDevice/__test__/ConnectDevices.test.js +19 -7
  228. package/src/screens/AddNewDevice/__test__/ConnectingDevices.test.js +16 -6
  229. package/src/screens/AddNewDevice/hooks/useStateAlertRename.js +2 -1
  230. package/src/screens/AddNewDevice/index.js +2 -1
  231. package/src/screens/AddNewGateway/ConnectedGateway.js +2 -1
  232. package/src/screens/AddNewGateway/ConnectingGateway.js +99 -24
  233. package/src/screens/AddNewGateway/ConnectingGatewayStyles.js +92 -0
  234. package/src/screens/AddNewGateway/SetupGatewayWifi.js +3 -2
  235. package/src/screens/AddNewGateway/__test__/AddNewGateway.test.js +35 -72
  236. package/src/screens/AddNewGateway/__test__/ConnectedGateway.test.js +14 -4
  237. package/src/screens/AddNewGateway/__test__/ConnectingGateway.test.js +20 -10
  238. package/src/screens/AddNewGateway/hooks/useStateAlertRename.js +2 -1
  239. package/src/screens/AddNewGateway/index.js +2 -1
  240. package/src/screens/AddNewOneTap/AddNewOneTapStyles.js +44 -0
  241. package/src/screens/AddNewOneTap/__test__/AddNewOneTap.test.js +130 -0
  242. package/src/screens/AddNewOneTap/index.js +83 -0
  243. package/src/screens/AllCamera/__test__/index.test.js +103 -0
  244. package/src/screens/AllCamera/index.js +2 -1
  245. package/src/screens/Automate/Components/Loading.js +64 -0
  246. package/src/screens/Automate/Styles/indexStyles.js +64 -0
  247. package/src/screens/Automate/__test__/Loading.test.js +16 -0
  248. package/src/screens/Automate/__test__/index.test.js +93 -0
  249. package/src/screens/Automate/index.js +148 -0
  250. package/src/screens/Device/HeaderDevice/styles.js +2 -2
  251. package/src/screens/Device/__test__/detail.test.js +90 -18
  252. package/src/screens/Device/detail.js +73 -35
  253. package/src/screens/Device/hooks/useCountUp.js +4 -0
  254. package/src/screens/Device/hooks/useEmergencyButton.js +3 -2
  255. package/src/screens/Device/styles.js +5 -1
  256. package/src/screens/DeviceInfo/__test__/index.test.js +12 -3
  257. package/src/screens/DeviceInfo/index.js +2 -1
  258. package/src/screens/EditActionsList/Styles/indexStyles.js +84 -0
  259. package/src/screens/EditActionsList/index.js +186 -0
  260. package/src/screens/EmergencyContacts/EmergencyContactsAddNew.js +3 -2
  261. package/src/screens/EmergencyContacts/EmergencyContactsList.js +9 -2
  262. package/src/screens/EmergencyContacts/EmergencyContactsSelectContacts.js +2 -1
  263. package/src/screens/EmergencyContacts/__test__/EmergencyContactAddNew.test.js +15 -18
  264. package/src/screens/EmergencyContacts/__test__/EmergencyContactList.test.js +19 -23
  265. package/src/screens/EmergencyContacts/__test__/EmergencyContactsSelectContacts.test.js +10 -25
  266. package/src/screens/EmergencyContacts/hook.js +3 -2
  267. package/src/screens/Explore/index.js +3 -2
  268. package/src/screens/GuestInfo/__test__/index.test.js +176 -0
  269. package/src/screens/GuestInfo/components/AccessScheduleItem.js +32 -0
  270. package/src/screens/GuestInfo/components/AccessScheduleSheet.js +204 -0
  271. package/src/screens/GuestInfo/components/HeaderGuestInfo.js +36 -0
  272. package/src/screens/GuestInfo/components/RecurringDetail.js +106 -0
  273. package/src/screens/GuestInfo/components/RowGuestInfo.js +31 -0
  274. package/src/screens/GuestInfo/components/TemporaryDetail.js +53 -0
  275. package/src/screens/GuestInfo/constant.js +59 -0
  276. package/src/screens/GuestInfo/index.js +150 -0
  277. package/src/screens/GuestInfo/styles/AccessScheduleDetailStyles.js +31 -0
  278. package/src/screens/GuestInfo/styles/AccessScheduleItemStyles.js +22 -0
  279. package/src/screens/GuestInfo/styles/HeaderGuestInfoStyles.js +31 -0
  280. package/src/screens/GuestInfo/styles/indexStyles.js +38 -0
  281. package/src/screens/ManageAccess/__test__/ManageAccess.test.js +13 -1
  282. package/src/screens/ManageAccess/hooks/index.js +4 -0
  283. package/src/screens/ManageAccess/index.js +49 -20
  284. package/src/screens/ManageAccess/styles/ManageAccessStyles.js +3 -0
  285. package/src/screens/PlayBackCamera/Timer.js +1 -1
  286. package/src/screens/PlayBackCamera/index.js +9 -5
  287. package/src/screens/ScanChipQR/__test__/ScanChipQR.test.js +2 -11
  288. package/src/screens/ScanChipQR/components/QRScan/index.js +2 -1
  289. package/src/screens/ScriptDetail/Styles/indexStyles.js +157 -0
  290. package/src/screens/ScriptDetail/__test__/index.test.js +119 -0
  291. package/src/screens/ScriptDetail/hooks/index.js +55 -0
  292. package/src/screens/ScriptDetail/index.js +344 -0
  293. package/src/screens/SelectUnit/Styles/indexStyles.js +55 -0
  294. package/src/screens/SelectUnit/__test__/index.test.js +85 -0
  295. package/src/screens/SelectUnit/index.js +100 -0
  296. package/src/screens/SetSchedule/__test__/index.test.js +97 -0
  297. package/src/screens/SetSchedule/components/RepeatOptionsPopup.js +56 -0
  298. package/src/screens/SetSchedule/components/RowItem.js +27 -0
  299. package/src/screens/SetSchedule/components/SelectWeekday.js +65 -0
  300. package/src/screens/SetSchedule/index.js +139 -0
  301. package/src/screens/SetSchedule/styles/RepeatOptionsPopupStyles.js +22 -0
  302. package/src/screens/SetSchedule/styles/RowItemStyles.js +29 -0
  303. package/src/screens/SetSchedule/styles/SelectWeekdayStyles.js +26 -0
  304. package/src/screens/SetSchedule/styles/indexStyles.js +22 -0
  305. package/src/screens/SharedUnit/TabHeader.js +2 -1
  306. package/src/screens/SharedUnit/__test__/TabHeader.test.js +40 -0
  307. package/src/screens/SharedUnit/index.js +3 -2
  308. package/src/screens/Sharing/MemberList.js +2 -1
  309. package/src/screens/Sharing/SelectPermission.js +2 -1
  310. package/src/screens/Sharing/SelectUser.js +3 -2
  311. package/src/screens/Sharing/__test__/MemberList.test.js +25 -28
  312. package/src/screens/Sharing/__test__/SelectPermission.test.js +16 -8
  313. package/src/screens/Sharing/__test__/SelectUser.test.js +33 -15
  314. package/src/screens/Sharing/hooks/index.js +22 -17
  315. package/src/screens/SubUnit/AddSubUnit.js +3 -2
  316. package/src/screens/SubUnit/Detail.js +5 -4
  317. package/src/screens/SubUnit/EditSubUnit.js +274 -0
  318. package/src/screens/SubUnit/EditSubUnitStyles.js +119 -0
  319. package/src/screens/SubUnit/ManageSubUnit.js +114 -371
  320. package/src/screens/SubUnit/ManageSubUnitStyles.js +40 -0
  321. package/src/screens/SubUnit/__test__/AddSubUnit.test.js +17 -11
  322. package/src/screens/SubUnit/__test__/Detail.test.js +11 -31
  323. package/src/screens/SubUnit/__test__/EditSubUnit.test.js +427 -0
  324. package/src/screens/SubUnit/__test__/ManageSubUnit.test.js +51 -384
  325. package/src/screens/SubUnit/hooks/__test__/useManageSubUnit.test.js +85 -0
  326. package/src/screens/SubUnit/hooks/useManageSubUnit.js +35 -0
  327. package/src/screens/SyncLGDevice/AddLGDevice.js +3 -2
  328. package/src/screens/TDSGuide/__test__/TDSGuide.test.js +9 -1
  329. package/src/screens/TDSGuide/index.js +2 -1
  330. package/src/screens/UVIndexGuide/__test__/UVIndexGuide.test.js +9 -1
  331. package/src/screens/UVIndexGuide/index.js +2 -1
  332. package/src/screens/Unit/AddMenu.js +3 -2
  333. package/src/screens/Unit/Detail.js +66 -20
  334. package/src/screens/Unit/ManageUnit/index.js +4 -3
  335. package/src/screens/Unit/ManageUnit.js +15 -4
  336. package/src/screens/Unit/MoreMenu.js +3 -2
  337. package/src/screens/Unit/SelectLocation.js +8 -2
  338. package/src/screens/Unit/SelectLocationStyles.js +11 -0
  339. package/src/screens/Unit/__test__/AddMenu.test.js +15 -15
  340. package/src/screens/Unit/__test__/CheckSendEmail.test.js +19 -10
  341. package/src/screens/Unit/__test__/Detail.test.js +92 -33
  342. package/src/screens/Unit/__test__/ManageUnit.test.js +16 -23
  343. package/src/screens/Unit/components/Header/index.js +2 -1
  344. package/src/screens/Unit/components/ListMyAllUnit/index.js +2 -1
  345. package/src/screens/Unit/components/MyUnit/index.js +2 -1
  346. package/src/screens/Unit/components/SearchLocation/__test__/RowLocation.test.js +36 -0
  347. package/src/screens/Unit/components/SearchLocation/index.js +2 -1
  348. package/src/screens/Unit/components/SharedUnit/index.js +2 -1
  349. package/src/screens/Unit/components/__test__/MyUnit.test.js +22 -72
  350. package/src/screens/Unit/components/__test__/MyUnitDevice.test.js +32 -0
  351. package/src/screens/Unit/components/__test__/SharedUnit.test.js +11 -2
  352. package/src/screens/UnitSummary/__test__/index.test.js +12 -4
  353. package/src/screens/UnitSummary/components/3PPowerConsumption/__test__/3PPowerConsumption.test.js +13 -3
  354. package/src/screens/UnitSummary/components/3PPowerConsumption/index.js +2 -1
  355. package/src/screens/UnitSummary/components/PowerConsumption/__test__/PowerConsumption.test.js +16 -12
  356. package/src/screens/UnitSummary/components/PowerConsumption/index.js +2 -1
  357. package/src/screens/UnitSummary/components/RunningDevices/__test__/index.test.js +2 -2
  358. package/src/screens/UnitSummary/components/Temperature/index.js +2 -1
  359. package/src/screens/UnitSummary/components/TotalPowerConsumption/index.js +2 -1
  360. package/src/screens/UnitSummary/components/UvIndex/__test__/__snapshots__/index.test.js.snap +37 -37
  361. package/src/screens/UnitSummary/components/UvIndex/__test__/index.test.js +14 -6
  362. package/src/screens/UnitSummary/components/UvIndex/index.js +2 -1
  363. package/src/screens/UnitSummary/components/WaterQuality/__test__/index.test.js +11 -5
  364. package/src/screens/UnitSummary/components/WaterQuality/index.js +2 -1
  365. package/src/screens/UnitSummary/components/__test__/TotalPowerConsumption.test.js +13 -7
  366. package/src/screens/UnitSummary/components/__test__/UnitSummary.test.js +67 -0
  367. package/src/screens/UnitSummary/components/__test__/index.test.js +48 -0
  368. package/src/screens/UnitSummary/components/index.js +1 -37
  369. package/src/screens/UnitSummary/components/indexstyles.js +39 -0
  370. package/src/screens/UnitSummary/index.js +2 -1
  371. package/src/screens/WaterQualityGuide/__test__/index.test.js +12 -12
  372. package/src/screens/WaterQualityGuide/index.js +2 -1
  373. package/src/utils/Apis/axios.js +0 -4
  374. package/src/utils/Converter/array.js +4 -0
  375. package/src/utils/Converter/time.js +29 -4
  376. package/src/utils/I18n/index.ts +6 -0
  377. package/src/utils/I18n/translations/en.json +77 -5
  378. package/src/utils/I18n/translations/vi.json +73 -3
  379. package/src/utils/I18n/translations.ts +45 -0
  380. package/src/utils/Route/index.js +13 -0
  381. package/src/utils/__test__/InitData.test.js +20 -0
  382. package/src/commons/ChartLoading/__test__/__snapshots__/ChartLoading.test.js.snap +0 -66
  383. package/src/commons/Device/HistoryChart/__test__/HistoryChart.test.js +0 -57
  384. package/src/commons/Device/HistoryChart/__test__/__snapshots__/HistoryChart.test.js.snap +0 -593
  385. package/src/commons/Explore/SearchBox/__test__/__snapshots__/SearchBox.test.js.snap +0 -59
  386. package/src/commons/Header/__test__/Header.test.js +0 -24
  387. package/src/commons/MenuActionAddnew/__test__/__snapshots__/MenuActionAddNew.test.js.snap +0 -788
  388. package/src/commons/Sharing/__test__/__snapshots__/WrapHeaderScrollable.test.js.snap +0 -174
  389. package/src/commons/UnitSummary/AirQuality/__test__/__snapshots__/index.test.js.snap +0 -26679
  390. package/src/iot/RemoteControl/__test__/index.test.js +0 -101
  391. package/src/iot/__test__/Monitor.test.js +0 -119
  392. package/src/screens/EmergencyContacts/__test__/__snapshots__/EmergencyContactAddNew.test.js.snap +0 -1706
  393. package/src/screens/EmergencyContacts/__test__/__snapshots__/EmergencyContactList.test.js.snap +0 -4276
  394. package/src/screens/EmergencyContacts/__test__/__snapshots__/EmergencyContactsSelectContacts.test.js.snap +0 -2240
  395. package/src/screens/SyncLGDevice/__test__/AddLGDevice.test.js +0 -358
  396. package/src/screens/Unit/MyAllUnit/__test__/__snapshots__/index.test.js.snap +0 -1001
  397. package/src/screens/Unit/MyAllUnit/__test__/index.test.js +0 -48
  398. package/src/screens/Unit/components/MyAllUnit/__test__/__snapshots__/index.test.js.snap +0 -1001
  399. package/src/screens/Unit/components/MyAllUnit/__test__/index.test.js +0 -48
  400. package/src/screens/UnitSummary/components/WaterQuality/__test__/__snapshots__/index.test.js.snap +0 -1574
  401. package/src/screens/WaterQualityGuide/__test__/__snapshots__/index.test.js.snap +0 -3375
  402. package/src/utils/Converter/__test__/time.test.js +0 -126
  403. package/src/utils/I18n/index.js +0 -19
  404. package/src/utils/I18n/index.test.js +0 -7
@@ -1,6 +1,6 @@
1
1
  import MenuActionAddnew from '../../commons/MenuActionAddnew';
2
2
  import React, { memo, useCallback, useMemo } from 'react';
3
- import { t } from 'i18n-js';
3
+ import { useTranslations } from '../../hooks/Common/useTranslations';
4
4
  import Routes from '../../utils/Route';
5
5
  import AddSubUnitIcon from '../../../assets/images/Popover/Dashboard/AddSubUnit.svg';
6
6
  import AddDeviceIcon from '../../../assets/images/Popover/Dashboard/AddDevice.svg';
@@ -8,6 +8,7 @@ import AddMemberIcon from '../../../assets/images/Popover/Dashboard/AddMember.sv
8
8
  import { useNavigation } from '@react-navigation/native';
9
9
 
10
10
  const AddMenu = memo(({ unit, afterItemClick, showAdd, setHideAdd }) => {
11
+ const t = useTranslations();
11
12
  const navigation = useNavigation();
12
13
 
13
14
  const onItemClick = useCallback(
@@ -50,7 +51,7 @@ const AddMenu = memo(({ unit, afterItemClick, showAdd, setHideAdd }) => {
50
51
  data: { screen: Routes.SetupGatewayWifi, params: { unit_id: unit.id } },
51
52
  },
52
53
  ];
53
- }, [unit]);
54
+ }, [t, unit]);
54
55
 
55
56
  const hideAddModal = useCallback(() => {
56
57
  setHideAdd(false);
@@ -1,7 +1,7 @@
1
1
  import React, { useCallback, useContext, useEffect, useState } from 'react';
2
2
  import { AppState, RefreshControl, View } from 'react-native';
3
3
  import { useIsFocused } from '@react-navigation/native';
4
- import { t } from 'i18n-js';
4
+ import { useTranslations } from '../../hooks/Common/useTranslations';
5
5
 
6
6
  import styles from './styles';
7
7
  import AddMenu from './AddMenu';
@@ -24,8 +24,11 @@ import CameraDevice from '../../commons/CameraDevice';
24
24
  import { ModalFullVideo } from '../../commons/Modal';
25
25
  import { useNavigation } from '@react-navigation/native';
26
26
  import Routes from '../../utils/Route';
27
+ import SubUnitAutomate from '../../commons/SubUnit/OneTap';
28
+ import { AUTOMATE_TYPE } from '../../configs/Constants';
27
29
 
28
30
  const UnitDetail = ({ route }) => {
31
+ const t = useTranslations();
29
32
  const { unitId, unitData } = route.params;
30
33
  const isFocused = useIsFocused();
31
34
  const { stateData, setAction } = useContext(SCContext);
@@ -35,6 +38,8 @@ const UnitDetail = ({ route }) => {
35
38
  const [appState, setAppState] = useState(AppState.currentState);
36
39
  const [listMenuItem, setListMenuItem] = useState([]);
37
40
  const [listStation, setListStation] = useState([]);
41
+ const [oneTap, setOneTap] = useState([]);
42
+ const [script, setScript] = useState([]);
38
43
  const [isGGHomeConnected, setIsGGHomeConnected] = useState(false);
39
44
  const [station, setStation] = useState([]);
40
45
  const [indexStation, setIndexStation] = useState(0);
@@ -56,25 +61,37 @@ const UnitDetail = ({ route }) => {
56
61
  setIsFullScreen(false);
57
62
  }, []);
58
63
 
59
- const prepareData = useCallback((rawUnitData) => {
60
- const favorites = {
61
- isFakeStation: true,
62
- isFavorites: true,
63
- name: t('favorites'),
64
- sensors: [],
65
- };
66
- rawUnitData.stations.unshift(favorites);
67
- rawUnitData.stations.forEach((stationItem) => {
68
- if (stationItem.sensors) {
69
- const favoriteDevices = stationItem.sensors.filter(
70
- (sensorItem) => sensorItem.is_favourite
71
- );
72
- favorites.sensors = favorites.sensors.concat(favoriteDevices);
73
- }
74
- });
75
- }, []);
64
+ const prepareData = useCallback(
65
+ (rawUnitData) => {
66
+ rawUnitData.stations.unshift({
67
+ isOneTap: true,
68
+ name: t('One-Tap'),
69
+ });
70
+ const favorites = {
71
+ isFakeStation: true,
72
+ isFavorites: true,
73
+ name: t('favorites'),
74
+ sensors: [],
75
+ };
76
+ rawUnitData.stations.unshift(favorites);
77
+ rawUnitData.stations.forEach((stationItem) => {
78
+ if (stationItem.sensors) {
79
+ const favoriteDevices = stationItem.sensors.filter(
80
+ (sensorItem) => sensorItem.is_favourite
81
+ );
82
+ favorites.sensors = favorites.sensors.concat(favoriteDevices);
83
+ }
84
+ });
85
+ rawUnitData.stations.push({
86
+ isScript: true,
87
+ name: t('Scenario'),
88
+ });
89
+ },
90
+ [t]
91
+ );
76
92
 
77
93
  const fetchDetails = useCallback(async () => {
94
+ getAutomates();
78
95
  await fetchWithCache(API.UNIT.UNIT_DETAIL(unitId), {}, (response) => {
79
96
  const { success, data } = response;
80
97
  if (success) {
@@ -82,7 +99,17 @@ const UnitDetail = ({ route }) => {
82
99
  setUnit(data);
83
100
  }
84
101
  });
85
- }, [setUnit, unitId, prepareData]);
102
+ }, [setUnit, unitId, prepareData, getAutomates]);
103
+
104
+ const getAutomates = useCallback(async () => {
105
+ await fetchWithCache(API.UNIT.AUTOMATE(unitId), {}, (response) => {
106
+ const { success, data } = response;
107
+ if (success) {
108
+ setOneTap(data.filter((item) => item.type === AUTOMATE_TYPE.ONE_TAP));
109
+ setScript(data.filter((item) => item.type !== AUTOMATE_TYPE.ONE_TAP));
110
+ }
111
+ });
112
+ }, [unitId]);
86
113
 
87
114
  const onRefresh = useCallback(() => {
88
115
  fetchDetails();
@@ -203,6 +230,25 @@ const UnitDetail = ({ route }) => {
203
230
  goToPlayBack={goToPlayBack}
204
231
  />
205
232
  );
233
+ } else if (station.isOneTap) {
234
+ return (
235
+ <SubUnitAutomate
236
+ isOwner={isOwner}
237
+ type={AUTOMATE_TYPE.ONE_TAP}
238
+ automates={oneTap}
239
+ unit={unit}
240
+ />
241
+ );
242
+ } else if (station.isScript) {
243
+ return (
244
+ <SubUnitAutomate
245
+ isOwner={isOwner}
246
+ type={AUTOMATE_TYPE.VALUE_CHANGE}
247
+ automates={script}
248
+ unit={unit}
249
+ isScript
250
+ />
251
+ );
206
252
  } else if (station) {
207
253
  return (
208
254
  <ShortDetailSubUnit
@@ -216,7 +262,7 @@ const UnitDetail = ({ route }) => {
216
262
  return (
217
263
  <WrapParallaxScrollView
218
264
  uriImg={unit.background}
219
- title={t('Welcome %{name}', {
265
+ title={t('Welcome {name}', {
220
266
  name: unit.name ? unit.name : '',
221
267
  })}
222
268
  refreshControl={
@@ -8,7 +8,7 @@ import {
8
8
  } from 'react-native';
9
9
  import Modal from 'react-native-modal';
10
10
  import Animated from 'react-native-reanimated';
11
- import { t } from 'i18n-js';
11
+ import { useTranslations } from '../../../hooks/Common/useTranslations';
12
12
 
13
13
  import { Colors, API, Device } from '../../../configs';
14
14
  import Routes from '../../../utils/Route';
@@ -37,6 +37,7 @@ import { useIsOwnerOfUnit } from '../../../hooks/Common';
37
37
  import { TESTID } from '../../../configs/Constants';
38
38
 
39
39
  const ManageUnit = ({ route }) => {
40
+ const t = useTranslations();
40
41
  const { unit } = route.params;
41
42
  const { isOwner } = useIsOwnerOfUnit(unit.user_id);
42
43
  const [showEdit, setshowEdit, setHideEdit] = useBoolean();
@@ -57,7 +58,7 @@ const ManageUnit = ({ route }) => {
57
58
  ToastBottomHelper.success(t('unit_updated_successfully'));
58
59
  }
59
60
  },
60
- [unit.id, imageUrl]
61
+ [imageUrl, unit.id, t]
61
62
  );
62
63
 
63
64
  const goRename = useCallback(async () => {
@@ -85,7 +86,7 @@ const ManageUnit = ({ route }) => {
85
86
  ToastBottomHelper.success(t('unit_deleted_successfully'));
86
87
  navigate(Routes.Dashboard);
87
88
  }
88
- }, [unit.id, setHideEdit]);
89
+ }, [unit.id, setHideEdit, t]);
89
90
 
90
91
  const [transY] = useKeyboardAnimated(-16);
91
92
  const animatedStyle = Platform.select({
@@ -2,7 +2,7 @@ import React, { useState, useCallback, useEffect } from 'react';
2
2
  import { View, TouchableOpacity, Image, Platform } from 'react-native';
3
3
  import Modal from 'react-native-modal';
4
4
  import Animated from 'react-native-reanimated';
5
- import { t } from 'i18n-js';
5
+ import { useTranslations } from '../../hooks/Common/useTranslations';
6
6
 
7
7
  import { Colors, API, Device, Images } from '../../configs';
8
8
  import Routes from '../../utils/Route';
@@ -62,6 +62,7 @@ const ButtonWrapper = ({
62
62
  };
63
63
 
64
64
  const ManageUnit = ({ route }) => {
65
+ const t = useTranslations();
65
66
  const { unit } = route.params;
66
67
  const navigation = useNavigation();
67
68
  const { isOwner } = useIsOwnerOfUnit(unit.user_id);
@@ -90,7 +91,7 @@ const ManageUnit = ({ route }) => {
90
91
  ToastBottomHelper.success(t('unit_updated_successfully'));
91
92
  }
92
93
  },
93
- [unit.id, setUnitData]
94
+ [unit.id, t]
94
95
  );
95
96
 
96
97
  const updateLocation = useCallback(
@@ -137,7 +138,16 @@ const ManageUnit = ({ route }) => {
137
138
  ToastBottomHelper.success(t('unit_deleted_successfully'));
138
139
  navigate(Routes.Dashboard);
139
140
  }
140
- }, [unit.id, setHideEdit]);
141
+ }, [unit.id, setHideEdit, t]);
142
+
143
+ const goToManageSubUnit = useCallback(() => {
144
+ navigation.navigate(Routes.UnitStack, {
145
+ screen: Routes.ManageSubUnit,
146
+ params: {
147
+ unit,
148
+ },
149
+ });
150
+ }, [navigation, unit]);
141
151
 
142
152
  const [transY] = useKeyboardAnimated(-16);
143
153
  const animatedStyle = Platform.select({
@@ -179,8 +189,9 @@ const ManageUnit = ({ route }) => {
179
189
  </Text>
180
190
  </ButtonWrapper>
181
191
  <ButtonWrapper
192
+ onPress={goToManageSubUnit}
182
193
  title={t('manage_sub_units')}
183
- value={`${unit.stations.length} sub-units`}
194
+ value={`${unit?.stations?.length} sub-units`}
184
195
  />
185
196
  <ButtonWrapper
186
197
  onPress={handleChoosePhoto}
@@ -1,11 +1,12 @@
1
1
  import React, { memo, useCallback, useMemo } from 'react';
2
- import { t } from 'i18n-js';
2
+ import { useTranslations } from '../../hooks/Common/useTranslations';
3
3
  import Routes from '../../utils/Route';
4
4
  import { useNavigation } from '@react-navigation/native';
5
5
  import { MenuActionMore } from '../../commons';
6
6
 
7
7
  const MoreMenu = memo(
8
8
  ({ unit, isOwner, hidePopover, childRef, showingPopover }) => {
9
+ const t = useTranslations();
9
10
  const navigation = useNavigation();
10
11
 
11
12
  const onItemClick = useCallback(
@@ -30,7 +31,7 @@ const MoreMenu = memo(
30
31
  return isOwner
31
32
  ? [RouteManageUnit, RouteUnitMemberList]
32
33
  : [RouteUnitMemberList];
33
- }, [unit, isOwner]);
34
+ }, [t, unit, isOwner]);
34
35
 
35
36
  return (
36
37
  <MenuActionMore
@@ -5,7 +5,7 @@ import { View } from 'react-native';
5
5
  import MapView, { Marker, PROVIDER_GOOGLE } from 'react-native-maps';
6
6
  import BottomButtonView from '../../commons/BottomButtonView';
7
7
 
8
- import { t } from 'i18n-js';
8
+ import { useTranslations } from '../../hooks/Common/useTranslations';
9
9
  import { API } from '../../configs';
10
10
  import styles from './SelectLocationStyles';
11
11
  import SearchBarLocation from './components/SearchLocation';
@@ -14,6 +14,7 @@ import { axiosGet } from '../../utils/Apis/axios';
14
14
  import { ScrollView } from 'react-native-gesture-handler';
15
15
  import { useNavigation } from '@react-navigation/native';
16
16
  import { SCConfig } from '../../configs';
17
+ import Point from '../../../assets/images/AddLocationMaps/Point.svg';
17
18
 
18
19
  const initialRegion = {
19
20
  latitudeDelta: 0.0922,
@@ -24,6 +25,7 @@ const DEFAULT_LATITUDE = 10.7974046; // EoH center
24
25
  const DEFAULT_LONGITUDE = 106.7035663;
25
26
 
26
27
  const SelectLocation = memo(({ route }) => {
28
+ const t = useTranslations();
27
29
  const { updateLocation } = route.params;
28
30
  const { goBack } = useNavigation();
29
31
  const [input, setInput] = useState('');
@@ -136,7 +138,11 @@ const SelectLocation = memo(({ route }) => {
136
138
  longitude: searchedLocation.longitude,
137
139
  }}
138
140
  tracksViewChanges={false}
139
- />
141
+ >
142
+ <View style={styles.pointCircle}>
143
+ <Point />
144
+ </View>
145
+ </Marker>
140
146
  )}
141
147
  </MapView>
142
148
  <BottomButtonView
@@ -15,6 +15,17 @@ export default StyleSheet.create({
15
15
  bottomButton: {
16
16
  backgroundColor: Colors.White,
17
17
  },
18
+ pointCircle: {
19
+ flex: 1,
20
+ alignItems: 'center',
21
+ justifyContent: 'center',
22
+ width: 109,
23
+ height: 109,
24
+ borderRadius: 50,
25
+ backgroundColor: Colors.BlueTransparent5,
26
+ borderWidth: 1,
27
+ borderColor: Colors.Blue10,
28
+ },
18
29
  searchLocation: {
19
30
  paddingVertical: 8,
20
31
  position: 'absolute',
@@ -2,12 +2,25 @@ import React from 'react';
2
2
  import { act, create } from 'react-test-renderer';
3
3
 
4
4
  import MenuActionAddnew from '../../../commons/MenuActionAddnew';
5
+ import { SCProvider } from '../../../context';
6
+ import { mockSCStore } from '../../../context/mockStore';
5
7
  import AddMenu from '../AddMenu';
6
8
 
7
9
  const mockedNavigate = jest.fn();
8
10
  const mockedAfterItemClick = jest.fn();
9
11
  const mockedHideAddModal = jest.fn();
10
12
 
13
+ const wrapComponent = (unit) => (
14
+ <SCProvider initState={mockSCStore({})}>
15
+ <AddMenu
16
+ unit={unit}
17
+ afterItemClick={mockedAfterItemClick}
18
+ showAdd={true}
19
+ setHideAdd={mockedHideAddModal}
20
+ />
21
+ </SCProvider>
22
+ );
23
+
11
24
  jest.mock('@react-navigation/native', () => {
12
25
  return {
13
26
  ...jest.requireActual('@react-navigation/native'),
@@ -22,26 +35,13 @@ describe('Test AddMenu Unit', () => {
22
35
  let tree;
23
36
  test('render AddMenu without route', async () => {
24
37
  let unit = { id: 1, name: 'Unit 1' };
25
- let route_data = { route: '', data: {} };
26
38
  await act(async () => {
27
- tree = create(
28
- <AddMenu
29
- unit={unit}
30
- afterItemClick={mockedAfterItemClick}
31
- showAdd={true}
32
- setHideAdd={mockedHideAddModal}
33
- />
34
- );
39
+ tree = create(wrapComponent(unit));
35
40
  });
36
41
 
37
42
  const instance = tree.root;
38
43
  const menuActionAddnew = instance.findAllByType(MenuActionAddnew);
39
- expect(menuActionAddnew).toHaveLength(1);
40
- await act(async () => {
41
- await menuActionAddnew[0].props.onItemClick(route_data);
42
- });
44
+ expect(menuActionAddnew).toHaveLength(0);
43
45
  expect(mockedNavigate).toHaveBeenCalledTimes(0);
44
- expect(mockedAfterItemClick).toHaveBeenCalledTimes(1);
45
- expect(mockedHideAddModal).toHaveBeenCalledWith(true);
46
46
  });
47
47
  });
@@ -5,6 +5,8 @@ import renderer, { act } from 'react-test-renderer';
5
5
  import UnitDetail from '../Detail';
6
6
  import { useIsFocused } from '@react-navigation/native';
7
7
  import AsyncStorage from '@react-native-community/async-storage';
8
+ import { SCProvider } from '../../../context';
9
+ import { mockSCStore } from '../../../context/mockStore';
8
10
 
9
11
  const mockDispatch = jest.fn();
10
12
 
@@ -24,6 +26,15 @@ jest.mock('../../../iot/RemoteControl/GoogleHome', () => ({
24
26
 
25
27
  jest.mock('axios');
26
28
 
29
+ const wrapComponent = (route, unitData, account) => (
30
+ <SCProvider initState={mockSCStore({})}>
31
+ <UnitDetail
32
+ route={{ params: { ...route.params, unitData } }}
33
+ account={account}
34
+ />
35
+ </SCProvider>
36
+ );
37
+
27
38
  describe('Test UnitDetail google home disconnect', () => {
28
39
  const route = {
29
40
  params: {
@@ -58,17 +69,15 @@ describe('Test UnitDetail google home disconnect', () => {
58
69
  jest.useFakeTimers();
59
70
 
60
71
  await act(async () => {
61
- await renderer.create(
62
- <UnitDetail
63
- route={{ params: { ...route.params, unitData } }}
64
- account={account}
65
- />
66
- );
72
+ await renderer.create(wrapComponent(route, unitData, account));
67
73
  });
68
74
 
69
- expect(axios.post).toHaveBeenCalledWith(API.GOOGLE_HOME.CHECK_SEND_EMAIL, {
70
- chip_id: 1,
71
- is_connected: false,
72
- });
75
+ expect(axios.post).toHaveBeenCalledWith(
76
+ API.GOOGLE_HOME.CHECK_SEND_EMAIL(),
77
+ {
78
+ chip_id: 1,
79
+ is_connected: false,
80
+ }
81
+ );
73
82
  });
74
83
  });
@@ -3,7 +3,7 @@ import React from 'react';
3
3
  import { TouchableOpacity } from 'react-native';
4
4
  import renderer, { act } from 'react-test-renderer';
5
5
  import { createConnection, getStates } from 'home-assistant-js-websocket';
6
- import ParallaxScrollView from 'libs/react-native-parallax-scroll-view';
6
+ import ParallaxScrollView from '../../../libs/react-native-parallax-scroll-view';
7
7
  import { BleManager } from 'react-native-ble-plx';
8
8
  import { useIsFocused } from '@react-navigation/native';
9
9
  import AsyncStorage from '@react-native-community/async-storage';
@@ -13,10 +13,20 @@ import { API } from '../../../configs';
13
13
  import ShortDetailSubUnit from '../../../commons/SubUnit/ShortDetail';
14
14
  import Summaries from '../Summaries';
15
15
  import { TESTID } from '../../../configs/Constants';
16
- import NavBar from '../../../commons/NavBar';
16
+ import { SCProvider } from '../../../context';
17
+ import { mockSCStore } from '../../../context/mockStore';
18
+ import SubUnitAutomate from '../../../commons/SubUnit/OneTap';
19
+ import CameraDevice from '../../../commons/CameraDevice';
20
+ import { ModalFullVideo } from '../../../commons/Modal';
17
21
 
18
22
  const mockDispatch = jest.fn();
19
23
 
24
+ const wrapComponent = (route, account) => (
25
+ <SCProvider initState={mockSCStore({})}>
26
+ <UnitDetail route={route} account={account} />
27
+ </SCProvider>
28
+ );
29
+
20
30
  jest.mock('react-redux', () => {
21
31
  return {
22
32
  ...jest.requireActual('react-redux'),
@@ -77,7 +87,7 @@ describe('Test UnitDetail', () => {
77
87
  data: {},
78
88
  }));
79
89
  await act(async () => {
80
- await renderer.create(<UnitDetail route={route} account={account} />);
90
+ await renderer.create(wrapComponent(route));
81
91
  });
82
92
 
83
93
  expect(axios.get).toHaveBeenCalledWith(detailUnitApiUrl, {});
@@ -89,7 +99,7 @@ describe('Test UnitDetail', () => {
89
99
  data: {},
90
100
  }));
91
101
  await act(async () => {
92
- await renderer.create(<UnitDetail route={route} account={account} />);
102
+ await renderer.create(wrapComponent(route, account));
93
103
  });
94
104
 
95
105
  axios.get.mockImplementation((url) => {
@@ -99,7 +109,7 @@ describe('Test UnitDetail', () => {
99
109
  return { status: 200, data: [] };
100
110
  });
101
111
  await act(async () => {
102
- await renderer.create(<UnitDetail route={route} account={account} />);
112
+ await renderer.create(wrapComponent(route, account));
103
113
  });
104
114
 
105
115
  expect(axios.get).toHaveBeenCalledWith(detailUnitApiUrl, {});
@@ -110,7 +120,7 @@ describe('Test UnitDetail', () => {
110
120
  throw {};
111
121
  });
112
122
  await act(async () => {
113
- await renderer.create(<UnitDetail route={route} account={account} />);
123
+ await renderer.create(wrapComponent(route, account));
114
124
  });
115
125
 
116
126
  expect(axios.get).toHaveBeenCalledWith(detailUnitApiUrl, {});
@@ -131,7 +141,7 @@ describe('Test UnitDetail', () => {
131
141
  };
132
142
  });
133
143
  await act(async () => {
134
- await renderer.create(<UnitDetail route={route} account={account} />);
144
+ await renderer.create(wrapComponent(route, account));
135
145
  });
136
146
 
137
147
  expect(axios.get).toHaveBeenCalledWith(summaryUnitApiUrl, {});
@@ -152,7 +162,7 @@ describe('Test UnitDetail', () => {
152
162
  };
153
163
  });
154
164
  await act(async () => {
155
- await renderer.create(<UnitDetail route={route} account={account} />);
165
+ await renderer.create(wrapComponent(route, account));
156
166
  });
157
167
 
158
168
  expect(axios.get).toHaveBeenCalledWith(summaryUnitApiUrl, {});
@@ -173,7 +183,7 @@ describe('Test UnitDetail', () => {
173
183
  };
174
184
  });
175
185
  await act(async () => {
176
- await renderer.create(<UnitDetail route={route} account={account} />);
186
+ await renderer.create(wrapComponent(route, account));
177
187
  });
178
188
 
179
189
  expect(axios.get).not.toHaveBeenCalledWith(summaryUnitApiUrl, {});
@@ -181,9 +191,7 @@ describe('Test UnitDetail', () => {
181
191
 
182
192
  test('fetch unit detail when refresh', async () => {
183
193
  await act(async () => {
184
- tree = await renderer.create(
185
- <UnitDetail route={route} account={account} />
186
- );
194
+ tree = await renderer.create(wrapComponent(route, account));
187
195
  });
188
196
  axios.get.mockClear();
189
197
  const scrollView = tree.root.findByType(ParallaxScrollView);
@@ -215,10 +223,7 @@ describe('Test UnitDetail', () => {
215
223
 
216
224
  await act(async () => {
217
225
  renderer.create(
218
- <UnitDetail
219
- route={{ params: { ...route.params, unitData } }}
220
- account={account}
221
- />
226
+ wrapComponent({ params: { ...route.params, unitData } }, account)
222
227
  );
223
228
  });
224
229
 
@@ -236,10 +241,7 @@ describe('Test UnitDetail', () => {
236
241
 
237
242
  await act(async () => {
238
243
  renderer.create(
239
- <UnitDetail
240
- route={{ params: { ...route.params, unitData } }}
241
- account={account}
242
- />
244
+ wrapComponent({ params: { ...route.params, unitData } }, account)
243
245
  );
244
246
  });
245
247
  const bleManager = BleManager();
@@ -320,10 +322,7 @@ describe('Test UnitDetail', () => {
320
322
 
321
323
  await act(async () => {
322
324
  tree = await renderer.create(
323
- <UnitDetail
324
- route={{ params: { ...route.params, unitData } }}
325
- account={account}
326
- />
325
+ wrapComponent({ params: { ...route.params, unitData } }, account)
327
326
  );
328
327
  });
329
328
  const instance = tree.root;
@@ -346,9 +345,6 @@ describe('Test UnitDetail', () => {
346
345
  );
347
346
  expect(menu).toHaveLength(1);
348
347
  expect(menu[0].props.isVisible).toEqual(true);
349
-
350
- const nav = instance.findAllByType(NavBar);
351
- expect(nav[0].props.indexStation).toEqual(0);
352
348
  });
353
349
 
354
350
  test('when unit has summaries', async () => {
@@ -356,12 +352,12 @@ describe('Test UnitDetail', () => {
356
352
 
357
353
  await act(async () => {
358
354
  tree = renderer.create(
359
- <UnitDetail route={{ params: { ...route.params } }} account={account} />
355
+ wrapComponent({ params: { ...route.params } }, account)
360
356
  );
361
357
  });
362
358
 
363
359
  const summaryViews = tree.root.findAllByType(Summaries);
364
- expect(summaryViews).toHaveLength(1);
360
+ expect(summaryViews).toHaveLength(0);
365
361
  });
366
362
 
367
363
  test('when unit has google home action then connect to lg thinq', async () => {
@@ -403,10 +399,7 @@ describe('Test UnitDetail', () => {
403
399
  jest.useFakeTimers();
404
400
  await act(async () => {
405
401
  tree = await renderer.create(
406
- <UnitDetail
407
- route={{ params: { ...route.params, unitData } }}
408
- account={account}
409
- />
402
+ wrapComponent({ params: { ...route.params, unitData } }, account)
410
403
  );
411
404
  });
412
405
  await act(async () => {
@@ -415,4 +408,70 @@ describe('Test UnitDetail', () => {
415
408
  // TODO Called but can not expect
416
409
  // expect(axios.get).toHaveBeenCalledWith(API.IOT.LG.DEVICE_STATUS(2));
417
410
  });
411
+ test('render subunit automate', async () => {
412
+ const unitData = {
413
+ stations: [
414
+ {
415
+ isScript: true,
416
+ name: 'Script',
417
+ },
418
+ ],
419
+ };
420
+
421
+ await act(async () => {
422
+ tree = await renderer.create(
423
+ wrapComponent({ params: { ...route.params, unitData } }, account)
424
+ );
425
+ });
426
+ const instance = tree.root;
427
+ const automateViews = instance.findAllByType(SubUnitAutomate);
428
+ expect(automateViews).toHaveLength(1);
429
+ });
430
+ test('render subunit camera devices', async () => {
431
+ const unitData = {
432
+ stations: [
433
+ {
434
+ camera_devices: [
435
+ {
436
+ configuration: {
437
+ id: 4,
438
+ name: 'Camera cửa nhà xe',
439
+ uri: 'rtsp://admin:hd543211@/ISAPI/Streaming/Channels/101/',
440
+ preview_uri:
441
+ 'rtsp://admin:hd543211@/ISAPI/Streaming/Channels/101/',
442
+ playback: 'rtsp://admin:hd543211@/Streaming/tracks/101/',
443
+ },
444
+ id: 41,
445
+ order: 1,
446
+ template: 'camera',
447
+ type: 'camera',
448
+ },
449
+ ],
450
+ },
451
+ ],
452
+ };
453
+
454
+ await act(async () => {
455
+ tree = await renderer.create(
456
+ wrapComponent({ params: { ...route.params, unitData } }, account)
457
+ );
458
+ });
459
+ const instance = tree.root;
460
+ const CameraDeviceViews = instance.findAllByType(CameraDevice);
461
+ expect(CameraDeviceViews).toHaveLength(1);
462
+
463
+ const fullCamera = tree.root.findAll(
464
+ (el) =>
465
+ el.props.testID === TESTID.SUB_UNIT_FULL_CAMERA &&
466
+ el.type === TouchableOpacity
467
+ );
468
+
469
+ expect(fullCamera).toHaveLength(1);
470
+ await act(async () => {
471
+ await fullCamera[0].props.onPress();
472
+ });
473
+ const fullView = instance.findAllByType(ModalFullVideo);
474
+ expect(fullView).toHaveLength(1);
475
+ expect(fullView[0].props.isVisible).toEqual(true);
476
+ });
418
477
  });