@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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mpxjs/core",
3
- "version": "2.10.6-beta.4",
3
+ "version": "2.10.6-beta.8",
4
4
  "description": "mpx runtime core",
5
5
  "keywords": [
6
6
  "miniprogram",
@@ -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 { innerNav } from './env/nav'
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(innerNav, {
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 '../env/nav'
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
  )
@@ -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
- }