ipanel-rnapp-ajb-base 1.0.0

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 (155) hide show
  1. package/app/.local_dev/DemoPage.js +46 -0
  2. package/app/.local_dev/env.js +1 -0
  3. package/app/.local_dev/polyfill.js +83 -0
  4. package/app/App.js +485 -0
  5. package/app/api/homedApi.js +42 -0
  6. package/app/api/index.js +2 -0
  7. package/app/api/ipanelCloudApi.js +796 -0
  8. package/app/assets/img/add.png +0 -0
  9. package/app/assets/img/add_img.png +0 -0
  10. package/app/assets/img/album.png +0 -0
  11. package/app/assets/img/album2.png +0 -0
  12. package/app/assets/img/album3.png +0 -0
  13. package/app/assets/img/album@2x.png +0 -0
  14. package/app/assets/img/album@3x.png +0 -0
  15. package/app/assets/img/audioRecordBar.png +0 -0
  16. package/app/assets/img/bootom_bar_bg.png +0 -0
  17. package/app/assets/img/close.png +0 -0
  18. package/app/assets/img/computer.png +0 -0
  19. package/app/assets/img/confirm.png +0 -0
  20. package/app/assets/img/delete_pic.png +0 -0
  21. package/app/assets/img/disabled.png +0 -0
  22. package/app/assets/img/goBack.png +0 -0
  23. package/app/assets/img/goBack2.png +0 -0
  24. package/app/assets/img/ischeck.png +0 -0
  25. package/app/assets/img/launch_bg.png +0 -0
  26. package/app/assets/img/launch_bg_panyu.png +0 -0
  27. package/app/assets/img/launch_logo.png +0 -0
  28. package/app/assets/img/launch_logo_panyu.png +0 -0
  29. package/app/assets/img/launch_text.png +0 -0
  30. package/app/assets/img/launch_text_panyu.png +0 -0
  31. package/app/assets/img/link.png +0 -0
  32. package/app/assets/img/login_bg.png +0 -0
  33. package/app/assets/img/login_bg_new.png +0 -0
  34. package/app/assets/img/login_left.png +0 -0
  35. package/app/assets/img/login_right.png +0 -0
  36. package/app/assets/img/nocheck.png +0 -0
  37. package/app/assets/img/personal.png +0 -0
  38. package/app/assets/img/photo.png +0 -0
  39. package/app/assets/img/photo@2x.png +0 -0
  40. package/app/assets/img/photo@3x.png +0 -0
  41. package/app/assets/img/protocol_checked.png +0 -0
  42. package/app/assets/img/qiehuan.png +0 -0
  43. package/app/assets/img/scan_border_bottom_left.png +0 -0
  44. package/app/assets/img/scan_border_bottom_right.png +0 -0
  45. package/app/assets/img/scan_border_top_left.png +0 -0
  46. package/app/assets/img/scan_border_top_right.png +0 -0
  47. package/app/assets/img/scan_move.png +0 -0
  48. package/app/assets/img/szjt.png +0 -0
  49. package/app/assets/img/tab.png +0 -0
  50. package/app/assets/img/tykz.png +0 -0
  51. package/app/assets/img/update_bg.png +0 -0
  52. package/app/assets/img/video.png +0 -0
  53. package/app/assets/img/video@2x.png +0 -0
  54. package/app/assets/img/video@3x.png +0 -0
  55. package/app/assets/img/worker.png +0 -0
  56. package/app/assets/img/wx.png +0 -0
  57. package/app/assets/img/ykq.png +0 -0
  58. package/app/assets/img/zfb.png +0 -0
  59. package/app/base.js +342 -0
  60. package/app/components/VersionUpdateConfirm.js +117 -0
  61. package/app/components/common/AccordionCell/index.js +67 -0
  62. package/app/components/common/ActionPicker/BasicPicker.js +136 -0
  63. package/app/components/common/ActionPicker/index.js +106 -0
  64. package/app/components/common/AddressPicker/index.js +211 -0
  65. package/app/components/common/Card/index.js +19 -0
  66. package/app/components/common/Cell/index.js +381 -0
  67. package/app/components/common/CustomDialog/index.js +120 -0
  68. package/app/components/common/CustomTabBar/index.js +157 -0
  69. package/app/components/common/CustomTabBar_bak/TabBarInput.js +210 -0
  70. package/app/components/common/CustomTabBar_bak/index.js +832 -0
  71. package/app/components/common/DateTimingPicker/index.js +254 -0
  72. package/app/components/common/Dialog/Notify.js +36 -0
  73. package/app/components/common/Dialog/baseDialog.js +146 -0
  74. package/app/components/common/Dialog/index.js +113 -0
  75. package/app/components/common/Dialog/prompt.js +145 -0
  76. package/app/components/common/Dialog/quickSelect.js +54 -0
  77. package/app/components/common/Dialog/select.js +125 -0
  78. package/app/components/common/Dialog/styles.js +167 -0
  79. package/app/components/common/Loading/index.js +71 -0
  80. package/app/components/common/LoginType/index.js +171 -0
  81. package/app/components/common/LoginType/protocol.js +160 -0
  82. package/app/components/common/Notify/index.js +68 -0
  83. package/app/components/common/OnceTouchable/index.js +33 -0
  84. package/app/components/common/PaymentPicker/index.js +264 -0
  85. package/app/components/common/ProductOrderPicker/index.js +524 -0
  86. package/app/components/common/ScreenBackHeader/index.js +144 -0
  87. package/app/components/common/ScrollPicker/index.js +232 -0
  88. package/app/components/common/SelectPicker/index.js +171 -0
  89. package/app/components/common/SmsCodeInput/index.js +93 -0
  90. package/app/components/common/SmsCodeInput/indexNew.js +101 -0
  91. package/app/components/common/Steps/index.js +126 -0
  92. package/app/components/common/Tag/index.js +17 -0
  93. package/app/components/common/Toast/index.js +103 -0
  94. package/app/components/common/WeekDaysPicker/index.js +196 -0
  95. package/app/components/index.js +8 -0
  96. package/app/components/iot/AddDeviceActionSheet/index.js +934 -0
  97. package/app/components/iot/AddressActionSheet/index.js +91 -0
  98. package/app/components/iot/RoomActionSheet/index.js +205 -0
  99. package/app/components/iot/ViewDeviceActionSheet/index.js +834 -0
  100. package/app/components/sheets.js +30 -0
  101. package/app/eventBus/index.js +54 -0
  102. package/app/hooks/checkLogin.js +30 -0
  103. package/app/hooks/shopMessageManager.js +308 -0
  104. package/app/hooks/useAddress.js +179 -0
  105. package/app/hooks/useAddress2.js +587 -0
  106. package/app/hooks/useDebounceFn.js +6 -0
  107. package/app/hooks/useDynamicPackages.js +22 -0
  108. package/app/hooks/useKeyboard.js +25 -0
  109. package/app/hooks/useLatest.js +10 -0
  110. package/app/hooks/useMessageManager.js +368 -0
  111. package/app/hooks/useNavigationFocus.js +19 -0
  112. package/app/hooks/useUser.js +56 -0
  113. package/app/screens/BaseScreen.js +389 -0
  114. package/app/screens/CommonScreens/BindPhoneScreen/index.js +179 -0
  115. package/app/screens/CommonScreens/BossScreen/index.js +138 -0
  116. package/app/screens/CommonScreens/DeviceAnswerDetailScreen/index.js +50 -0
  117. package/app/screens/CommonScreens/DeviceFeedbackScreen/index.js +365 -0
  118. package/app/screens/CommonScreens/EditInvoiceTitleScreen/index.js +279 -0
  119. package/app/screens/CommonScreens/FamilyDetailScreen/index.js +421 -0
  120. package/app/screens/CommonScreens/InvoiceTitleListScreen/index.js +118 -0
  121. package/app/screens/CommonScreens/OperatorSelectScreen/index.js +315 -0
  122. package/app/screens/CommonScreens/PersonalScreen/index.js +348 -0
  123. package/app/screens/CommonScreens/ScanQRCodeScreen/index.js +407 -0
  124. package/app/screens/CommonScreens/TvAlbumScreen/index.js +407 -0
  125. package/app/screens/LoginScreen/OpenLogSheet.js +241 -0
  126. package/app/screens/LoginScreen/index.js +920 -0
  127. package/app/screens/LoginScreen/indexNew.js +1354 -0
  128. package/app/screens/ResePassword/index.js +364 -0
  129. package/app/screens/SbkScreen.js +19 -0
  130. package/app/screens/WebviewScreen.js +41 -0
  131. package/app/storage/index.js +166 -0
  132. package/app/utils/EventEmitter.js +43 -0
  133. package/app/utils/RootNavigation.js +32 -0
  134. package/app/utils/SBK_plugin/convert.js +90 -0
  135. package/app/utils/SBK_plugin/convertStatus.js +250 -0
  136. package/app/utils/SBK_plugin/eventProcess.js +339 -0
  137. package/app/utils/SBK_plugin/index.js +32 -0
  138. package/app/utils/SBK_plugin/ipanelDeviceToSbkDevice.js +68 -0
  139. package/app/utils/SBK_plugin/sbk_defs.js +191 -0
  140. package/app/utils/StyleComposite.js +37 -0
  141. package/app/utils/applyPermissions.js +251 -0
  142. package/app/utils/bundleUpdater.js +46 -0
  143. package/app/utils/common.js +380 -0
  144. package/app/utils/config.js +47 -0
  145. package/app/utils/errCodes.js +3 -0
  146. package/app/utils/homedData.js +57 -0
  147. package/app/utils/http.js +178 -0
  148. package/app/utils/notice.js +15 -0
  149. package/app/utils/priceConversion.js +30 -0
  150. package/app/utils/registerDialog.js +90 -0
  151. package/app/utils/scaleSize.js +12 -0
  152. package/app/utils/soundPlayer.js +85 -0
  153. package/bin/local-dev.js +7 -0
  154. package/index.js +8 -0
  155. package/package.json +18 -0
