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.
- package/app/.local_dev/DemoPage.js +46 -0
- package/app/.local_dev/env.js +1 -0
- package/app/.local_dev/polyfill.js +83 -0
- package/app/App.js +485 -0
- package/app/api/homedApi.js +42 -0
- package/app/api/index.js +2 -0
- package/app/api/ipanelCloudApi.js +796 -0
- package/app/assets/img/add.png +0 -0
- package/app/assets/img/add_img.png +0 -0
- package/app/assets/img/album.png +0 -0
- package/app/assets/img/album2.png +0 -0
- package/app/assets/img/album3.png +0 -0
- package/app/assets/img/album@2x.png +0 -0
- package/app/assets/img/album@3x.png +0 -0
- package/app/assets/img/audioRecordBar.png +0 -0
- package/app/assets/img/bootom_bar_bg.png +0 -0
- package/app/assets/img/close.png +0 -0
- package/app/assets/img/computer.png +0 -0
- package/app/assets/img/confirm.png +0 -0
- package/app/assets/img/delete_pic.png +0 -0
- package/app/assets/img/disabled.png +0 -0
- package/app/assets/img/goBack.png +0 -0
- package/app/assets/img/goBack2.png +0 -0
- package/app/assets/img/ischeck.png +0 -0
- package/app/assets/img/launch_bg.png +0 -0
- package/app/assets/img/launch_bg_panyu.png +0 -0
- package/app/assets/img/launch_logo.png +0 -0
- package/app/assets/img/launch_logo_panyu.png +0 -0
- package/app/assets/img/launch_text.png +0 -0
- package/app/assets/img/launch_text_panyu.png +0 -0
- package/app/assets/img/link.png +0 -0
- package/app/assets/img/login_bg.png +0 -0
- package/app/assets/img/login_bg_new.png +0 -0
- package/app/assets/img/login_left.png +0 -0
- package/app/assets/img/login_right.png +0 -0
- package/app/assets/img/nocheck.png +0 -0
- package/app/assets/img/personal.png +0 -0
- package/app/assets/img/photo.png +0 -0
- package/app/assets/img/photo@2x.png +0 -0
- package/app/assets/img/photo@3x.png +0 -0
- package/app/assets/img/protocol_checked.png +0 -0
- package/app/assets/img/qiehuan.png +0 -0
- package/app/assets/img/scan_border_bottom_left.png +0 -0
- package/app/assets/img/scan_border_bottom_right.png +0 -0
- package/app/assets/img/scan_border_top_left.png +0 -0
- package/app/assets/img/scan_border_top_right.png +0 -0
- package/app/assets/img/scan_move.png +0 -0
- package/app/assets/img/szjt.png +0 -0
- package/app/assets/img/tab.png +0 -0
- package/app/assets/img/tykz.png +0 -0
- package/app/assets/img/update_bg.png +0 -0
- package/app/assets/img/video.png +0 -0
- package/app/assets/img/video@2x.png +0 -0
- package/app/assets/img/video@3x.png +0 -0
- package/app/assets/img/worker.png +0 -0
- package/app/assets/img/wx.png +0 -0
- package/app/assets/img/ykq.png +0 -0
- package/app/assets/img/zfb.png +0 -0
- package/app/base.js +342 -0
- package/app/components/VersionUpdateConfirm.js +117 -0
- package/app/components/common/AccordionCell/index.js +67 -0
- package/app/components/common/ActionPicker/BasicPicker.js +136 -0
- package/app/components/common/ActionPicker/index.js +106 -0
- package/app/components/common/AddressPicker/index.js +211 -0
- package/app/components/common/Card/index.js +19 -0
- package/app/components/common/Cell/index.js +381 -0
- package/app/components/common/CustomDialog/index.js +120 -0
- package/app/components/common/CustomTabBar/index.js +157 -0
- package/app/components/common/CustomTabBar_bak/TabBarInput.js +210 -0
- package/app/components/common/CustomTabBar_bak/index.js +832 -0
- package/app/components/common/DateTimingPicker/index.js +254 -0
- package/app/components/common/Dialog/Notify.js +36 -0
- package/app/components/common/Dialog/baseDialog.js +146 -0
- package/app/components/common/Dialog/index.js +113 -0
- package/app/components/common/Dialog/prompt.js +145 -0
- package/app/components/common/Dialog/quickSelect.js +54 -0
- package/app/components/common/Dialog/select.js +125 -0
- package/app/components/common/Dialog/styles.js +167 -0
- package/app/components/common/Loading/index.js +71 -0
- package/app/components/common/LoginType/index.js +171 -0
- package/app/components/common/LoginType/protocol.js +160 -0
- package/app/components/common/Notify/index.js +68 -0
- package/app/components/common/OnceTouchable/index.js +33 -0
- package/app/components/common/PaymentPicker/index.js +264 -0
- package/app/components/common/ProductOrderPicker/index.js +524 -0
- package/app/components/common/ScreenBackHeader/index.js +144 -0
- package/app/components/common/ScrollPicker/index.js +232 -0
- package/app/components/common/SelectPicker/index.js +171 -0
- package/app/components/common/SmsCodeInput/index.js +93 -0
- package/app/components/common/SmsCodeInput/indexNew.js +101 -0
- package/app/components/common/Steps/index.js +126 -0
- package/app/components/common/Tag/index.js +17 -0
- package/app/components/common/Toast/index.js +103 -0
- package/app/components/common/WeekDaysPicker/index.js +196 -0
- package/app/components/index.js +8 -0
- package/app/components/iot/AddDeviceActionSheet/index.js +934 -0
- package/app/components/iot/AddressActionSheet/index.js +91 -0
- package/app/components/iot/RoomActionSheet/index.js +205 -0
- package/app/components/iot/ViewDeviceActionSheet/index.js +834 -0
- package/app/components/sheets.js +30 -0
- package/app/eventBus/index.js +54 -0
- package/app/hooks/checkLogin.js +30 -0
- package/app/hooks/shopMessageManager.js +308 -0
- package/app/hooks/useAddress.js +179 -0
- package/app/hooks/useAddress2.js +587 -0
- package/app/hooks/useDebounceFn.js +6 -0
- package/app/hooks/useDynamicPackages.js +22 -0
- package/app/hooks/useKeyboard.js +25 -0
- package/app/hooks/useLatest.js +10 -0
- package/app/hooks/useMessageManager.js +368 -0
- package/app/hooks/useNavigationFocus.js +19 -0
- package/app/hooks/useUser.js +56 -0
- package/app/screens/BaseScreen.js +389 -0
- package/app/screens/CommonScreens/BindPhoneScreen/index.js +179 -0
- package/app/screens/CommonScreens/BossScreen/index.js +138 -0
- package/app/screens/CommonScreens/DeviceAnswerDetailScreen/index.js +50 -0
- package/app/screens/CommonScreens/DeviceFeedbackScreen/index.js +365 -0
- package/app/screens/CommonScreens/EditInvoiceTitleScreen/index.js +279 -0
- package/app/screens/CommonScreens/FamilyDetailScreen/index.js +421 -0
- package/app/screens/CommonScreens/InvoiceTitleListScreen/index.js +118 -0
- package/app/screens/CommonScreens/OperatorSelectScreen/index.js +315 -0
- package/app/screens/CommonScreens/PersonalScreen/index.js +348 -0
- package/app/screens/CommonScreens/ScanQRCodeScreen/index.js +407 -0
- package/app/screens/CommonScreens/TvAlbumScreen/index.js +407 -0
- package/app/screens/LoginScreen/OpenLogSheet.js +241 -0
- package/app/screens/LoginScreen/index.js +920 -0
- package/app/screens/LoginScreen/indexNew.js +1354 -0
- package/app/screens/ResePassword/index.js +364 -0
- package/app/screens/SbkScreen.js +19 -0
- package/app/screens/WebviewScreen.js +41 -0
- package/app/storage/index.js +166 -0
- package/app/utils/EventEmitter.js +43 -0
- package/app/utils/RootNavigation.js +32 -0
- package/app/utils/SBK_plugin/convert.js +90 -0
- package/app/utils/SBK_plugin/convertStatus.js +250 -0
- package/app/utils/SBK_plugin/eventProcess.js +339 -0
- package/app/utils/SBK_plugin/index.js +32 -0
- package/app/utils/SBK_plugin/ipanelDeviceToSbkDevice.js +68 -0
- package/app/utils/SBK_plugin/sbk_defs.js +191 -0
- package/app/utils/StyleComposite.js +37 -0
- package/app/utils/applyPermissions.js +251 -0
- package/app/utils/bundleUpdater.js +46 -0
- package/app/utils/common.js +380 -0
- package/app/utils/config.js +47 -0
- package/app/utils/errCodes.js +3 -0
- package/app/utils/homedData.js +57 -0
- package/app/utils/http.js +178 -0
- package/app/utils/notice.js +15 -0
- package/app/utils/priceConversion.js +30 -0
- package/app/utils/registerDialog.js +90 -0
- package/app/utils/scaleSize.js +12 -0
- package/app/utils/soundPlayer.js +85 -0
- package/bin/local-dev.js +7 -0
- package/index.js +8 -0
- package/package.json +18 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import {StyleSheet, View, Text, Button} from 'react-native';
|
|
3
|
+
|
|
4
|
+
const {storage, replace} = global.base;
|
|
5
|
+
|
|
6
|
+
const TestPage = ({navigation}) => {
|
|
7
|
+
const onPress = () => {
|
|
8
|
+
global.base.navigateModule({
|
|
9
|
+
operatorId: 'ipanel',
|
|
10
|
+
moduleName: 'app',
|
|
11
|
+
});
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
const handleLogout = async () => {
|
|
15
|
+
await storage.set('accessToken', null);
|
|
16
|
+
await storage.set('homedAccessToken', null);
|
|
17
|
+
await storage.set('accountType', null);
|
|
18
|
+
await storage.set('addressRoomMap', null);
|
|
19
|
+
await storage.set('roomDeviceMap', null);
|
|
20
|
+
await storage.set('roomDeviceStatusMap', null);
|
|
21
|
+
await storage.set('roomDeviceGroupMap', null);
|
|
22
|
+
await storage.set('roomDeviceSceneMap', null);
|
|
23
|
+
// 如果是在tab页的路由,当前栈路由历史只有首页Home调用会报错,如果是从智能客服进入“我的”,退出登录需要置顶
|
|
24
|
+
if (navigation.getState().type === 'stack') {
|
|
25
|
+
popToTop();
|
|
26
|
+
}
|
|
27
|
+
replace('Login', {
|
|
28
|
+
skip: true,
|
|
29
|
+
});
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
return (
|
|
33
|
+
<View>
|
|
34
|
+
<View>
|
|
35
|
+
<Text>退出登录</Text>
|
|
36
|
+
</View>
|
|
37
|
+
<Text>TestPage</Text>
|
|
38
|
+
<Button onPress={onPress} title="点击预览app全屏"></Button>
|
|
39
|
+
<Button onPress={handleLogout} title="退出登录"></Button>
|
|
40
|
+
</View>
|
|
41
|
+
);
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
const styles = StyleSheet.create({});
|
|
45
|
+
|
|
46
|
+
export default TestPage;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default 'production';
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import {AppRegistry, NativeModules} from 'react-native';
|
|
2
|
+
|
|
3
|
+
// isMultiBundle:是否为分包加载方式(不是的话就是不分包方式,用于本地调试)
|
|
4
|
+
const isLocalDev = !NativeModules.RNToNativeEmitter?.isMultiBundle;
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* 动态加载业务包
|
|
8
|
+
* @param {object} data 要加载的业务包列表对象,格式如: { packages: [...] }
|
|
9
|
+
* @param {*} packageLoadCallback 每次一个业务包处理(加载成功或失败)完成时触发该回调函数
|
|
10
|
+
* @returns 全部业务包处理完成的promise,全部加载完成时promise返回true,否则返回加载失败的模块数组
|
|
11
|
+
*/
|
|
12
|
+
function loadPackages(data, packageLoadCallback) {
|
|
13
|
+
return new Promise((resolve, reject) => {
|
|
14
|
+
if (!isLocalDev) {
|
|
15
|
+
const load = pack => {
|
|
16
|
+
return new Promise(_reslove => {
|
|
17
|
+
NativeModules.RNToNativeEmitter.loadPackage(
|
|
18
|
+
{
|
|
19
|
+
package: pack,
|
|
20
|
+
},
|
|
21
|
+
function (error, packageName) {
|
|
22
|
+
console.log(error, packageName);
|
|
23
|
+
|
|
24
|
+
typeof packageLoadCallback === 'function' &&
|
|
25
|
+
packageLoadCallback(error, packageName);
|
|
26
|
+
|
|
27
|
+
_reslove({
|
|
28
|
+
error,
|
|
29
|
+
packageName,
|
|
30
|
+
});
|
|
31
|
+
},
|
|
32
|
+
);
|
|
33
|
+
});
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
Promise.all(data.packages.map(pack => load(pack))).then(datas => {
|
|
37
|
+
const errors = datas.filter(item => !!item.error);
|
|
38
|
+
if (errors.length > 0) {
|
|
39
|
+
reject(errors);
|
|
40
|
+
} else {
|
|
41
|
+
resolve(true);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
} else {
|
|
45
|
+
// 本地开发环境直接resolve
|
|
46
|
+
resolve(true);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// 根据业务包的组件名异步获取业务包组件,返回一个promise
|
|
52
|
+
async function getRemoteComponentByName(componentName) {
|
|
53
|
+
if (!isLocalDev) {
|
|
54
|
+
return AppRegistry.getRunnable(componentName).componentProvider();
|
|
55
|
+
} else {
|
|
56
|
+
try {
|
|
57
|
+
// 用于本地开发测试,每加一个业务包这里都需要加一下
|
|
58
|
+
switch (componentName) {
|
|
59
|
+
case 'tvShare':
|
|
60
|
+
return (await import('../app_tvShare/App.js')).default;
|
|
61
|
+
case 'smartHome':
|
|
62
|
+
return (await import('../app_smartHome/App.js')).default;
|
|
63
|
+
case 'shop':
|
|
64
|
+
return (await import('../app_shop/App.js')).default;
|
|
65
|
+
case 'panYuGovData':
|
|
66
|
+
return (await import('../app_panYuGovData/App.js')).default;
|
|
67
|
+
case 'myProfile':
|
|
68
|
+
return (await import('../app_myProfile/App.js')).default;
|
|
69
|
+
case 'adg':
|
|
70
|
+
return (await import('../app_adg/App.js')).default;
|
|
71
|
+
case 'orderFood':
|
|
72
|
+
return (await import('../app_orderFood/App.js')).default;
|
|
73
|
+
case 'apartment':
|
|
74
|
+
return (await import('../app_apartment/App.js')).default;
|
|
75
|
+
}
|
|
76
|
+
} catch (e) {
|
|
77
|
+
console.log(componentName, e);
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export {loadPackages, getRemoteComponentByName};
|
package/app/App.js
ADDED
|
@@ -0,0 +1,485 @@
|
|
|
1
|
+
import React, {useState, useEffect, useMemo} from 'react';
|
|
2
|
+
import {
|
|
3
|
+
View,
|
|
4
|
+
LogBox,
|
|
5
|
+
Platform,
|
|
6
|
+
NativeModules,
|
|
7
|
+
StatusBar,
|
|
8
|
+
StyleSheet,
|
|
9
|
+
TouchableWithoutFeedback,
|
|
10
|
+
Keyboard,
|
|
11
|
+
AppState,
|
|
12
|
+
NativeEventEmitter,
|
|
13
|
+
DeviceEventEmitter,
|
|
14
|
+
} from 'react-native';
|
|
15
|
+
import {NavigationContainer} from '@react-navigation/native';
|
|
16
|
+
import {createStackNavigator} from '@react-navigation/stack';
|
|
17
|
+
import {SheetProvider} from 'react-native-actions-sheet';
|
|
18
|
+
import DeviceInfo from 'react-native-device-info';
|
|
19
|
+
import {SafeAreaProvider, SafeAreaView} from 'react-native-safe-area-context';
|
|
20
|
+
import VersionUpdateConfirm from './components/VersionUpdateConfirm';
|
|
21
|
+
// import NetInfo from '@react-native-community/netinfo';
|
|
22
|
+
|
|
23
|
+
// 重要:base.js需放在一切自定义代码之前初始化
|
|
24
|
+
import './base.js';
|
|
25
|
+
// 版本升级相关代码
|
|
26
|
+
import './utils/bundleUpdater';
|
|
27
|
+
// 对接声必可屏幕
|
|
28
|
+
import './utils/SBK_plugin';
|
|
29
|
+
|
|
30
|
+
// 注册actionSheet组件
|
|
31
|
+
import './components/sheets.js';
|
|
32
|
+
|
|
33
|
+
import ModuleConfig from '../multibundler/ModuleIdConfig.json';
|
|
34
|
+
import BundleConfig from '../bundleconfig.json';
|
|
35
|
+
import Loading from './components/common/Loading';
|
|
36
|
+
import Toast from './components/common/Toast';
|
|
37
|
+
import Dialog from './components/common/Dialog';
|
|
38
|
+
import Notify from './components/common/Notify';
|
|
39
|
+
import storage from './storage';
|
|
40
|
+
|
|
41
|
+
import {navigationRef} from './utils/RootNavigation';
|
|
42
|
+
import checkLogin from './hooks/checkLogin';
|
|
43
|
+
import {getModuleVersionInfo} from './api/';
|
|
44
|
+
import {appReport} from './utils/common';
|
|
45
|
+
|
|
46
|
+
// 基础导航页、登录页
|
|
47
|
+
import BaseScreen from './screens/BaseScreen';
|
|
48
|
+
import LoginScreen from './screens/LoginScreen';
|
|
49
|
+
import NewLoginScreen from './screens/LoginScreen/indexNew';
|
|
50
|
+
import ResePasswordScreen from './screens/ResePassword';
|
|
51
|
+
import SbkScreen from './screens/SbkScreen';
|
|
52
|
+
|
|
53
|
+
import eventBus, {EVENTS} from './eventBus';
|
|
54
|
+
|
|
55
|
+
import useDynamicPackages from './hooks/useDynamicPackages';
|
|
56
|
+
import useAddress from './hooks/useAddress';
|
|
57
|
+
import useAddress2 from './hooks/useAddress2';
|
|
58
|
+
import useNavigationFocus from './hooks/useNavigationFocus';
|
|
59
|
+
import useLatest from './hooks/useLatest';
|
|
60
|
+
import useDebounceFn from './hooks/useDebounceFn';
|
|
61
|
+
import useUser from './hooks/useUser';
|
|
62
|
+
import useKeyboard from './hooks/useKeyboard';
|
|
63
|
+
|
|
64
|
+
LogBox.ignoreLogs([
|
|
65
|
+
'ViewPropTypes will be removed',
|
|
66
|
+
'ColorPropType will be removed',
|
|
67
|
+
]);
|
|
68
|
+
|
|
69
|
+
// base hooks, 内部可能依赖基础的base函数,因此放在基础base初始化之后
|
|
70
|
+
global.base.hooks = {
|
|
71
|
+
useAddress,
|
|
72
|
+
useAddress2,
|
|
73
|
+
useNavigationFocus,
|
|
74
|
+
useLatest,
|
|
75
|
+
useDebounceFn,
|
|
76
|
+
useUser,
|
|
77
|
+
useKeyboard,
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
// 公共页面
|
|
81
|
+
import WebviewScreen from './screens/WebviewScreen';
|
|
82
|
+
import ScanQRCodeScreen from './screens/CommonScreens/ScanQRCodeScreen';
|
|
83
|
+
import OperatorSelectScreen from './screens/CommonScreens/OperatorSelectScreen';
|
|
84
|
+
import EditInvoiceTitleScreen from './screens/CommonScreens/EditInvoiceTitleScreen';
|
|
85
|
+
import InvoiceTitleListScreen from './screens/CommonScreens/InvoiceTitleListScreen';
|
|
86
|
+
import TvAlbumScreen from './screens/CommonScreens/TvAlbumScreen';
|
|
87
|
+
import DeviceFeedbackScreen from './screens/CommonScreens/DeviceFeedbackScreen';
|
|
88
|
+
import DeviceAnswerDetailScreen from './screens/CommonScreens/DeviceAnswerDetailScreen';
|
|
89
|
+
|
|
90
|
+
// Boss绑定页面
|
|
91
|
+
import BindBossScreen from './screens/CommonScreens/BossScreen';
|
|
92
|
+
|
|
93
|
+
const Stack = createStackNavigator();
|
|
94
|
+
|
|
95
|
+
const envVersion = NativeModules?.RNToNativeEmitter?.serverCluster || 'alpha';
|
|
96
|
+
// const envVersion = 'release';
|
|
97
|
+
|
|
98
|
+
let eventEmitter;
|
|
99
|
+
if (Platform.OS === 'android') {
|
|
100
|
+
// ----yusm:安卓使用DeviceEventEmitter
|
|
101
|
+
eventEmitter = DeviceEventEmitter;
|
|
102
|
+
} else {
|
|
103
|
+
eventEmitter = new NativeEventEmitter(NativeModules.NativeToRNEmitter);
|
|
104
|
+
}
|
|
105
|
+
// 公共 栈路由页面
|
|
106
|
+
const CommonScreens = {
|
|
107
|
+
Home: {
|
|
108
|
+
component: BaseScreen,
|
|
109
|
+
screenOptions: {
|
|
110
|
+
title: '首页',
|
|
111
|
+
headerShown: false,
|
|
112
|
+
includeBottom: true,
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
Login: {
|
|
116
|
+
component:
|
|
117
|
+
DeviceInfo.getBrand() === 'Allwinner' ? LoginScreen : NewLoginScreen,
|
|
118
|
+
screenOptions: {
|
|
119
|
+
title: '登录',
|
|
120
|
+
headerShown: false,
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
ResePasswordScreen: {
|
|
124
|
+
component: ResePasswordScreen,
|
|
125
|
+
screenOptions: {
|
|
126
|
+
title: '重置密码',
|
|
127
|
+
headerShown: false,
|
|
128
|
+
},
|
|
129
|
+
},
|
|
130
|
+
ScanQRCodeScreen: {
|
|
131
|
+
component: ScanQRCodeScreen,
|
|
132
|
+
screenOptions: {
|
|
133
|
+
headerShown: false,
|
|
134
|
+
},
|
|
135
|
+
},
|
|
136
|
+
OperatorSelectScreen: {
|
|
137
|
+
component: OperatorSelectScreen,
|
|
138
|
+
screenOptions: {
|
|
139
|
+
title: '选择运营商',
|
|
140
|
+
headerShown: false,
|
|
141
|
+
},
|
|
142
|
+
},
|
|
143
|
+
InvoiceTitleListScreen: {
|
|
144
|
+
component: InvoiceTitleListScreen,
|
|
145
|
+
screenOptions: {
|
|
146
|
+
title: '发票抬头',
|
|
147
|
+
headerShown: false,
|
|
148
|
+
},
|
|
149
|
+
},
|
|
150
|
+
EditInvoiceTitleScreen: {
|
|
151
|
+
component: EditInvoiceTitleScreen,
|
|
152
|
+
screenOptions: {
|
|
153
|
+
title: '编辑发票抬头',
|
|
154
|
+
headerShown: false,
|
|
155
|
+
},
|
|
156
|
+
},
|
|
157
|
+
WebviewScreen: {
|
|
158
|
+
component: WebviewScreen,
|
|
159
|
+
screenOptions: {
|
|
160
|
+
title: '',
|
|
161
|
+
headerShown: false,
|
|
162
|
+
},
|
|
163
|
+
},
|
|
164
|
+
TvAlbumScreen: {
|
|
165
|
+
component: TvAlbumScreen,
|
|
166
|
+
screenOptions: {
|
|
167
|
+
title: '电视相册',
|
|
168
|
+
},
|
|
169
|
+
},
|
|
170
|
+
DeviceFeedbackScreen: {
|
|
171
|
+
component: DeviceFeedbackScreen,
|
|
172
|
+
screenOptions: {
|
|
173
|
+
title: '帮助与反馈',
|
|
174
|
+
headerShown: false,
|
|
175
|
+
},
|
|
176
|
+
},
|
|
177
|
+
DeviceAnswerDetailScreen: {
|
|
178
|
+
component: DeviceAnswerDetailScreen,
|
|
179
|
+
screenOptions: {
|
|
180
|
+
title: '解答',
|
|
181
|
+
headerShown: false,
|
|
182
|
+
},
|
|
183
|
+
},
|
|
184
|
+
SbkScreen: {
|
|
185
|
+
component: SbkScreen,
|
|
186
|
+
screenOptions: {
|
|
187
|
+
title: '爱家宝',
|
|
188
|
+
headerShown: false,
|
|
189
|
+
},
|
|
190
|
+
},
|
|
191
|
+
BindBossScreen: {
|
|
192
|
+
component: BindBossScreen,
|
|
193
|
+
screenOptions: {
|
|
194
|
+
title: '绑定boss账号',
|
|
195
|
+
headerShown: false,
|
|
196
|
+
},
|
|
197
|
+
},
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
// screen分组
|
|
201
|
+
function StackScreenGroup(screens) {
|
|
202
|
+
return Object.entries(screens).map(([name, {component, screenOptions}]) => (
|
|
203
|
+
<Stack.Screen
|
|
204
|
+
name={name}
|
|
205
|
+
component={component}
|
|
206
|
+
options={screenOptions}
|
|
207
|
+
key={name}
|
|
208
|
+
/>
|
|
209
|
+
));
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// 兜底的底部导航模块
|
|
213
|
+
const initialNavigationPackages = [
|
|
214
|
+
{
|
|
215
|
+
bundleName: 'index.ios.bundle',
|
|
216
|
+
isMain: 1,
|
|
217
|
+
md5: '7284896d821f9e206efc979590561e18',
|
|
218
|
+
moduleName: 'tvShare',
|
|
219
|
+
modulePublishDesc: '电视分享ios',
|
|
220
|
+
upgradeMode: 'force',
|
|
221
|
+
url: 'https://dev.ipanelcloud2.ipanel.cn:50443/jshomeapp/appFiles/packFiles/ipanel/ios/tvShare/v1.0.2/20230601120633/ipanel_ios_tvShare_v1.0.2_20230601120633.zip',
|
|
222
|
+
version: 'v1.0.2',
|
|
223
|
+
},
|
|
224
|
+
{
|
|
225
|
+
bundleName: 'index.ios.bundle',
|
|
226
|
+
isMain: 1,
|
|
227
|
+
md5: '0fd7a6212a7b70baa54ce2a9cc99698b',
|
|
228
|
+
moduleName: 'smartHome',
|
|
229
|
+
modulePublishDesc: '智能家居ios',
|
|
230
|
+
upgradeMode: 'force',
|
|
231
|
+
url: 'https://dev.ipanelcloud2.ipanel.cn:50443/jshomeapp/appFiles/packFiles/ipanel/ios/smartHome/v1.0.2/20230601120752/ipanel_ios_smartHome_v1.0.2_20230601120752.zip',
|
|
232
|
+
version: 'v1.0.2',
|
|
233
|
+
},
|
|
234
|
+
// {
|
|
235
|
+
// bundleName: 'index.ios.bundle',
|
|
236
|
+
// isMain: 1,
|
|
237
|
+
// md5: '5f4d438743465de65384635e05aef6ff',
|
|
238
|
+
// moduleName: 'shop',
|
|
239
|
+
// modulePublishDesc: '商城ios',
|
|
240
|
+
// upgradeMode: 'force',
|
|
241
|
+
// url: 'https://dev.ipanelcloud2.ipanel.cn:50443/jshomeapp/appFiles/packFiles/ipanel/ios/shop/v1.0.2/20230601120912/ipanel_ios_shop_v1.0.2_20230601120912.zip',
|
|
242
|
+
// version: 'v1.0.2',
|
|
243
|
+
// },
|
|
244
|
+
];
|
|
245
|
+
|
|
246
|
+
// 兜底版本
|
|
247
|
+
global.base.initialNavigationPackages = initialNavigationPackages;
|
|
248
|
+
// global.base.navigationPackages = initialNavigationPackages;
|
|
249
|
+
// 从storage取上次的版本
|
|
250
|
+
// const updateNavigationPackagesFromStorage = async flag => {
|
|
251
|
+
// const packages = await global.base.storage.get('base.navigationPackages');
|
|
252
|
+
// if (packages) {
|
|
253
|
+
// global.base.navigationPackages = packages;
|
|
254
|
+
// console.log('成功从本地读取上一次的底部导航模块,flag=', flag);
|
|
255
|
+
// }
|
|
256
|
+
// };
|
|
257
|
+
// updateNavigationPackagesFromStorage(1);
|
|
258
|
+
|
|
259
|
+
const App = () => {
|
|
260
|
+
const {DynamicStackScreens} = useDynamicPackages();
|
|
261
|
+
// 当前页面是否需要包括底部安全区
|
|
262
|
+
const [includeBottom, setIncludeBottom] = useState(false);
|
|
263
|
+
const [versionUpdateConfirmVisible, setVersionUpdateConfirmVisible] =
|
|
264
|
+
useState(false);
|
|
265
|
+
const [latestBaseVersion, setLatestBaseVersion] = useState(null);
|
|
266
|
+
|
|
267
|
+
const allStackScreens = useMemo(() => {
|
|
268
|
+
return {
|
|
269
|
+
...CommonScreens,
|
|
270
|
+
...DynamicStackScreens,
|
|
271
|
+
};
|
|
272
|
+
}, [DynamicStackScreens]);
|
|
273
|
+
|
|
274
|
+
const [isKeyboardVisible, setIsKeyboardVisible] = useState(false);
|
|
275
|
+
|
|
276
|
+
// 更新global.base
|
|
277
|
+
global.base.DynamicStackScreens = DynamicStackScreens;
|
|
278
|
+
|
|
279
|
+
// mounted
|
|
280
|
+
useEffect(() => {
|
|
281
|
+
StatusBar.setBackgroundColor('transparent');
|
|
282
|
+
StatusBar.setBarStyle('dark-content');
|
|
283
|
+
storage.get('accountType').then(res => {
|
|
284
|
+
global.base.accountType = res || 'ajb';
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
const rnToNative = NativeModules.RNToNativeEmitter;
|
|
288
|
+
// 应用通知app可正常显示,页面正常运行了,在componentDidMount 中加
|
|
289
|
+
rnToNative?.notifyApplicationReady({
|
|
290
|
+
moduleName: ModuleConfig[BundleConfig.bundleid].name,
|
|
291
|
+
}); // 不用传参数
|
|
292
|
+
|
|
293
|
+
// 首次进入app登录鉴权
|
|
294
|
+
checkLogin();
|
|
295
|
+
|
|
296
|
+
// 获取最新版本并通知原生平台,由平台判断后弹出升级确认提示
|
|
297
|
+
checkBaseVersion();
|
|
298
|
+
|
|
299
|
+
AppState.addEventListener('change', async nextAppState => {
|
|
300
|
+
console.log('nextAppState', nextAppState);
|
|
301
|
+
if (nextAppState === 'active') {
|
|
302
|
+
appReport('APP_STARTUP');
|
|
303
|
+
}
|
|
304
|
+
});
|
|
305
|
+
|
|
306
|
+
const keyboardDidShowListener = Keyboard.addListener(
|
|
307
|
+
'keyboardDidShow',
|
|
308
|
+
() => {
|
|
309
|
+
setIsKeyboardVisible(true);
|
|
310
|
+
},
|
|
311
|
+
);
|
|
312
|
+
|
|
313
|
+
const keyboardDidHideListener = Keyboard.addListener(
|
|
314
|
+
'keyboardDidHide',
|
|
315
|
+
() => {
|
|
316
|
+
setIsKeyboardVisible(false);
|
|
317
|
+
},
|
|
318
|
+
);
|
|
319
|
+
|
|
320
|
+
const cellularDataStateListener = eventEmitter.addListener(
|
|
321
|
+
'CellularDataState',
|
|
322
|
+
data => {
|
|
323
|
+
console.log(JSON.stringify(data), 'CellularDataState');
|
|
324
|
+
if (data?.state && data?.state !== 0) {
|
|
325
|
+
checkBaseVersion();
|
|
326
|
+
}
|
|
327
|
+
},
|
|
328
|
+
);
|
|
329
|
+
|
|
330
|
+
return () => {
|
|
331
|
+
keyboardDidShowListener.remove();
|
|
332
|
+
keyboardDidHideListener.remove();
|
|
333
|
+
cellularDataStateListener.remove();
|
|
334
|
+
};
|
|
335
|
+
}, []);
|
|
336
|
+
|
|
337
|
+
// 处理屏幕其他部分的触摸事件
|
|
338
|
+
const handleTouchOutside = () => {
|
|
339
|
+
if (isKeyboardVisible) {
|
|
340
|
+
Keyboard.dismiss();
|
|
341
|
+
}
|
|
342
|
+
};
|
|
343
|
+
|
|
344
|
+
const checkBaseVersion = async () => {
|
|
345
|
+
// 当前版本
|
|
346
|
+
const baseVersionInfo = await global.base.getBundleInfo('base');
|
|
347
|
+
if (!baseVersionInfo) {
|
|
348
|
+
return false;
|
|
349
|
+
}
|
|
350
|
+
try {
|
|
351
|
+
const res = await getModuleVersionInfo({
|
|
352
|
+
platform: Platform.OS,
|
|
353
|
+
operatorId: 'ipanel',
|
|
354
|
+
moduleName: 'base',
|
|
355
|
+
});
|
|
356
|
+
if (res.code === 0) {
|
|
357
|
+
const versionInfo = res.data.packages[0];
|
|
358
|
+
const newVersion = Number(
|
|
359
|
+
versionInfo.version.slice(1).replace(/\./g, ''),
|
|
360
|
+
);
|
|
361
|
+
const currentVersion = Number(
|
|
362
|
+
baseVersionInfo.version.slice(1).replace(/\./g, ''),
|
|
363
|
+
);
|
|
364
|
+
if (newVersion > currentVersion) {
|
|
365
|
+
setVersionUpdateConfirmVisible(true);
|
|
366
|
+
setLatestBaseVersion(versionInfo);
|
|
367
|
+
}
|
|
368
|
+
return newVersion > currentVersion;
|
|
369
|
+
}
|
|
370
|
+
} catch (e) {}
|
|
371
|
+
};
|
|
372
|
+
|
|
373
|
+
global.base.checkBaseVersion = checkBaseVersion;
|
|
374
|
+
|
|
375
|
+
// 升级测试
|
|
376
|
+
const onUpdate = versionInfo => {
|
|
377
|
+
const rnToNative = NativeModules.RNToNativeEmitter;
|
|
378
|
+
rnToNative?.selectedInfo({
|
|
379
|
+
packages: [versionInfo],
|
|
380
|
+
operatorId: 'ipanel',
|
|
381
|
+
});
|
|
382
|
+
};
|
|
383
|
+
|
|
384
|
+
const handleStateChange = ({routes}) => {
|
|
385
|
+
const routeName = routes[routes.length - 1].name;
|
|
386
|
+
setIncludeBottom(
|
|
387
|
+
allStackScreens[routeName]?.screenOptions?.includeBottom || false,
|
|
388
|
+
);
|
|
389
|
+
/* 加载之后每次navigate都鉴权一把登录状态(重置密码不需要检测) */
|
|
390
|
+
if (routeName !== 'ResePasswordScreen') {
|
|
391
|
+
checkLogin();
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
// 收起智能客服底部导航+面板
|
|
395
|
+
eventBus.emit(EVENTS.CUSTOM_TAB_BAR.HIDE_MORE_AREA);
|
|
396
|
+
};
|
|
397
|
+
|
|
398
|
+
const renderContent = () => {
|
|
399
|
+
return (
|
|
400
|
+
<>
|
|
401
|
+
<SheetProvider>
|
|
402
|
+
<NavigationContainer
|
|
403
|
+
ref={navigationRef}
|
|
404
|
+
onStateChange={handleStateChange}>
|
|
405
|
+
<Stack.Navigator
|
|
406
|
+
initialRouteName={'Login'}
|
|
407
|
+
screenOptions={{
|
|
408
|
+
headerStyle: {},
|
|
409
|
+
}}>
|
|
410
|
+
{/* 首页 */}
|
|
411
|
+
{/*<Stack.Screen*/}
|
|
412
|
+
{/* name="Home"*/}
|
|
413
|
+
{/* component={BaseScreen}*/}
|
|
414
|
+
{/* options={{*/}
|
|
415
|
+
{/* title: '首页',*/}
|
|
416
|
+
{/* headerShown: false,*/}
|
|
417
|
+
{/* }}*/}
|
|
418
|
+
{/*/>*/}
|
|
419
|
+
{/* 登录页 */}
|
|
420
|
+
{/*<Stack.Screen*/}
|
|
421
|
+
{/* name="Login"*/}
|
|
422
|
+
{/* component={LoginScreen}*/}
|
|
423
|
+
{/* options={{*/}
|
|
424
|
+
{/* title: '登录',*/}
|
|
425
|
+
{/* headerShown: false,*/}
|
|
426
|
+
{/* }}*/}
|
|
427
|
+
{/*/>*/}
|
|
428
|
+
|
|
429
|
+
{/* 公共页面 */}
|
|
430
|
+
{StackScreenGroup(CommonScreens)}
|
|
431
|
+
|
|
432
|
+
{/* 动态注册的页面 */}
|
|
433
|
+
{StackScreenGroup(DynamicStackScreens)}
|
|
434
|
+
</Stack.Navigator>
|
|
435
|
+
</NavigationContainer>
|
|
436
|
+
</SheetProvider>
|
|
437
|
+
|
|
438
|
+
<Loading onRef={ref => (global.loading = ref)} />
|
|
439
|
+
<Toast onRef={ref => (global.toast = ref)} />
|
|
440
|
+
<Notify onRef={ref => (global.notify = ref)} />
|
|
441
|
+
<Dialog onRef={ref => (global.dialog = ref)} />
|
|
442
|
+
{versionUpdateConfirmVisible && (
|
|
443
|
+
<VersionUpdateConfirm
|
|
444
|
+
onVisibleChange={setVersionUpdateConfirmVisible}
|
|
445
|
+
latestVersion={latestBaseVersion}
|
|
446
|
+
onUpdate={onUpdate}
|
|
447
|
+
/>
|
|
448
|
+
)}
|
|
449
|
+
{isKeyboardVisible && Platform.OS === 'ios' && (
|
|
450
|
+
<TouchableWithoutFeedback onPress={handleTouchOutside}>
|
|
451
|
+
<View style={styles.touchableContainer} />
|
|
452
|
+
</TouchableWithoutFeedback>
|
|
453
|
+
)}
|
|
454
|
+
</>
|
|
455
|
+
);
|
|
456
|
+
};
|
|
457
|
+
|
|
458
|
+
return Platform.OS === 'ios' ? (
|
|
459
|
+
<SafeAreaProvider>
|
|
460
|
+
<SafeAreaView
|
|
461
|
+
style={{flex: 1}}
|
|
462
|
+
edges={includeBottom ? ['right', 'left'] : ['right', 'bottom', 'left']}>
|
|
463
|
+
{renderContent()}
|
|
464
|
+
</SafeAreaView>
|
|
465
|
+
</SafeAreaProvider>
|
|
466
|
+
) : (
|
|
467
|
+
<>
|
|
468
|
+
<StatusBar
|
|
469
|
+
backgroundColor="transparent"
|
|
470
|
+
translucent
|
|
471
|
+
barStyle="dark-content"
|
|
472
|
+
/>
|
|
473
|
+
<SafeAreaProvider>{renderContent()}</SafeAreaProvider>
|
|
474
|
+
</>
|
|
475
|
+
);
|
|
476
|
+
};
|
|
477
|
+
|
|
478
|
+
const styles = StyleSheet.create({
|
|
479
|
+
touchableContainer: {
|
|
480
|
+
...StyleSheet.absoluteFillObject, // 填充整个屏幕
|
|
481
|
+
zIndex: 1, // 确保在 TextInput 之上
|
|
482
|
+
},
|
|
483
|
+
});
|
|
484
|
+
|
|
485
|
+
export default App;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import {homedHttp} from '../utils/http';
|
|
2
|
+
import config from '../utils/config';
|
|
3
|
+
|
|
4
|
+
export const homedGet = (url, data) => {
|
|
5
|
+
return homedHttp({
|
|
6
|
+
url: url,
|
|
7
|
+
method: 'GET',
|
|
8
|
+
data,
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export const getHomedUserInfo = async data => {
|
|
13
|
+
return homedHttp({
|
|
14
|
+
url: `http://access.${await global.base.getHomedDomain()}/account/user/get_info`,
|
|
15
|
+
method: 'GET',
|
|
16
|
+
data,
|
|
17
|
+
});
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
// /account/device/get_list
|
|
21
|
+
export const getUserList = async data => {
|
|
22
|
+
return homedHttp({
|
|
23
|
+
url: `http://access.${await global.base.getHomedDomain()}/account/user/get_list`,
|
|
24
|
+
method: 'GET',
|
|
25
|
+
data,
|
|
26
|
+
});
|
|
27
|
+
};
|
|
28
|
+
export const getRegionList = async data => {
|
|
29
|
+
return homedHttp({
|
|
30
|
+
url: `http://iusm.${await global.base.getHomedDomain()}/account/get_region_list`,
|
|
31
|
+
method: 'GET',
|
|
32
|
+
data,
|
|
33
|
+
});
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
export const getAccessToken = async (data, domain) => {
|
|
37
|
+
return homedHttp({
|
|
38
|
+
url: `http://access.${domain}/account/get_accesstoken`,
|
|
39
|
+
method: 'POST',
|
|
40
|
+
data,
|
|
41
|
+
});
|
|
42
|
+
};
|
package/app/api/index.js
ADDED