@mpxjs/core 2.10.6-beta.4 → 2.10.6-beta.8
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,7 @@ 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
14
|
|
|
15
15
|
const appHooksMap = makeMap(mergeLifecycle(LIFECYCLE).app)
|
|
16
16
|
|
|
@@ -33,6 +33,15 @@ function filterOptions (options, appData) {
|
|
|
33
33
|
return newOptions
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
+
let CachedMpxNav = null
|
|
37
|
+
|
|
38
|
+
function getMpxNav() {
|
|
39
|
+
// Mpx toplevel 执行时获取不到
|
|
40
|
+
return (CachedMpxNav ??= createMpxNav({
|
|
41
|
+
Mpx
|
|
42
|
+
}))
|
|
43
|
+
}
|
|
44
|
+
|
|
36
45
|
export default function createApp (options) {
|
|
37
46
|
const appData = {}
|
|
38
47
|
// app选项目前不需要进行转换
|
|
@@ -64,7 +73,7 @@ export default function createApp (options) {
|
|
|
64
73
|
flex: 1
|
|
65
74
|
}
|
|
66
75
|
},
|
|
67
|
-
createElement(
|
|
76
|
+
createElement(getMpxNav(), {
|
|
68
77
|
pageConfig: pageConfig,
|
|
69
78
|
navigation
|
|
70
79
|
}),
|
|
@@ -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 () {
|
|
@@ -422,7 +422,7 @@ function usePageStatus (navigation, pageId) {
|
|
|
422
422
|
function usePagePreload (route) {
|
|
423
423
|
const name = route.name
|
|
424
424
|
useEffect(() => {
|
|
425
|
-
setTimeout(() => {
|
|
425
|
+
const timer = setTimeout(() => {
|
|
426
426
|
const preloadRule = global.__preloadRule || {}
|
|
427
427
|
const { packages } = preloadRule[name] || {}
|
|
428
428
|
if (packages?.length > 0) {
|
|
@@ -432,6 +432,10 @@ function usePagePreload (route) {
|
|
|
432
432
|
}
|
|
433
433
|
}
|
|
434
434
|
}, 800)
|
|
435
|
+
|
|
436
|
+
return () => {
|
|
437
|
+
clearTimeout(timer)
|
|
438
|
+
}
|
|
435
439
|
}, [])
|
|
436
440
|
}
|
|
437
441
|
|
|
@@ -516,7 +520,8 @@ export function PageWrapperHOC (WrappedComponent, pageConfig = {}) {
|
|
|
516
520
|
},
|
|
517
521
|
contentContainerStyle: {
|
|
518
522
|
flex: 1
|
|
519
|
-
}
|
|
523
|
+
},
|
|
524
|
+
navigation
|
|
520
525
|
},
|
|
521
526
|
element
|
|
522
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
|
-
}
|