@mpxjs/webpack-plugin 2.10.15-prelease.1 → 2.10.16-beta.10

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.
Files changed (257) hide show
  1. package/lib/config.js +60 -0
  2. package/lib/dependencies/AppEntryDependency.js +2 -2
  3. package/lib/dependencies/RecordModuleIdMapDependency.js +49 -0
  4. package/lib/dependencies/ResolveDependency.js +1 -1
  5. package/lib/file-loader.js +13 -3
  6. package/lib/helpers.js +2 -0
  7. package/lib/index.js +40 -15
  8. package/lib/json-compiler/helper.js +72 -2
  9. package/lib/json-compiler/index.js +16 -56
  10. package/lib/json-compiler/plugin.js +2 -2
  11. package/lib/loader.js +10 -4
  12. package/lib/native-loader.js +6 -3
  13. package/lib/platform/json/wx/index.js +30 -29
  14. package/lib/platform/style/wx/index.js +8 -1
  15. package/lib/platform/template/wx/component-config/ad.js +5 -0
  16. package/lib/platform/template/wx/component-config/button.js +21 -5
  17. package/lib/platform/template/wx/component-config/camera.js +25 -3
  18. package/lib/platform/template/wx/component-config/canvas.js +8 -1
  19. package/lib/platform/template/wx/component-config/component.js +31 -33
  20. package/lib/platform/template/wx/component-config/cover-image.js +7 -2
  21. package/lib/platform/template/wx/component-config/cover-view.js +3 -1
  22. package/lib/platform/template/wx/component-config/fix-component-name.js +2 -2
  23. package/lib/platform/template/wx/component-config/form.js +27 -2
  24. package/lib/platform/template/wx/component-config/image.js +5 -0
  25. package/lib/platform/template/wx/component-config/input.js +10 -0
  26. package/lib/platform/template/wx/component-config/label.js +10 -2
  27. package/lib/platform/template/wx/component-config/map.js +11 -0
  28. package/lib/platform/template/wx/component-config/movable-area.js +4 -1
  29. package/lib/platform/template/wx/component-config/movable-view.js +17 -2
  30. package/lib/platform/template/wx/component-config/navigator.js +26 -0
  31. package/lib/platform/template/wx/component-config/picker-view.js +12 -0
  32. package/lib/platform/template/wx/component-config/picker.js +3 -1
  33. package/lib/platform/template/wx/component-config/progress.js +11 -1
  34. package/lib/platform/template/wx/component-config/rich-text.js +5 -0
  35. package/lib/platform/template/wx/component-config/scroll-view.js +12 -1
  36. package/lib/platform/template/wx/component-config/slider.js +8 -0
  37. package/lib/platform/template/wx/component-config/swiper-item.js +5 -2
  38. package/lib/platform/template/wx/component-config/swiper.js +10 -0
  39. package/lib/platform/template/wx/component-config/text.js +5 -0
  40. package/lib/platform/template/wx/component-config/textarea.js +19 -2
  41. package/lib/platform/template/wx/component-config/unsupported.js +10 -1
  42. package/lib/platform/template/wx/component-config/video.js +10 -0
  43. package/lib/platform/template/wx/index.js +21 -1
  44. package/lib/react/index.js +2 -0
  45. package/lib/react/processJSON.js +39 -71
  46. package/lib/react/processStyles.js +3 -2
  47. package/lib/react/processTemplate.js +8 -6
  48. package/lib/react/script-helper.js +6 -16
  49. package/lib/react/style-helper.js +10 -2
  50. package/lib/runtime/components/react/context.ts +13 -6
  51. package/lib/runtime/components/react/dist/context.d.ts +76 -0
  52. package/lib/runtime/components/react/dist/context.d.ts.map +1 -0
  53. package/lib/runtime/components/react/dist/context.js +1 -0
  54. package/lib/runtime/components/react/dist/event.config.d.ts +8 -0
  55. package/lib/runtime/components/react/dist/event.config.d.ts.map +1 -0
  56. package/lib/runtime/components/react/dist/getInnerListeners.d.ts +8 -0
  57. package/lib/runtime/components/react/dist/getInnerListeners.d.ts.map +1 -0
  58. package/lib/runtime/components/react/dist/mpx-async-suspense.d.ts +13 -0
  59. package/lib/runtime/components/react/dist/mpx-async-suspense.d.ts.map +1 -0
  60. package/lib/runtime/components/react/dist/mpx-button.d.ts +69 -0
  61. package/lib/runtime/components/react/dist/mpx-button.d.ts.map +1 -0
  62. package/lib/runtime/components/react/dist/mpx-camera.d.ts +27 -0
  63. package/lib/runtime/components/react/dist/mpx-camera.d.ts.map +1 -0
  64. package/lib/runtime/components/react/dist/mpx-camera.jsx +197 -0
  65. package/lib/runtime/components/react/dist/mpx-canvas/Bus.d.ts +24 -0
  66. package/lib/runtime/components/react/dist/mpx-canvas/Bus.d.ts.map +1 -0
  67. package/lib/runtime/components/react/dist/mpx-canvas/CanvasGradient.d.ts +8 -0
  68. package/lib/runtime/components/react/dist/mpx-canvas/CanvasGradient.d.ts.map +1 -0
  69. package/lib/runtime/components/react/dist/mpx-canvas/CanvasRenderingContext2D.d.ts +7 -0
  70. package/lib/runtime/components/react/dist/mpx-canvas/CanvasRenderingContext2D.d.ts.map +1 -0
  71. package/lib/runtime/components/react/dist/mpx-canvas/Image.d.ts +21 -0
  72. package/lib/runtime/components/react/dist/mpx-canvas/Image.d.ts.map +1 -0
  73. package/lib/runtime/components/react/dist/mpx-canvas/ImageData.d.ts +9 -0
  74. package/lib/runtime/components/react/dist/mpx-canvas/ImageData.d.ts.map +1 -0
  75. package/lib/runtime/components/react/dist/mpx-canvas/constructorsRegistry.d.ts +11 -0
  76. package/lib/runtime/components/react/dist/mpx-canvas/constructorsRegistry.d.ts.map +1 -0
  77. package/lib/runtime/components/react/dist/mpx-canvas/html.d.ts +3 -0
  78. package/lib/runtime/components/react/dist/mpx-canvas/html.d.ts.map +1 -0
  79. package/lib/runtime/components/react/dist/mpx-canvas/index.d.ts +33 -0
  80. package/lib/runtime/components/react/dist/mpx-canvas/index.d.ts.map +1 -0
  81. package/lib/runtime/components/react/dist/mpx-canvas/utils.d.ts +53 -0
  82. package/lib/runtime/components/react/dist/mpx-canvas/utils.d.ts.map +1 -0
  83. package/lib/runtime/components/react/dist/mpx-checkbox-group.d.ts +21 -0
  84. package/lib/runtime/components/react/dist/mpx-checkbox-group.d.ts.map +1 -0
  85. package/lib/runtime/components/react/dist/mpx-checkbox.d.ts +33 -0
  86. package/lib/runtime/components/react/dist/mpx-checkbox.d.ts.map +1 -0
  87. package/lib/runtime/components/react/dist/mpx-form.d.ts +28 -0
  88. package/lib/runtime/components/react/dist/mpx-form.d.ts.map +1 -0
  89. package/lib/runtime/components/react/dist/mpx-icon/index.d.ts +19 -0
  90. package/lib/runtime/components/react/dist/mpx-icon/index.d.ts.map +1 -0
  91. package/lib/runtime/components/react/dist/mpx-image.d.ts +22 -0
  92. package/lib/runtime/components/react/dist/mpx-image.d.ts.map +1 -0
  93. package/lib/runtime/components/react/dist/mpx-image.jsx +81 -37
  94. package/lib/runtime/components/react/dist/mpx-inline-text.d.ts +8 -0
  95. package/lib/runtime/components/react/dist/mpx-inline-text.d.ts.map +1 -0
  96. package/lib/runtime/components/react/dist/mpx-input.d.ts +51 -0
  97. package/lib/runtime/components/react/dist/mpx-input.d.ts.map +1 -0
  98. package/lib/runtime/components/react/dist/mpx-input.jsx +37 -11
  99. package/lib/runtime/components/react/dist/mpx-keyboard-avoiding-view.d.ts +13 -0
  100. package/lib/runtime/components/react/dist/mpx-keyboard-avoiding-view.d.ts.map +1 -0
  101. package/lib/runtime/components/react/dist/mpx-keyboard-avoiding-view.jsx +61 -50
  102. package/lib/runtime/components/react/dist/mpx-label.d.ts +21 -0
  103. package/lib/runtime/components/react/dist/mpx-label.d.ts.map +1 -0
  104. package/lib/runtime/components/react/dist/mpx-movable-area.d.ts +21 -0
  105. package/lib/runtime/components/react/dist/mpx-movable-area.d.ts.map +1 -0
  106. package/lib/runtime/components/react/dist/mpx-movable-view.d.ts +66 -0
  107. package/lib/runtime/components/react/dist/mpx-movable-view.d.ts.map +1 -0
  108. package/lib/runtime/components/react/dist/mpx-nav.d.ts +9 -0
  109. package/lib/runtime/components/react/dist/mpx-nav.d.ts.map +1 -0
  110. package/lib/runtime/components/react/dist/mpx-nav.jsx +132 -0
  111. package/lib/runtime/components/react/dist/mpx-navigator.d.ts +10 -0
  112. package/lib/runtime/components/react/dist/mpx-navigator.d.ts.map +1 -0
  113. package/lib/runtime/components/react/dist/mpx-picker/date.d.ts +7 -0
  114. package/lib/runtime/components/react/dist/mpx-picker/date.d.ts.map +1 -0
  115. package/lib/runtime/components/react/dist/mpx-picker/dateData.d.ts +8 -0
  116. package/lib/runtime/components/react/dist/mpx-picker/dateData.d.ts.map +1 -0
  117. package/lib/runtime/components/react/dist/mpx-picker/index.d.ts +7 -0
  118. package/lib/runtime/components/react/dist/mpx-picker/index.d.ts.map +1 -0
  119. package/lib/runtime/components/react/dist/mpx-picker/multiSelector.d.ts +7 -0
  120. package/lib/runtime/components/react/dist/mpx-picker/multiSelector.d.ts.map +1 -0
  121. package/lib/runtime/components/react/dist/mpx-picker/region.d.ts +7 -0
  122. package/lib/runtime/components/react/dist/mpx-picker/region.d.ts.map +1 -0
  123. package/lib/runtime/components/react/dist/mpx-picker/regionData.d.ts +3 -0
  124. package/lib/runtime/components/react/dist/mpx-picker/regionData.d.ts.map +1 -0
  125. package/lib/runtime/components/react/dist/mpx-picker/selector.d.ts +7 -0
  126. package/lib/runtime/components/react/dist/mpx-picker/selector.d.ts.map +1 -0
  127. package/lib/runtime/components/react/dist/mpx-picker/time.d.ts +7 -0
  128. package/lib/runtime/components/react/dist/mpx-picker/time.d.ts.map +1 -0
  129. package/lib/runtime/components/react/dist/mpx-picker/type.d.ts +107 -0
  130. package/lib/runtime/components/react/dist/mpx-picker/type.d.ts.map +1 -0
  131. package/lib/runtime/components/react/dist/mpx-picker-view/index.d.ts +33 -0
  132. package/lib/runtime/components/react/dist/mpx-picker-view/index.d.ts.map +1 -0
  133. package/lib/runtime/components/react/dist/mpx-picker-view/index.jsx +4 -3
  134. package/lib/runtime/components/react/dist/mpx-picker-view/pickerVIewContext.d.ts +9 -0
  135. package/lib/runtime/components/react/dist/mpx-picker-view/pickerVIewContext.d.ts.map +1 -0
  136. package/lib/runtime/components/react/dist/mpx-picker-view-column/index.d.ts +24 -0
  137. package/lib/runtime/components/react/dist/mpx-picker-view-column/index.d.ts.map +1 -0
  138. package/lib/runtime/components/react/dist/mpx-picker-view-column/index.jsx +12 -18
  139. package/lib/runtime/components/react/dist/mpx-picker-view-column/pickerViewColumnItem.d.ts +15 -0
  140. package/lib/runtime/components/react/dist/mpx-picker-view-column/pickerViewColumnItem.d.ts.map +1 -0
  141. package/lib/runtime/components/react/dist/mpx-picker-view-column/pickerViewColumnItem.jsx +8 -11
  142. package/lib/runtime/components/react/dist/mpx-picker-view-column/pickerViewColumnItemLite.d.ts +14 -0
  143. package/lib/runtime/components/react/dist/mpx-picker-view-column/pickerViewColumnItemLite.d.ts.map +1 -0
  144. package/lib/runtime/components/react/dist/mpx-picker-view-column/pickerViewColumnItemLite.jsx +20 -0
  145. package/lib/runtime/components/react/dist/mpx-picker-view-column/pickerViewFaces.d.ts +17 -0
  146. package/lib/runtime/components/react/dist/mpx-picker-view-column/pickerViewFaces.d.ts.map +1 -0
  147. package/lib/runtime/components/react/dist/mpx-picker-view-column/pickerViewIndicator.d.ts +13 -0
  148. package/lib/runtime/components/react/dist/mpx-picker-view-column/pickerViewIndicator.d.ts.map +1 -0
  149. package/lib/runtime/components/react/dist/mpx-picker-view-column/pickerViewMask.d.ts +12 -0
  150. package/lib/runtime/components/react/dist/mpx-picker-view-column/pickerViewMask.d.ts.map +1 -0
  151. package/lib/runtime/components/react/dist/mpx-popup/index.d.ts +23 -0
  152. package/lib/runtime/components/react/dist/mpx-popup/index.d.ts.map +1 -0
  153. package/lib/runtime/components/react/dist/mpx-popup/popupBase.d.ts +17 -0
  154. package/lib/runtime/components/react/dist/mpx-popup/popupBase.d.ts.map +1 -0
  155. package/lib/runtime/components/react/dist/mpx-portal/index.d.ts +16 -0
  156. package/lib/runtime/components/react/dist/mpx-portal/index.d.ts.map +1 -0
  157. package/lib/runtime/components/react/dist/mpx-portal/index.jsx +5 -1
  158. package/lib/runtime/components/react/dist/mpx-portal/portal-host.d.ts +30 -0
  159. package/lib/runtime/components/react/dist/mpx-portal/portal-host.d.ts.map +1 -0
  160. package/lib/runtime/components/react/dist/mpx-portal/portal-manager.d.ts +10 -0
  161. package/lib/runtime/components/react/dist/mpx-portal/portal-manager.d.ts.map +1 -0
  162. package/lib/runtime/components/react/dist/mpx-progress.d.ts +24 -0
  163. package/lib/runtime/components/react/dist/mpx-progress.d.ts.map +1 -0
  164. package/lib/runtime/components/react/dist/mpx-radio-group.d.ts +21 -0
  165. package/lib/runtime/components/react/dist/mpx-radio-group.d.ts.map +1 -0
  166. package/lib/runtime/components/react/dist/mpx-radio.d.ts +27 -0
  167. package/lib/runtime/components/react/dist/mpx-radio.d.ts.map +1 -0
  168. package/lib/runtime/components/react/dist/mpx-rich-text/html.d.ts +2 -0
  169. package/lib/runtime/components/react/dist/mpx-rich-text/html.d.ts.map +1 -0
  170. package/lib/runtime/components/react/dist/mpx-rich-text/index.d.ts +25 -0
  171. package/lib/runtime/components/react/dist/mpx-rich-text/index.d.ts.map +1 -0
  172. package/lib/runtime/components/react/dist/mpx-root-portal.d.ts +15 -0
  173. package/lib/runtime/components/react/dist/mpx-root-portal.d.ts.map +1 -0
  174. package/lib/runtime/components/react/dist/mpx-scroll-view.d.ts +55 -0
  175. package/lib/runtime/components/react/dist/mpx-scroll-view.d.ts.map +1 -0
  176. package/lib/runtime/components/react/dist/mpx-scroll-view.jsx +6 -14
  177. package/lib/runtime/components/react/dist/mpx-simple-text.d.ts +8 -0
  178. package/lib/runtime/components/react/dist/mpx-simple-text.d.ts.map +1 -0
  179. package/lib/runtime/components/react/dist/mpx-simple-view.d.ts +8 -0
  180. package/lib/runtime/components/react/dist/mpx-simple-view.d.ts.map +1 -0
  181. package/lib/runtime/components/react/dist/mpx-slider.d.ts +31 -0
  182. package/lib/runtime/components/react/dist/mpx-slider.d.ts.map +1 -0
  183. package/lib/runtime/components/react/dist/mpx-sticky-header.d.ts +18 -0
  184. package/lib/runtime/components/react/dist/mpx-sticky-header.d.ts.map +1 -0
  185. package/lib/runtime/components/react/dist/mpx-sticky-section.d.ts +16 -0
  186. package/lib/runtime/components/react/dist/mpx-sticky-section.d.ts.map +1 -0
  187. package/lib/runtime/components/react/dist/mpx-swiper-item.d.ts +19 -0
  188. package/lib/runtime/components/react/dist/mpx-swiper-item.d.ts.map +1 -0
  189. package/lib/runtime/components/react/dist/mpx-swiper.d.ts +53 -0
  190. package/lib/runtime/components/react/dist/mpx-swiper.d.ts.map +1 -0
  191. package/lib/runtime/components/react/dist/mpx-swiper.jsx +9 -5
  192. package/lib/runtime/components/react/dist/mpx-switch.d.ts +27 -0
  193. package/lib/runtime/components/react/dist/mpx-switch.d.ts.map +1 -0
  194. package/lib/runtime/components/react/dist/mpx-text.d.ts +23 -0
  195. package/lib/runtime/components/react/dist/mpx-text.d.ts.map +1 -0
  196. package/lib/runtime/components/react/dist/mpx-text.jsx +33 -5
  197. package/lib/runtime/components/react/dist/mpx-textarea.d.ts +8 -0
  198. package/lib/runtime/components/react/dist/mpx-textarea.d.ts.map +1 -0
  199. package/lib/runtime/components/react/dist/mpx-video.d.ts +102 -0
  200. package/lib/runtime/components/react/dist/mpx-video.d.ts.map +1 -0
  201. package/lib/runtime/components/react/dist/mpx-view.d.ts +35 -0
  202. package/lib/runtime/components/react/dist/mpx-view.d.ts.map +1 -0
  203. package/lib/runtime/components/react/dist/mpx-view.jsx +1 -1
  204. package/lib/runtime/components/react/dist/mpx-web-view.d.ts +23 -0
  205. package/lib/runtime/components/react/dist/mpx-web-view.d.ts.map +1 -0
  206. package/lib/runtime/components/react/dist/mpx-web-view.jsx +1 -1
  207. package/lib/runtime/components/react/dist/parser.d.ts +40 -0
  208. package/lib/runtime/components/react/dist/parser.d.ts.map +1 -0
  209. package/lib/runtime/components/react/dist/useAnimationHooks.d.ts +33 -0
  210. package/lib/runtime/components/react/dist/useAnimationHooks.d.ts.map +1 -0
  211. package/lib/runtime/components/react/dist/useNodesRef.d.ts +12 -0
  212. package/lib/runtime/components/react/dist/useNodesRef.d.ts.map +1 -0
  213. package/lib/runtime/components/react/dist/utils.d.ts +123 -0
  214. package/lib/runtime/components/react/dist/utils.d.ts.map +1 -0
  215. package/lib/runtime/components/react/dist/utils.jsx +16 -6
  216. package/lib/runtime/components/react/mpx-camera.tsx +275 -0
  217. package/lib/runtime/components/react/mpx-image.tsx +89 -42
  218. package/lib/runtime/components/react/mpx-input.tsx +44 -17
  219. package/lib/runtime/components/react/mpx-keyboard-avoiding-view.tsx +69 -49
  220. package/lib/runtime/components/react/mpx-nav.tsx +155 -0
  221. package/lib/runtime/components/react/mpx-picker-view/index.tsx +5 -2
  222. package/lib/runtime/components/react/mpx-picker-view-column/index.tsx +26 -21
  223. package/lib/runtime/components/react/mpx-picker-view-column/pickerViewColumnItem.tsx +8 -12
  224. package/lib/runtime/components/react/mpx-picker-view-column/pickerViewColumnItemLite.tsx +55 -0
  225. package/lib/runtime/components/react/mpx-portal/index.tsx +8 -2
  226. package/lib/runtime/components/react/mpx-scroll-view.tsx +6 -17
  227. package/lib/runtime/components/react/mpx-swiper.tsx +9 -5
  228. package/lib/runtime/components/react/mpx-text.tsx +38 -5
  229. package/lib/runtime/components/react/mpx-view.tsx +1 -1
  230. package/lib/runtime/components/react/mpx-web-view.tsx +1 -1
  231. package/lib/runtime/components/react/types/common.d.ts +19 -0
  232. package/lib/runtime/components/react/utils.tsx +15 -6
  233. package/lib/runtime/components/web/mpx-input.vue +0 -14
  234. package/lib/runtime/stringify.wxs +2 -2
  235. package/lib/script-setup-compiler/index.js +2 -2
  236. package/lib/style-compiler/index.js +3 -2
  237. package/lib/style-compiler/load-postcss-config.js +1 -1
  238. package/lib/style-compiler/plugins/trans-special.js +10 -2
  239. package/lib/style-compiler/strip-conditional-loader.js +178 -15
  240. package/lib/template-compiler/bind-this.js +2 -2
  241. package/lib/template-compiler/compiler.js +267 -71
  242. package/lib/template-compiler/gen-node-react.js +18 -6
  243. package/lib/template-compiler/index.js +12 -10
  244. package/lib/template-compiler/parse-exps.js +1 -1
  245. package/lib/utils/const.js +2 -1
  246. package/lib/utils/dom-tag-config.js +6 -6
  247. package/lib/utils/env.js +6 -1
  248. package/lib/utils/get-build-tag-component.js +35 -0
  249. package/lib/utils/pre-process-json.js +5 -0
  250. package/lib/web/index.js +2 -0
  251. package/lib/web/processJSON.js +44 -16
  252. package/lib/web/processScript.js +1 -1
  253. package/lib/web/processTemplate.js +6 -4
  254. package/lib/web/script-helper.js +19 -9
  255. package/lib/wxs/pre-loader.js +1 -1
  256. package/lib/wxss/loader.js +1 -9
  257. package/package.json +15 -4
