@mpxjs/core 2.10.15-prelease.1 → 2.10.16-beta.2

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.
@@ -11,3 +11,6 @@ declare module '*?resolve' {
11
11
  const resourcePath: string
12
12
  export default resourcePath
13
13
  }
14
+
15
+ declare let setAppShow: () => void
16
+ declare let setAppHide: () => void
package/@types/index.d.ts CHANGED
@@ -9,6 +9,7 @@
9
9
 
10
10
  import type { GetComputedType } from '@mpxjs/store'
11
11
  import type { ScaledSize } from 'react-native'
12
+ import type { ComponentType } from 'react'
12
13
  export * from '@mpxjs/store'
13
14
 
14
15
  // utils
@@ -126,9 +127,17 @@ interface Context {
126
127
  type ExtendedComponentOptions = {
127
128
  disconnectOnUnmounted?: boolean
128
129
  shallowReactivePattern?: RegExp
130
+ /**
131
+ * 是否禁用render函数的useMemo,仅输出RN支持
132
+ */
133
+ disableMemo?: boolean
129
134
  } & WechatMiniprogram.Component.ComponentOptions
130
135
 
131
136
  interface ComponentOpt<D extends Data, P extends Properties, C, M extends Methods, Mi extends Array<any>, S extends Record<any, any>> extends Partial<WechatMiniprogram.Component.Lifetimes & WechatMiniprogram.Component.OtherOption> {
137
+ /**
138
+ * ReactNative 原生组件注册
139
+ */
140
+ components?: Record<string, ComponentType>,
132
141
  data?: D
133
142
  properties?: P
134
143
  computed?: C
@@ -221,7 +230,7 @@ type WxComponentIns<D extends Data = {}, P extends Properties = {}, M extends Me
221
230
  Omit<WechatMiniprogram.Component.Instance<D, P, M>, 'selectComponent' | 'selectAllComponents'>
222
231
  & ReplaceWxComponentIns
223
232
 
224
- type ComponentIns<D extends Data = {}, P extends Properties = {}, C = {}, M extends Methods = {}, Mi extends Array<any> = [], S extends Record<any, any> = {}, O = {}> =
233
+ export type ComponentIns<D extends Data = {}, P extends Properties = {}, C = {}, M extends Methods = {}, Mi extends Array<any> = [], S extends Record<any, any> = {}, O = {}> =
225
234
  GetDataType<D> & UnboxMixinsField<Mi, 'data'> &
226
235
  M & UnboxMixinsField<Mi, 'methods'> & { [K in keyof S]: S[K] extends Ref<infer V> ? V : S[K] } &
227
236
  GetPropsType<P & UnboxMixinsField<Mi, 'properties'>> &
@@ -296,7 +305,7 @@ export interface RnConfig {
296
305
  * - `true`:允许退出应用
297
306
  * - `false`:阻止退出应用
298
307
  */
299
- onAppBack?: () => boolean
308
+ onAppBack?: (delta: number) => boolean
300
309
 
301
310
  /**
302
311
  * 是否禁用框架内部的 AppStateChange 监听。
@@ -356,26 +365,6 @@ export interface RnConfig {
356
365
  dimensions: T
357
366
  ) => T | void
358
367
 
359
- /**
360
- * 异步分包加载配置。
361
- */
362
- asyncChunk?: {
363
- /**
364
- * 加载超时时长配置,单位为毫秒。
365
- */
366
- timeout: number
367
-
368
- /**
369
- * 异步分包页面加载超时或失败时,自定义兜底页面文件路径。
370
- */
371
- fallback: string
372
-
373
- /**
374
- * 异步分包页面加载时,自定义 loading 页面文件路径。
375
- */
376
- loading: string
377
- }
378
-
379
368
  /**
380
369
  * 加载并执行异步分包的方法。
381
370
  *
@@ -399,10 +388,10 @@ interface MpxConfig {
399
388
  ignoreWarning: boolean | string | RegExp | ((msg: string, location: string, e: Error) => boolean)
400
389
  ignoreProxyWhiteList: Array<string>
401
390
  observeClassInstance: boolean | Array<AnyConstructor>
402
- errorHandler: (msg: String, location: String, e: Error) => any | null
403
- warnHandler: (msg: String, location: String, e: Error) => any | null
404
- proxyEventHandler: (e: WechatMiniprogram.CustomEvent, target: ComponentIns<{}, {}, {}, {}, []>) => any | null
405
- setDataHandler: (data: object, target: ComponentIns<{}, {}, {}, {}, []>) => any | null
391
+ errorHandler: (msg: String, location: String, e: Error) => void
392
+ warnHandler: (msg: String, location: String, e: Error) => void
393
+ proxyEventHandler: (e: WechatMiniprogram.CustomEvent, target: ComponentIns<{}, {}, {}, {}, []>) => void
394
+ setDataHandler: (data: object, target: ComponentIns<{}, {}, {}, {}, []>) => void
406
395
  forceFlushSync: boolean,
407
396
  webRouteConfig: object,
408
397
  webConfig: object,
@@ -413,7 +402,7 @@ interface MpxConfig {
413
402
  */
414
403
  webviewConfig: WebviewConfig,
415
404
  /** react-native 相关配置,用于挂载事件等,如 onShareAppMessage */
416
- rnConfig?: RnConfig,
405
+ rnConfig: RnConfig,
417
406
  }
418
407
 
419
408
  type SupportedMode = 'wx' | 'ali' | 'qq' | 'swan' | 'tt' | 'web' | 'qa'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mpxjs/core",
3
- "version": "2.10.15-prelease.1",
3
+ "version": "2.10.16-beta.2",
4
4
  "description": "mpx runtime core",
5
5
  "keywords": [
6
6
  "miniprogram",
@@ -19,7 +19,7 @@
19
19
  ],
20
20
  "main": "src/index.js",
21
21
  "dependencies": {
22
- "@mpxjs/utils": "^2.10.13",
22
+ "@mpxjs/utils": "^2.10.16",
23
23
  "lodash": "^4.1.1",
24
24
  "miniprogram-api-typings": "^3.10.0"
25
25
  },
@@ -93,6 +93,10 @@
93
93
  "optional": true
94
94
  }
95
95
  },
