@mpxjs/core 2.10.6-beta.5 → 2.10.6-beta.9
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选项目前不需要进行转换
|
|
@@ -64,7 +74,7 @@ export default function createApp (options) {
|
|
|
64
74
|
flex: 1
|
|
65
75
|
}
|
|
66
76
|
},
|
|
67
|
-
createElement(
|
|
77
|
+
createElement(getMpxNav(), {
|
|
68
78
|
pageConfig: pageConfig,
|
|
69
79
|
navigation
|
|
70
80
|
}),
|
|
@@ -248,13 +258,13 @@ export default function createApp (options) {
|
|
|
248
258
|
onStateChange,
|
|
249
259
|
onUnhandledAction
|
|
250
260
|
},
|
|
251
|
-
createElement(Stack.Navigator,
|
|
261
|
+
createElement(NavSharedProvider, null, createElement(Stack.Navigator,
|
|
252
262
|
{
|
|
253
263
|
initialRouteName,
|
|
254
264
|
screenOptions: navScreenOpts
|
|
255
265
|
},
|
|
256
266
|
...getPageScreens(initialRouteName, initialParams)
|
|
257
|
-
)
|
|
267
|
+
))
|
|
258
268
|
)
|
|
259
269
|
)
|
|
260
270
|
})
|
|
@@ -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 () {
|
|
@@ -520,7 +520,8 @@ export function PageWrapperHOC (WrappedComponent, pageConfig = {}) {
|
|
|
520
520
|
},
|
|
521
521
|
contentContainerStyle: {
|
|
522
522
|
flex: 1
|
|
523
|
-
}
|
|
523
|
+
},
|
|
524
|
+
navigation
|
|
524
525
|
},
|
|
525
526
|
element
|
|
526
527
|
)
|
package/src/platform/env/nav.js
DELETED
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
import { createElement, useState, useMemo } from 'react'
|
|
2
|
-
import { useSafeAreaInsets } from 'react-native-safe-area-context'
|
|
3
|
-
import { StatusBar, processColor, TouchableOpacity, 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 function innerNav ({ 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
|
-
// 用于外部注册打开RN容器之前的栈长度
|
|
99
|
-
const beforeStackLength = Mpx.config?.rnConfig?.beforeStackLength || 0
|
|
100
|
-
|
|
101
|
-
// 回退按钮与图标
|
|
102
|
-
const backElement = stackLength + beforeStackLength > 1
|
|
103
|
-
? createElement(TouchableOpacity, {
|
|
104
|
-
style: [styles.backButton],
|
|
105
|
-
onPress: () => { navigation.goBack() }
|
|
106
|
-
}, createElement(Image, {
|
|
107
|
-
source: { uri: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAABICAYAAACqT5alAAAA2UlEQVR4nO3bMQrCUBRE0Yla6AYEN2nnBrTL+izcitW3MRDkEUWSvPzJvfCqgMwhZbAppWhNbbIHzB1g9wATERFRVyvpkj1irlpJ5X326D7WHh1hbdFD2CLpLmmftm7kfsEe09aNHFiBrT+wAlt/YAW2/sAKbP2BFdj6Ayuwy+ufz6XPL893krZ//O6iu2n4LT8kndLWTRTo4EC7BDo40C6BDg60S6CDA+0S6OBAuwQ6uNWiD2nrJmoIfU7cNWkR2hbb1UfbY7uuWhGWiIg+a/iHuHmA3QPs3gu4JW9Gan+OJAAAAABJRU5ErkJggg==' },
|
|
108
|
-
// 回退按钮的颜色与设置的title文案颜色一致
|
|
109
|
-
style: [styles.backButtonImage, { tintColor: navigationBarTextStyle }]
|
|
110
|
-
}))
|
|
111
|
-
: null
|
|
112
|
-
|
|
113
|
-
return createElement(View, {
|
|
114
|
-
style: [styles.header, {
|
|
115
|
-
paddingTop: safeAreaTop,
|
|
116
|
-
backgroundColor: innerPageConfig.navigationBarBackgroundColor || '#000000'
|
|
117
|
-
}]
|
|
118
|
-
},
|
|
119
|
-
statusBarElement,
|
|
120
|
-
createElement(View, {
|
|
121
|
-
style: styles.headerContent,
|
|
122
|
-
height: titleHeight
|
|
123
|
-
}, backElement,
|
|
124
|
-
createElement(Text, {
|
|
125
|
-
style: [styles.title, { color: navigationBarTextStyle }],
|
|
126
|
-
numberOfLines: 1
|
|
127
|
-
}, innerPageConfig.navigationBarTitleText?.trim() || ''))
|
|
128
|
-
)
|
|
129
|
-
}
|