@@ -40,7 +40,16 @@ const ModeMap = new Map([
40
40
  ...cropMode.map(mode => [mode, 'stretch'])
41
41
  ]);
42
42
  const isNumber = (value) => typeof value === 'number';
43
- const relativeCenteredSize = (viewSize, imageSize) => (viewSize - imageSize) / 2;
43
+ const relativeCenteredSize = (viewSize, imageSize) => {
44
+ return (viewSize - imageSize) / 2;
45
+ };
46
+ // 获取能完全显示图片的缩放比例:长宽方向的缩放比例最小值即为能完全展示的比例
47
+ function getFitScale(width1, height1, width2, height2) {
48
+ return Math.min(width2 / width1, height2 / height1);
49
+ }
50
+ function getFillScale(width1, height1, width2, height2) {
51
+ return Math.max(width2 / width1, height2 / height1);
52
+ }
44
53
  function noMeetCalcRule(isSvg, mode, viewWidth, viewHeight, ratio) {
45
54
  const isMeetSize = viewWidth && viewHeight && ratio;
46
55
  if (isSvg && !isMeetSize)
@@ -49,6 +58,16 @@ function noMeetCalcRule(isSvg, mode, viewWidth, viewHeight, ratio) {
49
58
  return true;
50
59
  return false;
51
60
  }
61
+ const getFixedWidth = (viewWidth, viewHeight, ratio) => {
62
+ if (!ratio)
63
+ return viewWidth;
64
+ const fixed = viewHeight / ratio;
65
+ return !fixed ? viewWidth : fixed;
66
+ };
67
+ const getFixedHeight = (viewWidth, viewHeight, ratio) => {
68
+ const fixed = viewWidth * ratio;
69
+ return !fixed ? viewHeight : fixed;
70
+ };
52
71
  const Image = forwardRef((props, ref) => {
53
72
  const { src = '', mode = 'scaleToFill', style = {}, 'enable-var': enableVar, 'external-var-context': externalVarContext, 'parent-font-size': parentFontSize, 'enable-fast-image': enableFastImage, 'parent-width': parentWidth, 'parent-height': parentHeight, bindload, binderror } = props;
54
73
  const defaultStyle = {
@@ -56,7 +75,6 @@ const Image = forwardRef((props, ref) => {
56
75
  height: DEFAULT_IMAGE_HEIGHT
57
76
  };
58
77
  const styleObj = extendObject({}, defaultStyle, style, { overflow: 'hidden' });
59
- const state = useRef({});
60
78
  const nodeRef = useRef(null);
61
79
  useNodesRef(props, ref, nodeRef, {
62
80
  defaultStyle
@@ -70,13 +88,19 @@ const Image = forwardRef((props, ref) => {
70
88
  const onLayout = ({ nativeEvent: { layout: { width, height } } }) => {
71
89
  state.current.viewWidth = width;
72
90
  state.current.viewHeight = height;
91
+ // 实际渲染尺寸可能会指定的值不一致,误差低于 0.5 则认为没有变化
92
+ if (Math.abs(viewHeight - height) < 0.5 && Math.abs(viewWidth - width) < 0.5) {
93
+ if (state.current.imageWidth && state.current.imageHeight && state.current.ratio) {
94
+ if (!loaded)
95
+ setLoaded(true);
96
+ }
97
+ return;
98
+ }
73
99
  if (state.current.imageWidth && state.current.imageHeight && state.current.ratio) {
74
- setViewWidth(width);
75
- setViewHeight(height);
76
100
  setRatio(state.current.ratio);
77
101
  setImageWidth(state.current.imageWidth);
78
102
  setImageHeight(state.current.imageHeight);
79
- state.current = {};
103
+ setViewSize(state.current.viewWidth, state.current.viewHeight, state.current.ratio);
80
104
  setLoaded(true);
81
105
  }
82
106
  };
@@ -96,43 +120,56 @@ const Image = forwardRef((props, ref) => {
96
120
  const [imageHeight, setImageHeight] = useState(0);
97
121
  const [ratio, setRatio] = useState(0);
98
122
  const [loaded, setLoaded] = useState(!isLayoutMode);
99
- const fixedHeight = useMemo(() => {
100
- const fixed = viewWidth * ratio;
101
- return !fixed ? viewHeight : fixed;
102
- }, [ratio, viewWidth, viewHeight]);
103
- const fixedWidth = useMemo(() => {
104
- if (!ratio)
105
- return viewWidth;
106
- const fixed = viewHeight / ratio;
107
- return !fixed ? viewWidth : fixed;
108
- }, [ratio, viewWidth, viewHeight]);
123
+ const state = useRef({
124
+ viewWidth,
125
+ viewHeight
126
+ });
127
+ function setViewSize(viewWidth, viewHeight, ratio) {
128
+ // 在特定模式下可预测 view 的变化,在onLayout触发时能以此避免重复render
129
+ switch (mode) {
130
+ case 'widthFix': {
131
+ setViewWidth(viewWidth);
132
+ const fixedHeight = getFixedHeight(viewWidth, viewHeight, ratio);
133
+ setViewHeight(fixedHeight);
134
+ break;
135
+ }
136
+ case 'heightFix': {
137
+ setViewHeight(viewHeight);
138
+ const fixedWidth = getFixedWidth(viewWidth, viewHeight, ratio);
139
+ setViewWidth(fixedWidth);
140
+ break;
141
+ }
142
+ default:
143
+ setViewHeight(viewHeight);
144
+ setViewWidth(viewWidth);
145
+ break;
146
+ }
147
+ }
109
148
  const modeStyle = useMemo(() => {
110
149
  if (noMeetCalcRule(isSvg, mode, viewWidth, viewHeight, ratio))
111
150
  return {};
112
151
  switch (mode) {
113
- case 'scaleToFill':
152
+ case 'scaleToFill': // wx 中 svg 图片的 scaleToFill 模式效果与 aspectFit 一致,不会就行图片缩放,此处保持一致
114
153
  case 'aspectFit':
115
154
  if (isSvg) {
116
- const scale = ratio <= 1
117
- ? imageWidth >= viewWidth ? viewWidth / imageWidth : imageWidth / viewWidth
118
- : imageHeight >= viewHeight ? viewHeight / imageHeight : imageHeight / viewHeight;
155
+ const scale = getFitScale(imageWidth, imageHeight, viewWidth, viewHeight);
119
156
  return {
120
157
  transform: [
121
- { scale },
122
- ratio <= 1 ? { translateY: -(imageHeight * scale - viewHeight) / 2 / scale } : { translateX: -(imageWidth * scale - viewWidth) / 2 / scale }
158
+ { translateY: relativeCenteredSize(viewHeight, imageHeight * scale) },
159
+ { translateX: relativeCenteredSize(viewWidth, imageWidth * scale) },
160
+ { scale }
123
161
  ]
124
162
  };
125
163
  }
126
164
  return {};
127
165
  case 'aspectFill':
128
166
  if (isSvg) {
129
- const scale = ratio >= 1
130
- ? imageWidth >= viewWidth ? viewWidth / imageWidth : imageWidth / viewWidth
131
- : imageHeight >= viewHeight ? viewHeight / imageHeight : imageHeight / viewHeight;
167
+ const scale = getFillScale(imageWidth, imageHeight, viewWidth, viewHeight);
132
168
  return {
133
169
  transform: [
134
- { scale },
135
- ratio >= 1 ? { translateY: -(imageHeight * scale - viewHeight) / 2 / scale } : { translateX: -(imageWidth * scale - viewWidth) / 2 / scale }
170
+ { translateY: relativeCenteredSize(viewHeight, imageHeight * scale) },
171
+ { translateX: relativeCenteredSize(viewWidth, imageWidth * scale) },
172
+ { scale }
136
173
  ]
137
174
  };
138
175
  }
@@ -140,9 +177,7 @@ const Image = forwardRef((props, ref) => {
140
177
  case 'widthFix':
141
178
  case 'heightFix':
142
179
  if (isSvg) {
143
- const scale = ratio >= 1
144
- ? imageWidth >= fixedWidth ? fixedWidth / imageWidth : imageWidth / fixedWidth
145
- : imageHeight >= fixedHeight ? fixedHeight / imageHeight : imageHeight / fixedHeight;
180
+ const scale = getFitScale(imageWidth, imageHeight, viewWidth, viewHeight);
146
181
  return {
147
182
  transform: [{ scale }]
148
183
  };
@@ -205,12 +240,23 @@ const Image = forwardRef((props, ref) => {
205
240
  default:
206
241
  return {};
207
242
  }
208
- }, [isSvg, mode, viewWidth, viewHeight, imageWidth, imageHeight, ratio, fixedWidth, fixedHeight]);
243
+ }, [isSvg, mode, viewWidth, viewHeight, imageWidth, imageHeight, ratio]);
209
244
  const onSvgLoad = (evt) => {
210
245
  const { width, height } = evt.nativeEvent.layout;
211
- setRatio(!width ? 0 : height / width);
212
- setImageWidth(width);
246
+ state.current.imageHeight = height;
213
247
  setImageHeight(height);
248
+ state.current.ratio = !width ? 0 : height / width;
249
+ if (isWidthFixMode
250
+ ? state.current.viewWidth
251
+ : isHeightFixMode
252
+ ? state.current.viewHeight
253
+ : state.current.viewWidth && state.current.viewHeight) {
254
+ setRatio(state.current.ratio);
255
+ setImageWidth(width);
256
+ setImageHeight(height);
257
+ setViewSize(state.current.viewWidth, state.current.viewHeight, state.current.ratio);
258
+ setLoaded(true);
259
+ }
214
260
  bindload && bindload(getCustomEvent('load', evt, {
215
261
  detail: { width, height },
216
262
  layoutRef
@@ -248,12 +294,10 @@ const Image = forwardRef((props, ref) => {
248
294
  : isHeightFixMode
249
295
  ? state.current.viewHeight
250
296
  : state.current.viewWidth && state.current.viewHeight) {
251
- state.current.viewWidth && setViewWidth(state.current.viewWidth);
252
- state.current.viewHeight && setViewHeight(state.current.viewHeight);
253
- setRatio(!width ? 0 : height / width);
297
+ setRatio(state.current.ratio);
254
298
  setImageWidth(width);
255
299
  setImageHeight(height);
256
- state.current = {};
300
+ setViewSize(state.current.viewWidth, state.current.viewHeight, state.current.ratio);
257
301
  setLoaded(true);
258
302
  }
259
303
  }, () => {
@@ -263,7 +307,7 @@ const Image = forwardRef((props, ref) => {
263
307
  }, [src, isSvg, isLayoutMode]);
264
308
  const innerProps = useInnerProps(extendObject({}, props, layoutProps, {
265
309
  ref: nodeRef,
266
- style: extendObject({}, normalStyle, layoutStyle, isHeightFixMode ? { width: fixedWidth } : {}, isWidthFixMode ? { height: fixedHeight } : {})
310
+ style: extendObject({}, normalStyle, layoutStyle, isHeightFixMode ? { width: viewWidth } : {}, isWidthFixMode ? { height: viewHeight } : {})
267
311
  }), [
268
312
  'src',
269
313
  'mode',
@@ -0,0 +1,8 @@
1
+ import { TextProps } from 'react-native';
2
+ import { JSX } from 'react';
3
+ declare const InlineText: {
4
+ (props: TextProps): JSX.Element;
5
+ displayName: string;
6
+ };
7
+ export default InlineText;
8
+ //# sourceMappingURL=mpx-inline-text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mpx-inline-text.d.ts","sourceRoot":"","sources":["../mpx-inline-text.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAQ,SAAS,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,GAAG,EAAiB,MAAM,OAAO,CAAA;AAI1C,QAAA,MAAM,UAAU;YAAW,SAAS,GAAG,WAAW;;CAQjD,CAAA;AAID,eAAe,UAAU,CAAA"}
@@ -0,0 +1,51 @@
1
+ /// <reference types="react" />
2
+ import { TextInput, TextStyle, ViewStyle, NativeSyntheticEvent, TextInputTextInputEventData, TextInputKeyPressEventData, TextInputContentSizeChangeEventData, FlexStyle, TextInputSelectionChangeEventData, TextInputFocusEventData, TextInputSubmitEditingEventData } from 'react-native';
3
+ import { HandlerRef } from './useNodesRef';
4
+ type InputStyle = Omit<TextStyle & ViewStyle & Pick<FlexStyle, 'minHeight'>, 'borderLeftWidth' | 'borderTopWidth' | 'borderRightWidth' | 'borderBottomWidth' | 'borderTopLeftRadius' | 'borderTopRightRadius' | 'borderBottomRightRadius' | 'borderBottomLeftRadius'>;
5
+ type Type = 'text' | 'number' | 'idcard' | 'digit';
6
+ type ConfirmType = 'done' | 'send' | 'search' | 'next' | 'go' | 'return';
7
+ export interface InputProps {
8
+ name?: string;
9
+ style?: InputStyle & Record<string, any>;
10
+ value?: string | number;
11
+ type?: Type;
12
+ password?: boolean;
13
+ placeholder?: string;
14
+ disabled?: boolean;
15
+ 'cursor-spacing'?: number;
16
+ maxlength?: number;
17
+ 'auto-focus'?: boolean;
18
+ focus?: boolean;
19
+ 'confirm-type'?: ConfirmType;
20
+ 'confirm-hold'?: boolean;
21
+ cursor?: number;
22
+ 'cursor-color'?: string;
23
+ 'selection-start'?: number;
24
+ 'selection-end'?: number;
25
+ 'placeholder-style'?: {
26
+ color?: string;
27
+ };
28
+ 'enable-offset'?: boolean;
29
+ 'enable-var'?: boolean;
30
+ 'external-var-context'?: Record<string, any>;
31
+ 'parent-font-size'?: number;
32
+ 'parent-width'?: number;
33
+ 'parent-height'?: number;
34
+ 'adjust-position': boolean;
35
+ 'hold-keyboard'?: boolean;
36
+ bindinput?: (evt: NativeSyntheticEvent<TextInputTextInputEventData> | unknown) => void;
37
+ bindfocus?: (evt: NativeSyntheticEvent<TextInputFocusEventData> | unknown) => void;
38
+ bindblur?: (evt: NativeSyntheticEvent<TextInputFocusEventData> | unknown) => void;
39
+ bindconfirm?: (evt: NativeSyntheticEvent<TextInputSubmitEditingEventData | TextInputKeyPressEventData> | unknown) => void;
40
+ bindselectionchange?: (evt: NativeSyntheticEvent<TextInputSelectionChangeEventData> | unknown) => void;
41
+ }
42
+ export interface PrivateInputProps {
43
+ allowFontScaling?: boolean;
44
+ multiline?: boolean;
45
+ 'auto-height'?: boolean;
46
+ bindlinechange?: (evt: NativeSyntheticEvent<TextInputContentSizeChangeEventData> | unknown) => void;
47
+ }
48
+ type FinalInputProps = InputProps & PrivateInputProps;
49
+ declare const Input: import("react").ForwardRefExoticComponent<InputProps & PrivateInputProps & import("react").RefAttributes<HandlerRef<TextInput, FinalInputProps>>>;
50
+ export default Input;
51
+ //# sourceMappingURL=mpx-input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mpx-input.d.ts","sourceRoot":"","sources":["../mpx-input.tsx"],"names":[],"mappings":";AAwCA,OAAO,EACL,SAAS,EACT,SAAS,EACT,SAAS,EACT,oBAAoB,EACpB,2BAA2B,EAC3B,0BAA0B,EAC1B,mCAAmC,EACnC,SAAS,EACT,iCAAiC,EACjC,uBAAuB,EAEvB,+BAA+B,EAEhC,MAAM,cAAc,CAAA;AAIrB,OAAoB,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAIvD,KAAK,UAAU,GAAG,IAAI,CACpB,SAAS,GAAG,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,EAClD,iBAAiB,GACjB,gBAAgB,GAChB,kBAAkB,GAClB,mBAAmB,GACnB,qBAAqB,GACrB,sBAAsB,GACtB,yBAAyB,GACzB,wBAAwB,CAC3B,CAAA;AAED,KAAK,IAAI,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAA;AAElD,KAAK,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,IAAI,GAAG,QAAQ,CAAA;AAExE,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACxC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACvB,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,cAAc,CAAC,EAAE,WAAW,CAAA;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,mBAAmB,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IACxC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,sBAAsB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC5C,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,oBAAoB,CAAC,2BAA2B,CAAC,GAAG,OAAO,KAAK,IAAI,CAAA;IACtF,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,oBAAoB,CAAC,uBAAuB,CAAC,GAAG,OAAO,KAAK,IAAI,CAAA;IAClF,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,oBAAoB,CAAC,uBAAuB,CAAC,GAAG,OAAO,KAAK,IAAI,CAAA;IACjF,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,oBAAoB,CAAC,+BAA+B,GAAG,0BAA0B,CAAC,GAAG,OAAO,KAAK,IAAI,CAAA;IACzH,mBAAmB,CAAC,EAAE,CAAC,GAAG,EAAE,oBAAoB,CAAC,iCAAiC,CAAC,GAAG,OAAO,KAAK,IAAI,CAAA;CACvG;AAED,MAAM,WAAW,iBAAiB;IAChC,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,oBAAoB,CAAC,mCAAmC,CAAC,GAAG,OAAO,KAAK,IAAI,CAAA;CACpG;AAED,KAAK,eAAe,GAAG,UAAU,GAAG,iBAAiB,CAAA;AASrD,QAAA,MAAM,KAAK,mJAwYT,CAAA;AAIF,eAAe,KAAK,CAAA"}
@@ -18,7 +18,7 @@
18
18
  * ✔ selection-start
19
19
  * ✔ selection-end
20
20
  * ✔ adjust-position
21
- * hold-keyboard
21
+ * hold-keyboard
22
22
  * ✘ safe-password-cert-path
23
23
  * ✘ safe-password-length
24
24
  * ✘ safe-password-time-stamp
@@ -52,7 +52,7 @@ const keyboardTypeMap = {
52
52
  digit: isIOS ? 'decimal-pad' : 'numeric'
53
53
  };
54
54
  const Input = forwardRef((props, ref) => {
55
- const { style = {}, allowFontScaling = false, type = 'text', value, password, 'placeholder-style': placeholderStyle = {}, disabled, maxlength = 140, 'cursor-spacing': cursorSpacing = 0, 'auto-focus': autoFocus, focus, 'confirm-type': confirmType = 'done', 'confirm-hold': confirmHold = false, cursor, 'cursor-color': cursorColor, 'selection-start': selectionStart = -1, 'selection-end': selectionEnd = -1, 'enable-var': enableVar, 'external-var-context': externalVarContext, 'parent-font-size': parentFontSize, 'parent-width': parentWidth, 'parent-height': parentHeight, 'adjust-position': adjustPosition = true, bindinput, bindfocus, bindblur, bindconfirm, bindselectionchange,
55
+ const { style = {}, allowFontScaling = false, type = 'text', value, password, 'placeholder-style': placeholderStyle = {}, disabled, maxlength = 140, 'cursor-spacing': cursorSpacing = 0, 'auto-focus': autoFocus, focus, 'confirm-type': confirmType = 'done', 'confirm-hold': confirmHold = false, cursor, 'cursor-color': cursorColor, 'selection-start': selectionStart = -1, 'selection-end': selectionEnd = -1, 'enable-var': enableVar, 'external-var-context': externalVarContext, 'parent-font-size': parentFontSize, 'parent-width': parentWidth, 'parent-height': parentHeight, 'adjust-position': adjustPosition = true, 'hold-keyboard': holdKeyboard = false, bindinput, bindfocus, bindblur, bindconfirm, bindselectionchange,
56
56
  // private
57
57
  multiline, 'auto-height': autoHeight, bindlinechange } = props;
58
58
  const formContext = useContext(FormContext);
@@ -144,8 +144,8 @@ const Input = forwardRef((props, ref) => {
144
144
  }
145
145
  };
146
146
  const setKeyboardAvoidContext = () => {
147
- if (adjustPosition && keyboardAvoid) {
148
- keyboardAvoid.current = { cursorSpacing, ref: nodeRef };
147
+ if (keyboardAvoid) {
148
+ keyboardAvoid.current = { cursorSpacing, ref: nodeRef, adjustPosition, holdKeyboard };
149
149
  }
150
150
  };
151
151
  const onTouchStart = () => {
@@ -156,13 +156,39 @@ const Input = forwardRef((props, ref) => {
156
156
  evt.nativeEvent.origin = 'input';
157
157
  };
158
158
  const onFocus = (evt) => {
159
- setKeyboardAvoidContext();
160
- bindfocus && bindfocus(getCustomEvent('focus', evt, {
161
- detail: {
162
- value: tmpValue.current || ''
163
- },
164
- layoutRef
165
- }, props));
159
+ if (!keyboardAvoid?.current) {
160
+ setKeyboardAvoidContext();
161
+ }
162
+ if (bindfocus) {
163
+ const focusAction = () => {
164
+ bindfocus(getCustomEvent('focus', evt, {
165
+ detail: {
166
+ value: tmpValue.current || '',
167
+ height: keyboardAvoid?.current?.keyboardHeight
168
+ },
169
+ layoutRef
170
+ }, props));
171
+ if (keyboardAvoid?.current?.onKeyboardShow) {
172
+ keyboardAvoid.current.onKeyboardShow = undefined;
173
+ }
174
+ };
175
+ if (keyboardAvoid?.current) {
176
+ // 有 keyboardAvoiding
177
+ if (keyboardAvoid.current.keyboardHeight) {
178
+ // iOS: keyboard 获取高度时机 keyboardWillShow 在 input focus 之前,可以立即执行
179
+ focusAction();
180
+ }
181
+ else {
182
+ // Android,Harmony: keyboard 获取高度时机 keyboardDidShow 在 input focus 之后,需要延迟回调
183
+ evt.persist();
184
+ keyboardAvoid.current.onKeyboardShow = focusAction;
185
+ }
186
+ }
187
+ else {
188
+ // 无 keyboardAvoiding,直接执行 focus 回调
189
+ focusAction();
190
+ }
191
+ }
166
192
  };
167
193
  const onBlur = (evt) => {
168
194
  bindblur && bindblur(getCustomEvent('blur', evt, {
@@ -0,0 +1,13 @@
1
+ import React, { ReactNode } from 'react';
2
+ import { ViewStyle } from 'react-native';
3
+ type KeyboardAvoidViewProps = {
4
+ children?: ReactNode;
5
+ style?: ViewStyle;
6
+ contentContainerStyle?: ViewStyle;
7
+ };
8
+ declare const KeyboardAvoidingView: {
9
+ ({ children, style, contentContainerStyle }: KeyboardAvoidViewProps): React.JSX.Element;
10
+ displayName: string;
11
+ };
12
+ export default KeyboardAvoidingView;
13
+ //# sourceMappingURL=mpx-keyboard-avoiding-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mpx-keyboard-avoiding-view.d.ts","sourceRoot":"","sources":["../mpx-keyboard-avoiding-view.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAiC,MAAM,OAAO,CAAA;AACvE,OAAO,EAAuD,SAAS,EAA0C,MAAM,cAAc,CAAA;AAKrI,KAAK,sBAAsB,GAAG;IAC5B,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,qBAAqB,CAAC,EAAE,SAAS,CAAA;CAClC,CAAA;AAED,QAAA,MAAM,oBAAoB;iDAAgD,sBAAsB;;CAiH/F,CAAA;AAID,eAAe,oBAAoB,CAAA"}
@@ -1,92 +1,103 @@
1
- import React, { useContext, useEffect } from 'react';
1
+ /* eslint-disable space-before-function-paren */
2
+ import React, { useContext, useEffect, useRef } from 'react';
2
3
  import { Keyboard, View } from 'react-native';
3
- import Animated, { useSharedValue, useAnimatedStyle, withTiming, Easing } from 'react-native-reanimated';
4
+ import Animated, { useSharedValue, useAnimatedStyle, withTiming, Easing, cancelAnimation } from 'react-native-reanimated';
4
5
  import { KeyboardAvoidContext } from './context';
5
- import { isIOS } from './utils';
6
+ import { isAndroid, isIOS } from './utils';
6
7
  const KeyboardAvoidingView = ({ children, style, contentContainerStyle }) => {
7
8
  const duration = isIOS ? 250 : 300;
8
9
  const easing = isIOS ? Easing.inOut(Easing.ease) : Easing.out(Easing.quad);
9
10
  const offset = useSharedValue(0);
10
11
  const basic = useSharedValue('auto');
11
12
  const keyboardAvoid = useContext(KeyboardAvoidContext);
13
+ // fix: 某些特殊机型下隐藏键盘可能会先触发一次 keyboardWillShow,
14
+ // 比如机型 iPhone 11 Pro,可能会导致显隐动画冲突
15
+ // 因此增加状态标记 + cancelAnimation 来优化
16
+ const isShow = useRef(false);
12
17
  const animatedStyle = useAnimatedStyle(() => ({
13
- transform: [{ translateY: -offset.value }],
18
+ // translate/position top可能会导致底部渲染区域缺失
19
+ marginTop: -offset.value,
14
20
  flexBasis: basic.value
15
21
  }));
16
22
  const resetKeyboard = () => {
23
+ if (!isShow.current) {
24
+ return;
25
+ }
26
+ isShow.current = false;
17
27
  if (keyboardAvoid?.current) {
28
+ const inputRef = keyboardAvoid.current.ref?.current;
29
+ if (inputRef && inputRef.isFocused()) {
30
+ // 修复 Android 点击键盘收起按钮时当前 input 没触发失焦的问题
31
+ inputRef.blur();
32
+ }
18
33
  keyboardAvoid.current = null;
19
34
  }
35
+ cancelAnimation(offset);
20
36
  offset.value = withTiming(0, { duration, easing });
21
37
  basic.value = 'auto';
22
38
  };
23
39
  const onTouchEnd = ({ nativeEvent }) => {
24
40
  if (nativeEvent.origin !== 'input') {
41
+ if (keyboardAvoid?.current?.holdKeyboard) {
42
+ return;
43
+ }
25
44
  Keyboard.isVisible() && Keyboard.dismiss();
26
45
  }
27
46
  };
28
47
  useEffect(() => {
29
48
  let subscriptions = [];
30
- if (isIOS) {
31
- subscriptions = [
32
- Keyboard.addListener('keyboardWillShow', (evt) => {
33
- if (!keyboardAvoid?.current)
34
- return;
35
- const { endCoordinates } = evt;
36
- const { ref, cursorSpacing = 0 } = keyboardAvoid.current;
37
- setTimeout(() => {
38
- ref?.current?.measure((x, y, width, height, pageX, pageY) => {
49
+ function keybaordAvoding(evt) {
50
+ if (!keyboardAvoid?.current || isShow.current) {
51
+ return;
52
+ }
53
+ isShow.current = true;
54
+ const { endCoordinates } = evt;
55
+ const { ref, cursorSpacing = 0, adjustPosition, onKeyboardShow } = keyboardAvoid.current;
56
+ keyboardAvoid.current.keyboardHeight = endCoordinates.height;
57
+ onKeyboardShow?.();
58
+ if (adjustPosition) {
59
+ // 默认沿用旧版本逻辑,在 android 原生关闭键盘避让的情况下应该将该配置设置为 false,走 mpx 的键盘避让逻辑,否则bundle内的所有input都会无法避让键盘
60
+ const enableNativeKeyboardAvoiding = mpxGlobal?.__mpx?.config?.rnConfig?.enableNativeKeyboardAvoiding ?? true;
61
+ const callback = () => {
62
+ ref?.current?.measure((x, y, width, height, pageX, pageY) => {
63
+ function calculateOffset() {
64
+ // enableNativeKeyboardAvoding 默认开启
65
+ if (enableNativeKeyboardAvoiding && isAndroid) {
66
+ const aboveOffset = pageY + height - endCoordinates.screenY;
67
+ const belowOffset = endCoordinates.height - aboveOffset;
68
+ const aboveValue = -aboveOffset >= cursorSpacing ? 0 : aboveOffset + cursorSpacing;
69
+ const belowValue = Math.min(belowOffset, cursorSpacing);
70
+ return aboveOffset > 0 ? belowValue : aboveValue;
71
+ }
39
72
  const aboveOffset = offset.value + pageY + height - endCoordinates.screenY;
40
73
  const aboveValue = -aboveOffset >= cursorSpacing ? 0 : aboveOffset + cursorSpacing;
41
74
  const belowValue = Math.min(endCoordinates.height, aboveOffset + cursorSpacing);
42
- const value = aboveOffset > 0 ? belowValue : aboveValue;
43
- offset.value = withTiming(value, { duration, easing }, (finished) => {
44
- if (finished) {
45
- // Set flexBasic after animation to trigger re-layout and reset layout information
46
- basic.value = '99.99%';
47
- }
48
- });
49
- });
50
- });
51
- }),
52
- Keyboard.addListener('keyboardWillHide', resetKeyboard)
53
- ];
54
- }
55
- else {
56
- subscriptions = [
57
- Keyboard.addListener('keyboardDidShow', (evt) => {
58
- if (!keyboardAvoid?.current)
59
- return;
60
- const { endCoordinates } = evt;
61
- const { ref, cursorSpacing = 0 } = keyboardAvoid.current;
62
- ref?.current?.measure((x, y, width, height, pageX, pageY) => {
63
- const aboveOffset = pageY + height - endCoordinates.screenY;
64
- const belowOffset = endCoordinates.height - aboveOffset;
65
- const aboveValue = -aboveOffset >= cursorSpacing ? 0 : aboveOffset + cursorSpacing;
66
- const belowValue = Math.min(belowOffset, cursorSpacing);
67
- const value = aboveOffset > 0 ? belowValue : aboveValue;
68
- offset.value = withTiming(value, { duration, easing }, (finished) => {
75
+ return aboveOffset > 0 ? belowValue : aboveValue;
76
+ }
77
+ cancelAnimation(offset);
78
+ offset.value = withTiming(calculateOffset(), { duration, easing }, finished => {
69
79
  if (finished) {
70
80
  // Set flexBasic after animation to trigger re-layout and reset layout information
71
81
  basic.value = '99.99%';
72
82
  }
73
83
  });
74
84
  });
75
- }),
76
- Keyboard.addListener('keyboardDidHide', resetKeyboard)
77
- ];
85
+ };
86
+ (isIOS ? () => setTimeout(callback) : callback)();
87
+ }
88
+ }
89
+ if (isIOS) {
90
+ subscriptions = [Keyboard.addListener('keyboardWillShow', keybaordAvoding), Keyboard.addListener('keyboardWillHide', resetKeyboard)];
91
+ }
92
+ else {
93
+ subscriptions = [Keyboard.addListener('keyboardDidShow', keybaordAvoding), Keyboard.addListener('keyboardDidHide', resetKeyboard)];
78
94
  }
79
95
  return () => {
80
96
  subscriptions.forEach(subscription => subscription.remove());
81
97
  };
82
98
  }, [keyboardAvoid]);
83
- return (<View style={style} onTouchEnd={onTouchEnd}>
84
- <Animated.View style={[
85
- contentContainerStyle,
86
- animatedStyle
87
- ]}>
88
- {children}
89
- </Animated.View>
99
+ return (<View style={style} onTouchEnd={onTouchEnd} onTouchMove={onTouchEnd}>
100
+ <Animated.View style={[contentContainerStyle, animatedStyle]}>{children}</Animated.View>
90
101
  </View>);
91
102
  };
92
103
  KeyboardAvoidingView.displayName = 'MpxKeyboardAvoidingView';
@@ -0,0 +1,21 @@
1
+ /**
2
+ * ✘ for
3
+ */
4
+ import { ReactNode } from 'react';
5
+ import { View, ViewStyle, NativeSyntheticEvent } from 'react-native';
6
+ import { HandlerRef } from './useNodesRef';
7
+ export interface LabelProps {
8
+ for?: string;
9
+ style?: ViewStyle & Record<string, any>;
10
+ 'enable-offset'?: boolean;
11
+ 'enable-var'?: boolean;
12
+ 'external-var-context'?: Record<string, any>;
13
+ 'parent-font-size'?: number;
14
+ 'parent-width'?: number;
15
+ 'parent-height'?: number;
16
+ children: ReactNode;
17
+ bindtap?: (evt: NativeSyntheticEvent<TouchEvent> | unknown) => void;
18
+ }
19
+ declare const Label: import("react").ForwardRefExoticComponent<LabelProps & import("react").RefAttributes<HandlerRef<View, LabelProps>>>;
20
+ export default Label;
21
+ //# sourceMappingURL=mpx-label.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mpx-label.d.ts","sourceRoot":"","sources":["../mpx-label.tsx"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAA2B,SAAS,EAA8B,MAAM,OAAO,CAAA;AACtF,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AAGpE,OAAoB,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAKvD,MAAM,WAAW,UAAU;IACzB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACvC,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,sBAAsB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC5C,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,EAAE,SAAS,CAAA;IACnB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,oBAAoB,CAAC,UAAU,CAAC,GAAG,OAAO,KAAK,IAAI,CAAA;CACpE;AAED,QAAA,MAAM,KAAK,qHA0FV,CAAA;AAID,eAAe,KAAK,CAAA"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * ✘ scale-area
3
+ */
4
+ import { View } from 'react-native';
5
+ import { ReactNode } from 'react';
6
+ import { HandlerRef } from './useNodesRef';
7
+ interface MovableAreaProps {
8
+ style?: Record<string, any>;
9
+ children: ReactNode;
10
+ width?: number;
11
+ height?: number;
12
+ 'enable-offset'?: boolean;
13
+ 'enable-var'?: boolean;
14
+ 'external-var-context'?: Record<string, any>;
15
+ 'parent-font-size'?: number;
16
+ 'parent-width'?: number;
17
+ 'parent-height'?: number;
18
+ }
19
+ declare const _MovableArea: import("react").ForwardRefExoticComponent<MovableAreaProps & import("react").RefAttributes<HandlerRef<View, MovableAreaProps>>>;
20
+ export default _MovableArea;
21
+ //# sourceMappingURL=mpx-movable-area.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mpx-movable-area.d.ts","sourceRoot":"","sources":["../mpx-movable-area.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AACnC,OAAO,EAAmB,SAAS,EAAkC,MAAM,OAAO,CAAA;AAClF,OAAoB,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAMvD,UAAU,gBAAgB;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC3B,QAAQ,EAAE,SAAS,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,sBAAsB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC5C,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,QAAA,MAAM,YAAY,iIAsDhB,CAAA;AAIF,eAAe,YAAY,CAAA"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * ✔ direction
3
+ * ✔ inertia
4
+ * ✔ out-of-bounds
5
+ * ✔ x
6
+ * ✔ y
7
+ * ✔ damping
8
+ * ✔ friction
9
+ * ✔ disabled
10
+ * ✘ scale
11
+ * ✘ scale-min
12
+ * ✘ scale-max
13
+ * ✘ scale-value
14
+ * ✔ animation
15
+ * ✔ bindchange
16
+ * ✘ bindscale
17
+ * ✔ htouchmove
18
+ * ✔ vtouchmove
19
+ */
20
+ import { ReactNode } from 'react';
21
+ import { View, LayoutChangeEvent } from 'react-native';
22
+ import { HandlerRef } from './useNodesRef';
23
+ import { GestureHandler } from './utils';
24
+ import { GestureTouchEvent } from 'react-native-gesture-handler';
25
+ interface MovableViewProps {
26
+ children: ReactNode;
27
+ style?: Record<string, any>;
28
+ direction: 'all' | 'vertical' | 'horizontal' | 'none';
29
+ x?: number;
30
+ y?: number;
31
+ disabled?: boolean;
32
+ animation?: boolean;
33
+ damping?: number;
34
+ friction?: number;
35
+ id?: string;
36
+ changeThrottleTime?: number;
37
+ bindchange?: (event: unknown) => void;
38
+ bindtouchstart?: (event: GestureTouchEvent) => void;
39
+ catchtouchstart?: (event: GestureTouchEvent) => void;
40
+ bindtouchmove?: (event: GestureTouchEvent) => void;
41
+ catchtouchmove?: (event: GestureTouchEvent) => void;
42
+ catchtouchend?: (event: GestureTouchEvent) => void;
43
+ bindtouchend?: (event: GestureTouchEvent) => void;
44
+ bindhtouchmove?: (event: GestureTouchEvent) => void;
45
+ bindvtouchmove?: (event: GestureTouchEvent) => void;
46
+ catchhtouchmove?: (event: GestureTouchEvent) => void;
47
+ catchvtouchmove?: (event: GestureTouchEvent) => void;
48
+ bindlongpress?: (event: GestureTouchEvent) => void;
49
+ catchlongpress?: (event: GestureTouchEvent) => void;
50
+ bindtap?: (event: GestureTouchEvent) => void;
51
+ catchtap?: (event: GestureTouchEvent) => void;
52
+ onLayout?: (event: LayoutChangeEvent) => void;
53
+ 'out-of-bounds'?: boolean;
54
+ 'wait-for'?: Array<GestureHandler>;
55
+ 'simultaneous-handlers'?: Array<GestureHandler>;
56
+ inertia?: boolean;
57
+ 'enable-var'?: boolean;
58
+ 'external-var-context'?: Record<string, any>;
59
+ 'parent-font-size'?: number;
60
+ 'parent-width'?: number;
61
+ 'parent-height'?: number;
62
+ 'disable-event-passthrough'?: boolean;
63
+ }
64
+ declare const _MovableView: import("react").ForwardRefExoticComponent<MovableViewProps & import("react").RefAttributes<HandlerRef<View, MovableViewProps>>>;
65
+ export default _MovableView;
66
+ //# sourceMappingURL=mpx-movable-view.d.ts.map