96
+ "devDependencies": {
97
+ "@types/react": "^18.2.79",
98
+ "react-native": "^0.74.5"
99
+ },
96
100
  "publishConfig": {
97
101
  "registry": "https://registry.npmjs.org",
98
102
  "access": "public"
@@ -7,7 +7,7 @@ import { implemented } from '../core/implement'
7
7
  const unsupported = ['moved', 'definitionFilter']
8
8
 
9
9
  function convertErrorDesc (key) {
10
- error(`Options.${key} is not supported in runtime conversion from wx to ali.`, global.currentResource)
10
+ error(`Options.${key} is not supported in runtime conversion from wx to ali.`, global.currentResource || global.currentModuleId)
11
11
  }
12
12
 
13
13
  function notSupportTip (options) {
@@ -8,7 +8,7 @@ import { implemented } from '../core/implement'
8
8
  const unsupported = ['moved', 'definitionFilter']
9
9
 
10
10
  function convertErrorDesc (key) {
11
- error(`Options.${key} is not supported in runtime conversion from wx to react native.`, global.currentResource)
11
+ error(`Options.${key} is not supported in runtime conversion from wx to react native.`, global.currentResource || global.currentModuleId)
12
12
  }
13
13
 
14
14
  function notSupportTip (options) {
@@ -12,7 +12,7 @@ const BEHAVIORS_MAP = {
12
12
  const unsupported = ['moved', 'relations']
13
13
 
14
14
  function convertErrorDesc (key) {
15
- error(`Options.${key} is not supported in runtime conversion from wx to swan.`, global.currentResource)
15
+ error(`Options.${key} is not supported in runtime conversion from wx to swan.`, global.currentResource || global.currentModuleId)
16
16
  }
17
17
 
18
18
  function notSupportTip (options) {
@@ -12,7 +12,7 @@ export default {
12
12
  if (options.behaviors) {
13
13
  options.behaviors.forEach((behavior, idx) => {
14
14
  if (BEHAVIORS_MAP.includes(behavior)) {
15
- error(`Built-in behavior "${behavior}" is not supported in tt environment!`, global.currentResource)
15
+ error(`Built-in behavior "${behavior}" is not supported in tt environment!`, global.currentResource || global.currentModuleId)
16
16
  options.behaviors.splice(idx, 1)
17
17
  }
18
18
  })
@@ -14,7 +14,7 @@ import { implemented } from '../core/implement'
14
14
  const unsupported = ['moved', 'definitionFilter', 'onShareAppMessage']
15
15
 
16
16
  function convertErrorDesc (key) {
17
- error(`Options.${key} is not supported in runtime conversion from wx to web.`, global.currentResource)
17
+ error(`Options.${key} is not supported in runtime conversion from wx to web.`, global.currentResource || global.currentModuleId)
18
18
  }
19
19
 
20
20
  function notSupportTip (options) {
@@ -13,7 +13,7 @@ export default function transferOptions (options, type, needConvert = true) {
13
13
  }
14
14
  }
15
15
  // 文件编译路径
16
- options.mpxFileResource = global.currentResource
16
+ options.mpxFileResource = global.currentResource || global.currentModuleId
17
17
  // 注入全局写入的mixins,原生模式下不进行注入
18
18
  if (!options.__nativeRender__) {
19
19
  options = mergeInjectedMixins(options, type)
@@ -8,10 +8,6 @@ const rawDimensions = {
8
8
  }
9
9
  let width, height
10
10
 
11
- // TODO 临时适配折叠屏场景适配
12
- // const isLargeFoldableLike = (__mpx_mode__ === 'android') && (height / width < 1.5) && (width > 600)
13
- // if (isLargeFoldableLike) width = width / 2
14
-
15
11
  function customDimensions (dimensions) {
16
12
  if (typeof Mpx.config.rnConfig?.customDimensions === 'function') {
17
13
  dimensions = Mpx.config.rnConfig.customDimensions(dimensions) || dimensions
@@ -236,12 +232,18 @@ export default function styleHelperMixin () {
236
232
  flex: 0,
237
233
  height: 0,
238
234
  width: 0,
239
- padding: 0,
240
- margin: 0,
235
+ paddingTop: 0,
236
+ paddingRight: 0,
237
+ paddingBottom: 0,
238
+ paddingLeft: 0,
239
+ marginTop: 0,
240
+ marginRight: 0,
241
+ marginBottom: 0,
242
+ marginLeft: 0,
241
243
  overflow: 'hidden'
242
244
  })
243
245
  }
244
- const isEmpty = isNativeStaticStyle ? result.length > 0 : isEmptyObject(result)
246
+ const isEmpty = isNativeStaticStyle ? !result.length : isEmptyObject(result)
245
247
  return isEmpty ? empty : result
246
248
  }
247
249
  }
@@ -3,7 +3,7 @@ import * as ReactNative from 'react-native'
3
3
  import { ReactiveEffect } from '../../observer/effect'
4
4
  import { watch } from '../../observer/watch'
5
5
  import { del, reactive, set } from '../../observer/reactive'
6
- import { hasOwn, isFunction, noop, isObject, isArray, getByPath, collectDataset, hump2dash, dash2hump, callWithErrorHandling, wrapMethodsWithErrorHandling, error, setFocusedNavigation } from '@mpxjs/utils'
6
+ import { hasOwn, isFunction, noop, isObject, isArray, getByPath, collectDataset, hump2dash, dash2hump, callWithErrorHandling, wrapMethodsWithErrorHandling, error, warn, setFocusedNavigation } from '@mpxjs/utils'
7
7
  import MpxProxy from '../../core/proxy'
8
8
  import { BEFOREUPDATE, ONLOAD, UPDATED, ONSHOW, ONHIDE, ONRESIZE, REACTHOOKSEXEC } from '../../core/innerLifecycle'
9
9
  import mergeOptions from '../../core/mergeOptions'
@@ -13,12 +13,12 @@ import MpxKeyboardAvoidingView from '@mpxjs/webpack-plugin/lib/runtime/component
13
13
  import {
14
14
  IntersectionObserverContext,
15
15
  KeyboardAvoidContext,
16
+ ProviderContext,
16
17
  RouteContext
17
18
  } from '@mpxjs/webpack-plugin/lib/runtime/components/react/dist/context'
18
19
  import { PortalHost, useSafeAreaInsets } from '../env/navigationHelper'
19
20
  import { useInnerHeaderHeight } from '../env/nav'
20
21
 
21
- const ProviderContext = createContext(null)
22
22
  function getSystemInfo () {
23
23
  const windowDimensions = ReactNative.Dimensions.get('window')
24
24
  const screenDimensions = ReactNative.Dimensions.get('screen')
@@ -497,7 +497,6 @@ function getLayoutData (headerHeight) {
497
497
 
498
498
  export function PageWrapperHOC (WrappedComponent, pageConfig = {}) {
499
499
  return function PageWrapperCom ({ navigation, route, ...props }) {
500
- const rootRef = useRef(null)
501
500
  const keyboardAvoidRef = useRef(null)
502
501
  const intersectionObservers = useRef({})
503
502
  const currentPageId = useMemo(() => ++pageId, [])
@@ -545,36 +544,36 @@ export function PageWrapperHOC (WrappedComponent, pageConfig = {}) {
545
544
  // android存在第一次打开insets都返回为0情况,后续会触发第二次渲染后正确
546
545
  navigation.insets = useSafeAreaInsets()
547
546
  return withKeyboardAvoidingView(
548
- createElement(ReactNative.View,
549
- {
550
- style: {
551
- flex: 1,
552
- backgroundColor: currentPageConfig?.backgroundColor || '#fff',
553
- // 解决页面内有元素定位relative left为负值的时候,回退的时候还能看到对应元素问题
554
- overflow: 'hidden'
555
- },
556
- ref: rootRef
557
- },
558
- createElement(RouteContext.Provider,
559
- {
560
- value: routeContextValRef.current
561
- },
562
- createElement(IntersectionObserverContext.Provider,
547
+ createElement(ReactNative.View,
563
548
  {
564
- value: intersectionObservers.current
549
+ style: {
550
+ flex: 1,
551
+ // 页面容器背景色
552
+ backgroundColor: currentPageConfig?.backgroundColorContent || '#fff',
553
+ // 解决页面内有元素定位relative left为负值的时候,回退的时候还能看到对应元素问题
554
+ overflow: 'hidden'
555
+ }
565
556
  },
566
- createElement(PortalHost,
567
- null,
568
- createElement(WrappedComponent, {
569
- ...props,
570
- navigation,
571
- route,
572
- id: currentPageId
573
- })
557
+ createElement(RouteContext.Provider,
558
+ {
559
+ value: routeContextValRef.current
560
+ },
561
+ createElement(IntersectionObserverContext.Provider,
562
+ {
563
+ value: intersectionObservers.current
564
+ },
565
+ createElement(PortalHost,
566
+ null,
567
+ createElement(WrappedComponent, {
568
+ ...props,
569
+ navigation,
570
+ route,
571
+ id: currentPageId
572
+ })
573
+ )
574
+ )
574
575
  )
575
- )
576
576
  )
577
- )
578
577
  )
579
578
  }
580
579
  }
@@ -593,7 +592,7 @@ export function getDefaultOptions ({ type, rawOptions = {}, currentInject }) {
593
592
  const instanceRef = useRef(null)
594
593
  const propsRef = useRef(null)
595
594
  const intersectionCtx = useContext(IntersectionObserverContext)
596
- const { pageId } = useContext(RouteContext) || {}
595
+ const { pageId, navigation } = useContext(RouteContext) || {}
597
596
  const parentProvides = useContext(ProviderContext)
598
597
  let relation = null
599
598
  if (hasDescendantRelation || hasAncestorRelation) {
@@ -652,6 +651,10 @@ export function getDefaultOptions ({ type, rawOptions = {}, currentInject }) {
652
651
  usePageEffect(proxy, pageId)
653
652
  useEffect(() => {
654
653
  proxy.mounted()
654
+ if (navigation.camera?.multi) {
655
+ navigation.camera.multi = false
656
+ warn('<camera>: 一个页面只能插入一个')
657
+ }
655
658
  return () => {
656
659
  proxy.unmounted()
657
660
  proxy.target.__resetInstance()