@mpxjs/core 2.10.13-beta.1 → 2.10.14-beta.1
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/package.json
CHANGED
|
@@ -10,7 +10,8 @@ import { createElement, memo, useRef, useEffect } from 'react'
|
|
|
10
10
|
import * as ReactNative from 'react-native'
|
|
11
11
|
import { initAppProvides } from './export/inject'
|
|
12
12
|
import { NavigationContainer, createNativeStackNavigator, SafeAreaProvider, GestureHandlerRootView } from './env/navigationHelper'
|
|
13
|
-
import
|
|
13
|
+
import createMpxNav from '@mpxjs/webpack-plugin/lib/runtime/components/react/dist/nav'
|
|
14
|
+
import { NavSharedProvider } from '@mpxjs/webpack-plugin/lib/runtime/components/react/dist/mpx-nav-container'
|
|
14
15
|
|
|
15
16
|
const appHooksMap = makeMap(mergeLifecycle(LIFECYCLE).app)
|
|
16
17
|
|
|
@@ -33,6 +34,15 @@ function filterOptions (options, appData) {
|
|
|
33
34
|
return newOptions
|
|
34
35
|
}
|
|
35
36
|
|
|
37
|
+
let CachedMpxNav = null
|
|
38
|
+
|
|
39
|
+
function getMpxNav() {
|
|
40
|
+
// Mpx toplevel 执行时获取不到
|
|
41
|
+
return (CachedMpxNav ??= createMpxNav({
|
|
42
|
+
Mpx
|
|
43
|
+
}))
|
|
44
|
+
}
|
|
45
|
+
|
|
36
46
|
export default function createApp (options) {
|
|
37
47
|
const appData = {}
|
|
38
48
|
// app选项目前不需要进行转换
|
|
@@ -66,7 +76,7 @@ export default function createApp (options) {
|
|
|
66
76
|
flex: 1
|
|
67
77
|
}
|
|
68
78
|
},
|
|
69
|
-
createElement(
|
|
79
|
+
createElement(getMpxNav(), {
|
|
70
80
|
pageConfig: pageConfig,
|
|
71
81
|
navigation
|
|
72
82
|
}),
|
|
@@ -108,7 +118,7 @@ export default function createApp (options) {
|
|
|
108
118
|
}
|
|
109
119
|
}
|
|
110
120
|
const appState = reactive({ state: '' })
|
|
111
|
-
// TODO
|
|
121
|
+
// TODO hideReason 暂未完全模拟
|
|
112
122
|
// 0用户退出小程序
|
|
113
123
|
// 1进入其他小程序
|
|
114
124
|
// 2打开原生功能页
|
|
@@ -136,10 +146,12 @@ export default function createApp (options) {
|
|
|
136
146
|
global.__mpxAppCbs.show.forEach((cb) => {
|
|
137
147
|
cb(options)
|
|
138
148
|
})
|
|
139
|
-
} else if (value === 'hide'
|
|
140
|
-
|
|
149
|
+
} else if (value === 'hide') {
|
|
150
|
+
const reason = appState.hideReason ?? 3
|
|
151
|
+
delete appState.hideReason
|
|
152
|
+
global.__mpxAppCbs.hide.forEach((cb) => {
|
|
141
153
|
cb({
|
|
142
|
-
reason
|
|
154
|
+
reason
|
|
143
155
|
})
|
|
144
156
|
})
|
|
145
157
|
}
|
|
@@ -152,6 +164,7 @@ export default function createApp (options) {
|
|
|
152
164
|
global.__mpxPageStatusMap[navigation.pageId] = 'show'
|
|
153
165
|
}
|
|
154
166
|
} else if (currentState === 'inactive' || currentState === 'background') {
|
|
167
|
+
appState.hideReason = 3
|
|
155
168
|
appState.state = 'hide'
|
|
156
169
|
if (navigation && hasOwn(global.__mpxPageStatusMap, navigation.pageId)) {
|
|
157
170
|
global.__mpxPageStatusMap[navigation.pageId] = 'hide'
|
|
@@ -221,7 +234,8 @@ export default function createApp (options) {
|
|
|
221
234
|
}
|
|
222
235
|
})
|
|
223
236
|
return () => {
|
|
224
|
-
appState.
|
|
237
|
+
appState.hideReason = 0
|
|
238
|
+
appState.state = 'hide'
|
|
225
239
|
changeSubscription && changeSubscription.remove()
|
|
226
240
|
resizeSubScription && resizeSubScription.remove()
|
|
227
241
|
}
|
|
@@ -241,13 +255,13 @@ export default function createApp (options) {
|
|
|
241
255
|
onStateChange,
|
|
242
256
|
onUnhandledAction
|
|
243
257
|
},
|
|
244
|
-
createElement(Stack.Navigator,
|
|
258
|
+
createElement(NavSharedProvider, null, createElement(Stack.Navigator,
|
|
245
259
|
{
|
|
246
260
|
initialRouteName,
|
|
247
261
|
screenOptions: navScreenOpts
|
|
248
262
|
},
|
|
249
263
|
...getPageScreens(initialRouteName, initialParams)
|
|
250
|
-
)
|
|
264
|
+
))
|
|
251
265
|
)
|
|
252
266
|
)
|
|
253
267
|
})
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
RouteContext
|
|
17
17
|
} from '@mpxjs/webpack-plugin/lib/runtime/components/react/dist/context'
|
|
18
18
|
import { PortalHost, useSafeAreaInsets } from '../env/navigationHelper'
|
|
19
|
-
import { useInnerHeaderHeight } from '
|
|
19
|
+
import { useInnerHeaderHeight } from '@mpxjs/webpack-plugin/lib/runtime/components/react/dist/nav'
|
|
20
20
|
|
|
21
21
|
const ProviderContext = createContext(null)
|
|
22
22
|
function getSystemInfo () {
|
package/src/platform/env/nav.js
DELETED
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
import { createElement, useState, useMemo, memo } from 'react'
|
|
2
|
-
import { useSafeAreaInsets } from 'react-native-safe-area-context'
|
|
3
|
-
import { StatusBar, processColor, TouchableWithoutFeedback, Image, View, StyleSheet, Text } from 'react-native'
|
|
4
|
-
import Mpx from '../../index'
|
|
5
|
-
|
|
6
|
-
function convertToHex (color) {
|
|
7
|
-
try {
|
|
8
|
-
const intColor = processColor(color)
|
|
9
|
-
if (intColor === null || intColor === undefined) {
|
|
10
|
-
return null
|
|
11
|
-
}
|
|
12
|
-
// 将32位整数颜色值转换为RGBA
|
|
13
|
-
const r = (intColor >> 16) & 255
|
|
14
|
-
const g = (intColor >> 8) & 255
|
|
15
|
-
const b = intColor & 255
|
|
16
|
-
// 转换为十六进制
|
|
17
|
-
const hexR = r.toString(16).padStart(2, '0')
|
|
18
|
-
const hexG = g.toString(16).padStart(2, '0')
|
|
19
|
-
const hexB = b.toString(16).padStart(2, '0')
|
|
20
|
-
return `#${hexR}${hexG}${hexB}`
|
|
21
|
-
} catch (error) {
|
|
22
|
-
return null
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
const titleHeight = 44
|
|
27
|
-
export function useInnerHeaderHeight (pageconfig) {
|
|
28
|
-
if (pageconfig.navigationStyle === 'custom') {
|
|
29
|
-
return 0
|
|
30
|
-
} else {
|
|
31
|
-
const safeAreaTop = useSafeAreaInsets()?.top || 0
|
|
32
|
-
const headerHeight = safeAreaTop + titleHeight
|
|
33
|
-
return headerHeight
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
const styles = StyleSheet.create({
|
|
38
|
-
header: {
|
|
39
|
-
elevation: 3
|
|
40
|
-
},
|
|
41
|
-
headerContent: {
|
|
42
|
-
flexDirection: 'row',
|
|
43
|
-
alignItems: 'center',
|
|
44
|
-
justifyContent: 'center'
|
|
45
|
-
},
|
|
46
|
-
backButton: {
|
|
47
|
-
position: 'absolute',
|
|
48
|
-
height: '100%',
|
|
49
|
-
width: 40,
|
|
50
|
-
left: 0,
|
|
51
|
-
top: 0,
|
|
52
|
-
alignItems: 'center',
|
|
53
|
-
justifyContent: 'center'
|
|
54
|
-
},
|
|
55
|
-
backButtonImage: {
|
|
56
|
-
width: 22,
|
|
57
|
-
height: 22
|
|
58
|
-
},
|
|
59
|
-
title: {
|
|
60
|
-
fontSize: 17,
|
|
61
|
-
fontWeight: 600,
|
|
62
|
-
width: '60%',
|
|
63
|
-
textAlign: 'center'
|
|
64
|
-
}
|
|
65
|
-
})
|
|
66
|
-
const NavColor = {
|
|
67
|
-
White: '#ffffff',
|
|
68
|
-
Black: '#000000'
|
|
69
|
-
}
|
|
70
|
-
// navigationBarTextStyle只支持黑白'white'/'black
|
|
71
|
-
const validBarTextStyle = (textStyle) => {
|
|
72
|
-
const textStyleColor = convertToHex(textStyle)
|
|
73
|
-
if (textStyle && [NavColor.White, NavColor.Black].includes(textStyleColor)) {
|
|
74
|
-
return textStyleColor
|
|
75
|
-
} else {
|
|
76
|
-
return NavColor.White
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
export const innerNav = memo(({ pageConfig, navigation }) => {
|
|
80
|
-
const [innerPageConfig, setPageConfig] = useState(pageConfig || {})
|
|
81
|
-
navigation.setPageConfig = (config) => {
|
|
82
|
-
const newConfig = Object.assign({}, innerPageConfig, config)
|
|
83
|
-
setPageConfig(newConfig)
|
|
84
|
-
}
|
|
85
|
-
const isCustom = innerPageConfig.navigationStyle === 'custom'
|
|
86
|
-
const navigationBarTextStyle = useMemo(() => validBarTextStyle(innerPageConfig.navigationBarTextStyle), [innerPageConfig.navigationBarTextStyle])
|
|
87
|
-
// 状态栏的颜色
|
|
88
|
-
const statusBarElement = createElement(StatusBar, {
|
|
89
|
-
translucent: true,
|
|
90
|
-
backgroundColor: 'transparent',
|
|
91
|
-
barStyle: (navigationBarTextStyle === NavColor.White) ? 'light-content' : 'dark-content' // 'default'/'light-content'/'dark-content'
|
|
92
|
-
})
|
|
93
|
-
|
|
94
|
-
if (isCustom) return statusBarElement
|
|
95
|
-
const safeAreaTop = useSafeAreaInsets()?.top || 0
|
|
96
|
-
// 假设是栈导航,获取栈的长度
|
|
97
|
-
const stackLength = navigation.getState()?.routes?.length
|
|
98
|
-
const onStackTopBack = Mpx.config?.rnConfig?.onStackTopBack
|
|
99
|
-
const isHandleStackTopBack = typeof onStackTopBack === 'function'
|
|
100
|
-
|
|
101
|
-
// 回退按钮与图标
|
|
102
|
-
const backElement = stackLength > 1 || isHandleStackTopBack
|
|
103
|
-
? createElement(TouchableWithoutFeedback, {
|
|
104
|
-
onPress: () => {
|
|
105
|
-
if (stackLength <= 1 && isHandleStackTopBack) {
|
|
106
|
-
onStackTopBack()
|
|
107
|
-
return
|
|
108
|
-
}
|
|
109
|
-
navigation.goBack()
|
|
110
|
-
}
|
|
111
|
-
}, createElement(View, {
|
|
112
|
-
style: [styles.backButton]
|
|
113
|
-
}, createElement(Image, {
|
|
114
|
-
source: { uri: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAABICAYAAACqT5alAAAA2UlEQVR4nO3bMQrCUBRE0Yla6AYEN2nnBrTL+izcitW3MRDkEUWSvPzJvfCqgMwhZbAppWhNbbIHzB1g9wATERFRVyvpkj1irlpJ5X326D7WHh1hbdFD2CLpLmmftm7kfsEe09aNHFiBrT+wAlt/YAW2/sAKbP2BFdj6Ayuwy+ufz6XPL893krZ//O6iu2n4LT8kndLWTRTo4EC7BDo40C6BDg60S6CDA+0S6OBAuwQ6uNWiD2nrJmoIfU7cNWkR2hbb1UfbY7uuWhGWiIg+a/iHuHmA3QPs3gu4JW9Gan+OJAAAAABJRU5ErkJggg==' },
|
|
115
|
-
// 回退按钮的颜色与设置的title文案颜色一致
|
|
116
|
-
style: [styles.backButtonImage, { tintColor: navigationBarTextStyle }]
|
|
117
|
-
})
|
|
118
|
-
))
|
|
119
|
-
: null
|
|
120
|
-
|
|
121
|
-
return createElement(View, {
|
|
122
|
-
style: [styles.header, {
|
|
123
|
-
paddingTop: safeAreaTop,
|
|
124
|
-
backgroundColor: innerPageConfig.navigationBarBackgroundColor || '#000000'
|
|
125
|
-
}]
|
|
126
|
-
},
|
|
127
|
-
statusBarElement,
|
|
128
|
-
createElement(View, {
|
|
129
|
-
style: styles.headerContent,
|
|
130
|
-
height: titleHeight
|
|
131
|
-
}, backElement,
|
|
132
|
-
createElement(Text, {
|
|
133
|
-
style: [styles.title, { color: navigationBarTextStyle }],
|
|
134
|
-
numberOfLines: 1
|
|
135
|
-
}, innerPageConfig.navigationBarTitleText?.trim() || ''))
|
|
136
|
-
)
|
|
137
|
-
})
|