@@ -0,0 +1,587 @@
1
+ import {useCallback, useEffect, useMemo, useState} from 'react';
2
+
3
+ import {
4
+ getAddressRooms,
5
+ getAddrInfo,
6
+ getDeviceList,
7
+ getRoomDeviceStatuses,
8
+ getSceneModes,
9
+ getDeviceGroupList,
10
+ } from '../api';
11
+
12
+ import storage from '../storage';
13
+ import eventBus, {EVENTS} from '../eventBus';
14
+ import {uniqBy} from 'lodash';
15
+
16
+ let roomDeviceChange = false;
17
+ let roomDeviceStatusChange = false;
18
+ let roomGroupChange = false;
19
+ let roomSceneChange = false;
20
+
21
+ const Hook = () => {
22
+ const [addressList, setAddressList] = useState([]);
23
+ const [activeAddr, setActiveAddr] = useState({});
24
+ const [roomDeviceMap, setRoomDeviceMap] = useState({});
25
+ // 每个房间的设备状态映射
26
+ const [addressRoomMap, setAddressRoomMap] = useState({});
27
+ const [roomsDeviceStatusMap, setRoomsDeviceStatusMap] = useState({});
28
+ const [roomGroupMap, setRoomGroupMap] = useState({});
29
+ const [roomSceneMap, setRoomSceneMap] = useState({});
30
+ const [roomList, setRoomList] = useState([]);
31
+
32
+ // 从本地存储中更新到当前组件内存
33
+ async function updateAddrFromStorage() {
34
+ // todo 数据超时更新
35
+ const addrList = await storage.get('addressList');
36
+ const addr = await storage.get('activeAddr');
37
+ setAddressList(addrList || []);
38
+ setActiveAddr(addr || {});
39
+ }
40
+
41
+ const updateAddrList = async addrList => {
42
+ await storage.set('addressList', addrList);
43
+ setAddressList(addrList);
44
+
45
+ const oldActiveAddr = await storage.get('activeAddr');
46
+ const newActiveAddr = addrList.find(
47
+ addr => oldActiveAddr && addr.address_id === oldActiveAddr.address_id,
48
+ );
49
+
50
+ if (newActiveAddr) {
51
+ updateActiveAddr(newActiveAddr);
52
+ return newActiveAddr;
53
+ } else {
54
+ const defaultAddr = addrList[0] ? addrList[0] : {};
55
+ eventBus.emit(EVENTS.FAMILY.CHANGE, defaultAddr);
56
+ updateActiveAddr(defaultAddr);
57
+ return defaultAddr;
58
+ }
59
+ };
60
+
61
+ const updateActiveAddr = addr => {
62
+ setActiveAddr(addr);
63
+ storage.set('activeAddr', addr);
64
+ };
65
+
66
+ const mapModel = (brand, model) => {
67
+ /* 兼容存量 start */
68
+ if (brand === 'SQ' && model === 'Flight') {
69
+ return 'FLI17131';
70
+ }
71
+ if (brand === 'YGZM' && model === 'Tlight') {
72
+ return 'DLI19121';
73
+ }
74
+ if (brand === 'YHWL' && model === 'Tlight') {
75
+ return 'DLIIP121';
76
+ }
77
+ if (brand === 'YHWL' && model === 'SIL500B1') {
78
+ return 'SLIIP121';
79
+ }
80
+ if (brand === 'dooya' && model === 'ELCEC001') {
81
+ return 'ELC22011';
82
+ }
83
+ if (brand === 'YHWL' && model === 'Dlight') {
84
+ return 'DLIIP121';
85
+ }
86
+ if (brand === 'merach' && model === 'IRMIR101') {
87
+ return 'IRM24101';
88
+ }
89
+ if (brand === 'merach' && model === 'ISR12071') {
90
+ return 'ISR24101';
91
+ }
92
+ /* 兼容存量 end */
93
+
94
+ return model;
95
+ };
96
+
97
+ const mapAddrList = addrList => {
98
+ addrList.forEach(address => {
99
+ const roomlist = address.room_list || [];
100
+ roomlist.forEach(room => {
101
+ const deviceList = room.device_list || [];
102
+ deviceList.forEach(device => {
103
+ device.extend.model = mapModel(
104
+ device.extend?.brand,
105
+ device.extend?.model,
106
+ );
107
+ });
108
+ });
109
+ });
110
+ };
111
+
112
+ // 从网络更新到本地存储和内存
113
+ const updateAddrFromNetwork = useCallback(async () => {
114
+ try {
115
+ const res = await getAddrInfo({detail: false});
116
+ const addrList = res?.result?.address_list || [];
117
+ mapAddrList(addrList);
118
+ const newActiveAddr = await updateAddrList(addrList);
119
+ return {
120
+ addrList,
121
+ newActiveAddr,
122
+ };
123
+ } catch (e) {
124
+ console.log('房间数据拉取失败');
125
+ throw e;
126
+ }
127
+ }, []);
128
+
129
+ useEffect(() => {
130
+ // updateAddrFromStorage();
131
+
132
+ // 监听用户家庭切换事件
133
+ eventBus.on(EVENTS.FAMILY.CHANGE, updateActiveAddr);
134
+
135
+ return () => {
136
+ eventBus.off(EVENTS.FAMILY.CHANGE, updateActiveAddr);
137
+ };
138
+ }, []);
139
+
140
+ const getRoomList = useCallback(async address_id => {
141
+ const res = await getAddressRooms({
142
+ address_id,
143
+ }).catch(err => {});
144
+ if (res.code === 0) {
145
+ return res.result.room_list || [];
146
+ }
147
+ return [];
148
+ }, []);
149
+
150
+ const getRoomDeviceList = useCallback(async room_id => {
151
+ const res = await getDeviceList({
152
+ room_id,
153
+ }).catch(err => {
154
+ console.log(err, 'getDeviceList');
155
+ });
156
+ if (res?.code === 0) {
157
+ return res.result || [];
158
+ }
159
+ return [];
160
+ }, []);
161
+
162
+ /**
163
+ * 更新房间设备
164
+ * @param room_id
165
+ * @param force
166
+ * @returns {Promise<boolean|*[]>}
167
+ */
168
+ const updateRoomDevice = async (room_id, force) => {
169
+ if (roomDeviceMap[room_id] && !force) {
170
+ return false;
171
+ }
172
+ console.log('刷新设备');
173
+ roomDeviceChange = true;
174
+ const res = await getDeviceList({
175
+ room_id,
176
+ }).catch(err => {
177
+ console.log(err, 'getDeviceList');
178
+ });
179
+ if (res?.code === 0) {
180
+ return res.result || [];
181
+ }
182
+ return [];
183
+ };
184
+
185
+ /**
186
+ * 更新房间设备状态
187
+ * @param room_id
188
+ * @param force
189
+ * @returns {Promise<{}|boolean|*>}
190
+ */
191
+ const updateDeviceStatuses = async (room_id, force) => {
192
+ if (roomsDeviceStatusMap[room_id] && !force) {
193
+ return false;
194
+ }
195
+ console.log('刷新房间设备状态');
196
+ roomDeviceStatusChange = true;
197
+ const res = await getRoomDeviceStatuses({room_id}).catch(err => {
198
+ console.log(err, 'getRoomDeviceStatuses');
199
+ });
200
+ if (res?.code === 0) {
201
+ return res.result;
202
+ } else {
203
+ return {};
204
+ }
205
+ };
206
+
207
+ /**
208
+ * 更新房间设备分组
209
+ * @param room_id
210
+ * @param force
211
+ * @returns {Promise<(*&{extend: *&{model: string|*}, on: boolean, status: {color: number, bright: number}})[]|boolean|*[]>}
212
+ */
213
+ const updateDeviceGroup = async (room_id, force) => {
214
+ if (room_id === 'all') {
215
+ return;
216
+ }
217
+ if (roomGroupMap[room_id] && !force) {
218
+ return false;
219
+ }
220
+ console.log('刷新房间分组');
221
+ roomGroupChange = true;
222
+ const res = await getDeviceGroupList({
223
+ room_id,
224
+ });
225
+ if (res.code === 0) {
226
+ const data = (res.result || []).map(item => {
227
+ return {
228
+ ...item,
229
+ extend: {
230
+ ...item.extend,
231
+ model: mapModel(item.extend?.brand, item.extend?.model),
232
+ },
233
+ on: false,
234
+ status: {
235
+ bright: 50,
236
+ color: 50,
237
+ },
238
+ };
239
+ });
240
+ return data;
241
+ } else {
242
+ return [];
243
+ }
244
+ };
245
+
246
+ /**
247
+ * 更新房间场景
248
+ * @param room_id
249
+ * @param force
250
+ * @returns {Promise<boolean|*[]>}
251
+ */
252
+ const updateRoomScene = async (room_id, force) => {
253
+ if (room_id === 'all') {
254
+ return;
255
+ }
256
+ if (roomSceneMap[room_id] && !force) {
257
+ return false;
258
+ }
259
+ console.log('刷新房间场景');
260
+ roomSceneChange = true;
261
+ const res = await getSceneModes({
262
+ userbins_id: 1,
263
+ room_id,
264
+ });
265
+ if (res.code === 0) {
266
+ const data = res.result || [];
267
+ if (data.length % 2 !== 0) {
268
+ data.push(null);
269
+ }
270
+ return data;
271
+ } else {
272
+ return [];
273
+ }
274
+ };
275
+
276
+ /**
277
+ *
278
+ * @param refreshAddress
279
+ * @param addressId
280
+ * @param refreshRoom 是否刷新房间列表
281
+ * @param roomId 当前房间
282
+ * @param force 是否强制刷新房间数据
283
+ * @param refreshDevice 是否刷新房间设备
284
+ * @param refreshDeviceStatus
285
+ * @param refreshDeviceGroup
286
+ * @param refreshDeviceScene
287
+ * @param rooms 需要刷新数据的房间id列表
288
+ * @returns {Promise<void>}
289
+ */
290
+ const updateDataFromNetwork = async ({
291
+ refreshAddress,
292
+ refreshRoom,
293
+ roomId,
294
+ force,
295
+ refreshDevice,
296
+ refreshDeviceStatus,
297
+ refreshDeviceGroup,
298
+ refreshDeviceScene,
299
+ rooms = [],
300
+ defaultData,
301
+ }) => {
302
+ let queryRooms = uniqBy([...rooms], 'room_id');
303
+ roomDeviceChange = false;
304
+ roomDeviceStatusChange = false;
305
+ roomGroupChange = false;
306
+ roomSceneChange = false;
307
+
308
+ // 获取家庭列表和选中家庭
309
+ const oldActiveAddr = await storage.get('activeAddr');
310
+ let actualActiveAddr = oldActiveAddr || {}; // 实际选中家庭
311
+ let addrList = [];
312
+ if (refreshAddress) {
313
+ const addrInfoRes = await getAddrInfo({detail: false}).catch(err => {
314
+ console.log(err, 'getAddrInfo');
315
+ });
316
+ addrList = addrInfoRes?.result?.address_list || [];
317
+ await storage.set('addressList', addrList);
318
+ const newActiveAddr = addrList.find(
319
+ addr => oldActiveAddr && addr.address_id === oldActiveAddr.address_id,
320
+ );
321
+ if (newActiveAddr) {
322
+ actualActiveAddr = newActiveAddr;
323
+ } else if (addrList.length > 0) {
324
+ actualActiveAddr = addrList[0];
325
+ }
326
+ await storage.set('activeAddr', actualActiveAddr || {});
327
+ }
328
+
329
+ // 获取家庭下房间列表
330
+ let actualActiveRoomIndex;
331
+ let newAddressRoomMap = {};
332
+ let roomlist = [];
333
+ if (refreshRoom && actualActiveAddr) {
334
+ const room_list = await getRoomList(actualActiveAddr.address_id);
335
+ if (room_list.length > 0) {
336
+ roomlist.unshift({room_name: '全屋', room_id: 'all'});
337
+ roomlist = [{room_name: '全屋', room_id: 'all'}, ...room_list];
338
+ }
339
+ const oldAddressRoomMap = global.base.addressRoomMap;
340
+ newAddressRoomMap = oldAddressRoomMap || {};
341
+ console.log(room_list, 'updateDataFromNetwork');
342
+ newAddressRoomMap[actualActiveAddr.address_id] = room_list;
343
+ global.base.addressRoomMap = newAddressRoomMap;
344
+ const newActiveRoomIndex = roomlist.findIndex(
345
+ room => room.room_id === roomId,
346
+ );
347
+ if (newActiveRoomIndex === -1) {
348
+ actualActiveRoomIndex = 1;
349
+ } else {
350
+ actualActiveRoomIndex = newActiveRoomIndex;
351
+ }
352
+
353
+ if (
354
+ actualActiveRoomIndex !== 0 &&
355
+ queryRooms.findIndex(
356
+ room => room.room_id === roomlist[actualActiveRoomIndex].room_id,
357
+ ) === -1
358
+ ) {
359
+ queryRooms.push(roomlist[actualActiveRoomIndex]);
360
+ }
361
+
362
+ if (roomId === 'all') {
363
+ queryRooms = [...roomlist.slice(1)];
364
+ }
365
+ }
366
+
367
+ // 获取房间设备
368
+ let newRoomDeviceMap = {};
369
+ if (refreshDevice) {
370
+ const allRoomDeviceList = await Promise.all(
371
+ queryRooms.map(room => {
372
+ return updateRoomDevice(room.room_id, force).catch(err => {});
373
+ }),
374
+ );
375
+ const oldRoomDeviceMap = global.base.roomDeviceMap;
376
+ newRoomDeviceMap = oldRoomDeviceMap || {};
377
+ queryRooms.forEach((room, index) => {
378
+ if (allRoomDeviceList[index]) {
379
+ newRoomDeviceMap[room.room_id] = allRoomDeviceList[index];
380
+ }
381
+ });
382
+ global.base.roomDeviceMap = newRoomDeviceMap;
383
+ }
384
+
385
+ // 获取房间设备状态
386
+ let newRoomDeviceStatusMap = {};
387
+ if (refreshDeviceStatus) {
388
+ const allRoomDeviceStatus = await Promise.all(
389
+ queryRooms.map(room => {
390
+ return updateDeviceStatuses(room.room_id, force).catch(err => {});
391
+ }),
392
+ );
393
+ const oldRoomDeviceStatusMap = global.base.roomDeviceStatusMap;
394
+ newRoomDeviceStatusMap = oldRoomDeviceStatusMap || {};
395
+ queryRooms.forEach((room, index) => {
396
+ if (allRoomDeviceStatus[index]) {
397
+ newRoomDeviceStatusMap[room.room_id] = allRoomDeviceStatus[index];
398
+ }
399
+ });
400
+ global.base.roomDeviceStatusMap = newRoomDeviceStatusMap;
401
+ }
402
+
403
+ // 获取房间设备分组
404
+ let newRoomDeviceGroupMap = {};
405
+ if (refreshDeviceGroup) {
406
+ const allRoomDeviceGroup = await Promise.all(
407
+ queryRooms.map(room => {
408
+ return updateDeviceGroup(room.room_id, force).catch(err => {});
409
+ }),
410
+ );
411
+
412
+ const oldRoomDeviceGroupMap = global.base.roomDeviceGroupMap;
413
+ newRoomDeviceGroupMap = oldRoomDeviceGroupMap || {};
414
+ queryRooms.forEach((room, index) => {
415
+ if (allRoomDeviceGroup[index]) {
416
+ newRoomDeviceGroupMap[room.room_id] = allRoomDeviceGroup[index];
417
+ }
418
+ });
419
+ global.base.roomDeviceGroupMap = newRoomDeviceGroupMap;
420
+ }
421
+
422
+ // 获取房间设备场景
423
+ let newRoomDeviceSceneMap = {};
424
+ if (refreshDeviceScene) {
425
+ const allRoomDeviceScene = await Promise.all(
426
+ queryRooms.map(room => {
427
+ return updateRoomScene(room.room_id, force).catch(err => {});
428
+ }),
429
+ );
430
+ const oldRoomDeviceSceneMap = global.base.roomDeviceSceneMap;
431
+ newRoomDeviceSceneMap = oldRoomDeviceSceneMap || {};
432
+ queryRooms.forEach((room, index) => {
433
+ if (allRoomDeviceScene[index]) {
434
+ newRoomDeviceSceneMap[room.room_id] = allRoomDeviceScene[index];
435
+ }
436
+ });
437
+ global.base.roomDeviceSceneMap = newRoomDeviceSceneMap;
438
+ }
439
+
440
+ if (refreshAddress) {
441
+ setAddressList(addrList);
442
+ if (actualActiveAddr.address_id !== activeAddr.address_id) {
443
+ eventBus.emit(EVENTS.FAMILY.CHANGE, actualActiveAddr);
444
+ }
445
+ }
446
+
447
+ if (refreshRoom && actualActiveAddr) {
448
+ setAddressRoomMap({
449
+ ...newAddressRoomMap,
450
+ });
451
+ setRoomList(roomlist);
452
+ }
453
+
454
+ if (roomDeviceChange || defaultData?.roomDeviceMap) {
455
+ setRoomDeviceMap({
456
+ ...defaultData?.roomDeviceMap,
457
+ ...newRoomDeviceMap,
458
+ });
459
+ }
460
+
461
+ if (roomDeviceStatusChange) {
462
+ setRoomsDeviceStatusMap({
463
+ ...newRoomDeviceStatusMap,
464
+ });
465
+ }
466
+
467
+ if (roomGroupChange) {
468
+ setRoomGroupMap({
469
+ ...newRoomDeviceGroupMap,
470
+ });
471
+ }
472
+
473
+ if (roomSceneChange) {
474
+ setRoomSceneMap({
475
+ ...newRoomDeviceSceneMap,
476
+ });
477
+ }
478
+
479
+ // return {
480
+ // roomList,
481
+ // roomIndex: actualActiveRoomIndex,
482
+ // };
483
+ };
484
+
485
+ const updateRoomDataFromStorage = async ({
486
+ refreshAddress,
487
+ refreshRoom,
488
+ refreshDevice,
489
+ refreshDeviceStatus,
490
+ refreshDeviceGroup,
491
+ refreshDeviceScene,
492
+ }) => {
493
+ const addrList = await storage.get('addressList');
494
+ const addr = await storage.get('activeAddr');
495
+ const newAddressRoomMap = global.base.addressRoomMap;
496
+ const newRoomDeviceMap = global.base.roomDeviceMap;
497
+ const newRoomDeviceStatusMap = global.base.roomDeviceStatusMap;
498
+ const newRoomDeviceGroupMap = global.base.roomDeviceGroupMap;
499
+ const newRoomDeviceSceneMap = global.base.roomDeviceSceneMap;
500
+ if (refreshAddress) {
501
+ setAddressList(addrList || []);
502
+ setActiveAddr(addr || {});
503
+ }
504
+ if (refreshRoom) {
505
+ setAddressRoomMap(newAddressRoomMap || {});
506
+ if (newAddressRoomMap && addr) {
507
+ const room_list = newAddressRoomMap[addr.address_id] || [];
508
+ console.log(room_list, 'room_list');
509
+ setRoomList(
510
+ room_list.length > 0
511
+ ? [{room_name: '全屋', room_id: 'all'}].concat(room_list)
512
+ : [],
513
+ );
514
+ }
515
+ }
516
+ if (refreshDevice) {
517
+ setRoomDeviceMap(newRoomDeviceMap || {});
518
+ }
519
+ if (refreshDeviceStatus) {
520
+ setRoomsDeviceStatusMap(newRoomDeviceStatusMap || {});
521
+ }
522
+ if (refreshDeviceGroup) {
523
+ setRoomGroupMap(newRoomDeviceGroupMap || {});
524
+ }
525
+ if (refreshDeviceScene) {
526
+ setRoomSceneMap(newRoomDeviceSceneMap || {});
527
+ }
528
+ };
529
+
530
+ const currentRoomList = useMemo(() => {
531
+ return roomList.slice(1);
532
+ }, [roomList]);
533
+
534
+ // 更新所有家庭
535
+ const updateAllRoomFromNetwork = async () => {
536
+ const res = await getAddrInfo().catch(err => {});
537
+ const addrList = res?.result?.address_list || [];
538
+ const newAddressRoomMap = {};
539
+ const newRoomDeviceMap = {};
540
+ addrList.forEach(addr => {
541
+ const room_list = addr.room_list || [];
542
+ newAddressRoomMap[addr.address_id] = room_list.map(room => {
543
+ newRoomDeviceMap[room.room_id] = room.device_list || [];
544
+ return {
545
+ ...room,
546
+ device_list: undefined,
547
+ };
548
+ });
549
+ });
550
+ const newAddrList = addrList.map(addr => {
551
+ return {
552
+ ...addr,
553
+ room_list: undefined,
554
+ };
555
+ });
556
+ await storage.set('addressList', newAddrList);
557
+ global.base.addressRoomMap = newAddressRoomMap;
558
+ global.base.roomDeviceMap = newRoomDeviceMap;
559
+ setAddressList(newAddrList);
560
+ setAddressRoomMap(newAddressRoomMap);
561
+ setRoomDeviceMap(newRoomDeviceMap);
562
+ };
563
+
564
+ return {
565
+ addressList,
566
+ activeAddr,
567
+ setActiveAddr,
568
+ updateAllRoomFromNetwork,
569
+ updateDataFromNetwork,
570
+ updateRoomDataFromStorage,
571
+ updateAddrFromNetwork,
572
+ updateAddrFromStorage,
573
+ getRoomList,
574
+ getRoomDeviceList,
575
+ roomList,
576
+ currentRoomList,
577
+ addressRoomMap,
578
+ roomDeviceMap,
579
+ roomsDeviceStatusMap,
580
+ setRoomsDeviceStatusMap,
581
+ roomGroupMap,
582
+ setRoomGroupMap,
583
+ roomSceneMap,
584
+ };
585
+ };
586
+
587
+ export default Hook;
@@ -0,0 +1,6 @@
1
+ import {useCallback} from 'react';
2
+ import {debounce} from 'lodash';
3
+
4
+ export default (fn, wait = 500) => {
5
+ return useCallback(debounce(fn, wait), []);
6
+ };
@@ -0,0 +1,22 @@
1
+ import React, {useState, useCallback} from 'react';
2
+
3
+ const useDynamicPackages = () => {
4
+ const [DynamicStackScreens, setDynamicScreens] = useState({});
5
+
6
+ const initEvent = useCallback(() => {
7
+ const addDynamicScreens = screens => {
8
+ setDynamicScreens({
9
+ ...DynamicStackScreens,
10
+ ...screens,
11
+ });
12
+ };
13
+ global.base.eventBus.removeAllListeners('addDynamicScreens');
14
+ global.base.eventBus.addListener('addDynamicScreens', addDynamicScreens);
15
+ }, [DynamicStackScreens]);
16
+
17
+ initEvent();
18
+
19
+ return {DynamicStackScreens};
20
+ };
21
+
22
+ export default useDynamicPackages;
@@ -0,0 +1,25 @@
1
+ import {useEffect, useState} from 'react';
2
+ import {Keyboard} from 'react-native';
3
+
4
+ export default () => {
5
+ const [keyboardShow, setKeyboardShow] = useState(false);
6
+
7
+ useEffect(() => {
8
+ const keyboardDidShow = Keyboard.addListener('keyboardDidShow', () => {
9
+ console.log('keyboardWillShow');
10
+ setKeyboardShow(true);
11
+ });
12
+ const keyboardDidHide = Keyboard.addListener('keyboardDidHide', () => {
13
+ console.log('keyboardDidHide');
14
+ setKeyboardShow(false);
15
+ });
16
+
17
+ return () => {
18
+ keyboardDidShow.remove();
19
+ keyboardDidHide.remove();
20
+ };
21
+ }, []);
22
+ return {
23
+ keyboardShow,
24
+ };
25
+ };
@@ -0,0 +1,10 @@
1
+ import {useRef} from 'react';
2
+
3
+ function useLatest(value) {
4
+ const ref = useRef(value);
5
+ ref.current = value;
6
+
7
+ return ref;
8
+ }
9
+
10
+ export default useLatest;