@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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mpxjs/core",
3
- "version": "2.10.13-beta.1",
3
+ "version": "2.10.14-beta.1",
4
4
  "description": "mpx runtime core",
5
5
  "keywords": [
6
6
  "miniprogram",
@@ -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 { innerNav } from './env/nav'
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(innerNav, {
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 reason 目前支持模拟 0/3
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' || value === 'exit') {
140
- global.__mpxAppCbs.hide.forEach((cb) => {
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: value === 'exit' ? 0 : 3
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.state = 'exit'
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 '../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 () {
@@ -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
- })