@mpxjs/webpack-plugin 2.9.55 → 2.9.57

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 (31) hide show
  1. package/lib/index.js +2 -0
  2. package/lib/json-compiler/index.js +2 -1
  3. package/lib/platform/json/wx/index.js +0 -1
  4. package/lib/runtime/base.styl +27 -0
  5. package/lib/runtime/components/react/dist/event.config.js +27 -0
  6. package/lib/runtime/components/react/dist/getInnerListeners.js +230 -0
  7. package/lib/runtime/components/react/dist/mpx-button.jsx +270 -0
  8. package/lib/runtime/components/react/dist/mpx-image/index.jsx +229 -0
  9. package/lib/runtime/components/react/dist/mpx-image/svg.jsx +6 -0
  10. package/lib/runtime/components/react/dist/mpx-input.jsx +203 -0
  11. package/lib/runtime/components/react/dist/mpx-scroll-view.jsx +294 -0
  12. package/lib/runtime/components/react/dist/mpx-swiper/carouse.jsx +353 -0
  13. package/lib/runtime/components/react/dist/mpx-swiper/index.jsx +57 -0
  14. package/lib/runtime/components/react/dist/mpx-swiper/type.js +1 -0
  15. package/lib/runtime/components/react/dist/mpx-swiper-item.jsx +25 -0
  16. package/lib/runtime/components/react/dist/mpx-text.jsx +67 -0
  17. package/lib/runtime/components/react/dist/mpx-textarea.jsx +27 -0
  18. package/lib/runtime/components/react/dist/mpx-view.jsx +307 -0
  19. package/lib/runtime/components/react/dist/types/getInnerListeners.js +1 -0
  20. package/lib/runtime/components/react/dist/useNodesRef.js +25 -0
  21. package/lib/runtime/components/react/dist/utils.js +80 -0
  22. package/lib/runtime/components/react/getInnerListeners.ts +1 -1
  23. package/lib/runtime/components/react/mpx-button.tsx +1 -2
  24. package/lib/runtime/components/react/mpx-image/svg.tsx +0 -1
  25. package/lib/runtime/components/react/{getInnerListeners.type.ts → types/getInnerListeners.ts} +2 -2
  26. package/lib/runtime/components/react/types/global.d.ts +15 -0
  27. package/lib/runtime/optionProcessor.js +27 -1
  28. package/lib/template-compiler/compiler.js +72 -25
  29. package/lib/template-compiler/index.js +2 -1
  30. package/lib/web/processTemplate.js +1 -1
  31. package/package.json +7 -4
package/lib/index.js CHANGED
@@ -897,6 +897,8 @@ class MpxWebpackPlugin {
897
897
  runtimeInfo: {},
898
898
  // 记录运行时组件依赖的运行时组件当中使用的基础组件 slot,最终依据依赖关系注入到运行时组件的 json 配置当中
899
899
  dynamicSlotDependencies: {},
900
+ // 模板引擎参数,用来检测模板引擎支持渲染的模板
901
+ dynamicTemplateRuleRunner: this.options.dynamicTemplateRuleRunner,
900
902
  // 依据 package 注入到 mpx-custom-element-*.json 里面的组件路径
901
903
  getPackageInjectedComponentsMap: (packageName = 'main') => {
902
904
  const res = {}
@@ -706,7 +706,8 @@ module.exports = function (content) {
706
706
  for (const root in subPackagesCfg) {
707
707
  const subPackageCfg = subPackagesCfg[root]
708
708
  // 分包不存在 pages,输出 subPackages 字段会报错
709
- if (subPackageCfg.pages.length) {
709
+ // tt模式下分包异步允许一个分包不存在 pages
710
+ if (subPackageCfg.pages.length || mode === 'tt') {
710
711
  if (!json.subPackages) {
711
712
  json.subPackages = []
712
713
  }
@@ -153,7 +153,6 @@ module.exports = function getSpec ({ warn, error }) {
153
153
  test: 'componentPlaceholder',
154
154
  ali: aliComponentPlaceholderFallback,
155
155
  swan: deletePath(),
156
- tt: deletePath(),
157
156
  jd: deletePath()
158
157
  },
159
158
  {
@@ -128,3 +128,30 @@ page {
128
128
  font-family "weui"
129
129
  src url('data:application/octet-stream;base64,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') format('truetype')
130
130
  }
131
+
132
+ .mpx-slide-left-enter {
133
+ transform: translateX(100%)
134
+ }
135
+ .mpx-slide-left-enter-active {
136
+ transition: transform 0.3s;
137
+ position: absolute;
138
+ top: 0;
139
+ right: 0;
140
+ left: 0;
141
+ bottom: 0;
142
+ z-index: 100;
143
+ }
144
+ .mpx-slide-left-leave-active {
145
+ transition: transform 0.2s
146
+ }
147
+
148
+ .mpx-slide-right-leave-active {
149
+ position: absolute;
150
+ z-index: 100;
151
+ top: 0;
152
+ right: 0;
153
+ left: 0;
154
+ bottom: 0;
155
+ transform: translateX(100%);
156
+ transition: transform 0.3s
157
+ }
@@ -0,0 +1,27 @@
1
+ const eventConfigMap = {
2
+ bindtap: ['onTouchStart', 'onTouchMove', 'onTouchEnd'],
3
+ bindlongpress: ['onTouchStart', 'onTouchMove', 'onTouchEnd', 'onTouchCancel'],
4
+ bindtouchstart: ['onTouchStart'],
5
+ bindtouchmove: ['onTouchMove'],
6
+ bindtouchend: ['onTouchEnd'],
7
+ bindtouchcancel: ['onTouchCancel'],
8
+ catchtap: ['onTouchStart', 'onTouchMove', 'onTouchEnd'],
9
+ catchlongpress: ['onTouchStart', 'onTouchMove', 'onTouchEnd', 'onTouchCancel'],
10
+ catchtouchstart: ['onTouchStart'],
11
+ catchtouchmove: ['onTouchMove'],
12
+ catchtouchend: ['onTouchEnd'],
13
+ catchtouchcancel: ['onTouchCancel'],
14
+ 'capture-bindtap': ['onTouchStartCapture', 'onTouchMoveCapture', 'onTouchEndCapture'],
15
+ 'capture-bindlongpress': ['onTouchStartCapture', 'onTouchMoveCapture', 'onTouchEndCapture', 'onTouchCancelCapture'],
16
+ 'capture-bindtouchstart': ['onTouchStartCapture'],
17
+ 'capture-bindtouchmove': ['onTouchMoveCapture'],
18
+ 'capture-bindtouchend': ['onTouchEndCapture'],
19
+ 'capture-bindtouchcancel': ['onTouchCancelCapture'],
20
+ 'capture-catchtap': ['onTouchStartCapture', 'onTouchMoveCapture', 'onTouchEndCapture'],
21
+ 'capture-catchlongpress': ['onTouchStartCapture', 'onTouchMoveCapture', 'onTouchEndCapture', 'onTouchCancelCapture'],
22
+ 'capture-catchtouchstart': ['onTouchStartCapture'],
23
+ 'capture-catchtouchmove': ['onTouchMoveCapture'],
24
+ 'capture-catchtouchend': ['onTouchEndCapture'],
25
+ 'capture-catchtouchcancel': ['onTouchCancelCapture']
26
+ };
27
+ export default eventConfigMap;
@@ -0,0 +1,230 @@
1
+ import { useRef } from 'react';
2
+ import { omit } from './utils';
3
+ import eventConfigMap from './event.config';
4
+ const getTouchEvent = (type, event, props, config) => {
5
+ const nativeEvent = event.nativeEvent;
6
+ const { timestamp, pageX, pageY, touches, changedTouches } = nativeEvent;
7
+ const { id } = props;
8
+ const { layoutRef } = config;
9
+ return {
10
+ ...event,
11
+ type,
12
+ timeStamp: timestamp,
13
+ target: {
14
+ ...(event.target || {}),
15
+ id: id || '',
16
+ dataset: getDataSet(props),
17
+ offsetLeft: layoutRef?.current?.offsetLeft || 0,
18
+ offsetTop: layoutRef?.current?.offsetTop || 0
19
+ },
20
+ detail: {
21
+ x: pageX,
22
+ y: pageY
23
+ },
24
+ touches: touches.map(item => {
25
+ return {
26
+ identifier: item.identifier,
27
+ pageX: item.pageX,
28
+ pageY: item.pageY,
29
+ clientX: item.locationX,
30
+ clientY: item.locationY
31
+ };
32
+ }),
33
+ changedTouches: changedTouches.map(item => {
34
+ return {
35
+ identifier: item.identifier,
36
+ pageX: item.pageX,
37
+ pageY: item.pageY,
38
+ clientX: item.locationX,
39
+ clientY: item.locationY
40
+ };
41
+ }),
42
+ persist: event.persist,
43
+ stopPropagation: event.stopPropagation,
44
+ preventDefault: event.preventDefault
45
+ };
46
+ };
47
+ export const getDataSet = (props) => {
48
+ const result = {};
49
+ for (const key in props) {
50
+ if (key.indexOf('data-') === 0) {
51
+ const newKey = key.substr(5);
52
+ result[newKey] = props[key];
53
+ }
54
+ }
55
+ return result;
56
+ };
57
+ export const getCustomEvent = (type = '', oe = {}, { detail = {}, layoutRef }, props = {}) => {
58
+ return {
59
+ ...oe,
60
+ type,
61
+ detail,
62
+ target: {
63
+ ...(oe.target || {}),
64
+ id: props.id || '',
65
+ dataset: getDataSet(props),
66
+ offsetLeft: layoutRef?.current?.offsetLeft || 0,
67
+ offsetTop: layoutRef?.current?.offsetTop || 0
68
+ }
69
+ };
70
+ };
71
+ const useInnerProps = (props = {}, additionalProps = {}, removeProps = [], rawConfig) => {
72
+ const ref = useRef({
73
+ startTimer: {
74
+ bubble: null,
75
+ capture: null
76
+ },
77
+ needPress: {
78
+ bubble: false,
79
+ capture: false
80
+ },
81
+ mpxPressInfo: {
82
+ detail: {
83
+ x: 0,
84
+ y: 0
85
+ }
86
+ }
87
+ });
88
+ const propsRef = useRef({});
89
+ const eventConfig = {};
90
+ const config = rawConfig || {};
91
+ propsRef.current = { ...props, ...additionalProps };
92
+ for (const key in eventConfigMap) {
93
+ if (propsRef.current[key]) {
94
+ eventConfig[key] = eventConfigMap[key];
95
+ }
96
+ }
97
+ if (!(Object.keys(eventConfig).length) || config.disableTouch) {
98
+ return omit(propsRef.current, removeProps);
99
+ }
100
+ function handleEmitEvent(events, type, oe) {
101
+ events.forEach(event => {
102
+ if (propsRef.current[event]) {
103
+ const match = /^(catch|capture-catch):?(.*?)(?:\.(.*))?$/.exec(event);
104
+ if (match) {
105
+ oe.stopPropagation();
106
+ }
107
+ propsRef.current[event](getTouchEvent(type, oe, propsRef.current, config));
108
+ }
109
+ });
110
+ }
111
+ function handleTouchstart(e, type) {
112
+ e.persist();
113
+ const bubbleTouchEvent = ['catchtouchstart', 'bindtouchstart'];
114
+ const bubblePressEvent = ['catchlongpress', 'bindlongpress'];
115
+ const captureTouchEvent = ['capture-catchtouchstart', 'capture-bindtouchstart'];
116
+ const capturePressEvent = ['capture-catchlongpress', 'capture-bindlongpress'];
117
+ ref.current.startTimer[type] = null;
118
+ ref.current.needPress[type] = true;
119
+ const nativeEvent = e.nativeEvent;
120
+ ref.current.mpxPressInfo.detail = {
121
+ x: nativeEvent.changedTouches[0].pageX,
122
+ y: nativeEvent.changedTouches[0].pageY
123
+ };
124
+ const currentTouchEvent = type === 'bubble' ? bubbleTouchEvent : captureTouchEvent;
125
+ const currentPressEvent = type === 'bubble' ? bubblePressEvent : capturePressEvent;
126
+ handleEmitEvent(currentTouchEvent, 'touchstart', e);
127
+ const { catchlongpress, bindlongpress, 'capture-catchlongpress': captureCatchlongpress, 'capture-bindlongpress': captureBindlongpress } = propsRef.current;
128
+ if (catchlongpress || bindlongpress || captureCatchlongpress || captureBindlongpress) {
129
+ ref.current.startTimer[type] = setTimeout(() => {
130
+ ref.current.needPress[type] = false;
131
+ handleEmitEvent(currentPressEvent, 'longpress', e);
132
+ }, 350);
133
+ }
134
+ }
135
+ function handleTouchmove(e, type) {
136
+ const bubbleTouchEvent = ['catchtouchmove', 'bindtouchmove'];
137
+ const captureTouchEvent = ['capture-catchtouchmove', 'capture-bindtouchmove'];
138
+ const tapDetailInfo = ref.current.mpxPressInfo.detail || { x: 0, y: 0 };
139
+ const nativeEvent = e.nativeEvent;
140
+ const currentPageX = nativeEvent.changedTouches[0].pageX;
141
+ const currentPageY = nativeEvent.changedTouches[0].pageY;
142
+ const currentTouchEvent = type === 'bubble' ? bubbleTouchEvent : captureTouchEvent;
143
+ if (Math.abs(currentPageX - tapDetailInfo.x) > 1 || Math.abs(currentPageY - tapDetailInfo.y) > 1) {
144
+ ref.current.needPress[type] = false;
145
+ ref.current.startTimer[type] && clearTimeout(ref.current.startTimer[type]);
146
+ ref.current.startTimer[type] = null;
147
+ }
148
+ handleEmitEvent(currentTouchEvent, 'touchmove', e);
149
+ }
150
+ function handleTouchend(e, type) {
151
+ const bubbleTouchEvent = ['catchtouchend', 'bindtouchend'];
152
+ const bubbleTapEvent = ['catchtap', 'bindtap'];
153
+ const captureTouchEvent = ['capture-catchtouchend', 'capture-bindtouchend'];
154
+ const captureTapEvent = ['capture-catchtap', 'capture-bindtap'];
155
+ const currentTouchEvent = type === 'bubble' ? bubbleTouchEvent : captureTouchEvent;
156
+ const currentTapEvent = type === 'bubble' ? bubbleTapEvent : captureTapEvent;
157
+ ref.current.startTimer[type] && clearTimeout(ref.current.startTimer[type]);
158
+ ref.current.startTimer[type] = null;
159
+ handleEmitEvent(currentTouchEvent, 'touchend', e);
160
+ if (ref.current.needPress[type]) {
161
+ handleEmitEvent(currentTapEvent, 'tap', e);
162
+ }
163
+ }
164
+ function handleTouchcancel(e, type) {
165
+ const bubbleTouchEvent = ['catchtouchcancel', 'bindtouchcancel'];
166
+ const captureTouchEvent = ['capture-catchtouchcancel', 'capture-bindtouchcancel'];
167
+ const currentTouchEvent = type === 'bubble' ? bubbleTouchEvent : captureTouchEvent;
168
+ ref.current.startTimer[type] && clearTimeout(ref.current.startTimer[type]);
169
+ ref.current.startTimer[type] = null;
170
+ handleEmitEvent(currentTouchEvent, 'touchcancel', e);
171
+ }
172
+ const touchEventList = [{
173
+ eventName: 'onTouchStart',
174
+ handler: (e) => {
175
+ handleTouchstart(e, 'bubble');
176
+ }
177
+ }, {
178
+ eventName: 'onTouchMove',
179
+ handler: (e) => {
180
+ handleTouchmove(e, 'bubble');
181
+ }
182
+ }, {
183
+ eventName: 'onTouchEnd',
184
+ handler: (e) => {
185
+ handleTouchend(e, 'bubble');
186
+ }
187
+ }, {
188
+ eventName: 'onTouchCancel',
189
+ handler: (e) => {
190
+ handleTouchcancel(e, 'bubble');
191
+ }
192
+ }, {
193
+ eventName: 'onTouchStartCapture',
194
+ handler: (e) => {
195
+ handleTouchstart(e, 'capture');
196
+ }
197
+ }, {
198
+ eventName: 'onTouchMoveCapture',
199
+ handler: (e) => {
200
+ handleTouchmove(e, 'capture');
201
+ }
202
+ }, {
203
+ eventName: 'onTouchEndCapture',
204
+ handler: (e) => {
205
+ handleTouchend(e, 'capture');
206
+ }
207
+ }, {
208
+ eventName: 'onTouchCancelCapture',
209
+ handler: (e) => {
210
+ handleTouchcancel(e, 'capture');
211
+ }
212
+ }];
213
+ const events = {};
214
+ const transformedEventKeys = [];
215
+ for (const key in eventConfig) {
216
+ transformedEventKeys.push(...eventConfig[key]);
217
+ }
218
+ const finalEventKeys = [...new Set(transformedEventKeys)];
219
+ touchEventList.forEach(item => {
220
+ if (finalEventKeys.includes(item.eventName)) {
221
+ events[item.eventName] = item.handler;
222
+ }
223
+ });
224
+ const rawEventKeys = Object.keys(eventConfig);
225
+ return {
226
+ ...events,
227
+ ...omit(propsRef.current, [...rawEventKeys, ...removeProps])
228
+ };
229
+ };
230
+ export default useInnerProps;
@@ -0,0 +1,270 @@
1
+ /**
2
+ * ✔ size
3
+ * ✔ type
4
+ * ✔ plain
5
+ * ✔ disabled
6
+ * ✔ loading
7
+ * ✘ form-type
8
+ * - open-type: Partially. Only support `share`、`getUserInfo`
9
+ * ✔ hover-class: Convert hoverClass to hoverStyle.
10
+ * ✔ hover-style
11
+ * ✘ hover-stop-propagation
12
+ * ✔ hover-start-time
13
+ * ✔ hover-stay-time
14
+ * ✘ lang
15
+ * ✘ session-from
16
+ * ✘ send-message-title
17
+ * ✘ send-message-path
18
+ * ✘ send-message-img
19
+ * ✘ app-parameter
20
+ * ✘ show-message-card
21
+ * ✘ phone-number-no-quota-toast
22
+ * ✘ bindgetuserinfo
23
+ * ✘ bindcontact
24
+ * ✘ createliveactivity
25
+ * ✘ bindgetphonenumber
26
+ * ✘ bindgetphonenumber
27
+ * ✘ bindgetrealtimephonenumber
28
+ * ✘ binderror
29
+ * ✘ bindopensetting
30
+ * ✘ bindlaunchapp
31
+ * ✘ bindlaunchapp
32
+ * ✘ bindchooseavatar
33
+ * ✘ bindchooseavatar
34
+ * ✘ bindagreeprivacyauthorization
35
+ * ✔ bindtap
36
+ */
37
+ import React, { useEffect, useRef, useState, forwardRef, } from 'react';
38
+ import { View, Text, StyleSheet, Animated, Easing, } from 'react-native';
39
+ import { extractTextStyle, isText, every } from './utils';
40
+ import useInnerProps, { getCustomEvent } from './getInnerListeners';
41
+ import useNodesRef from './useNodesRef';
42
+ const LOADING_IMAGE_URI = 'data:image/png;base64,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';
43
+ const TypeColorMap = {
44
+ default: ['#F8F8F8', '#DEDEDE', '35,35,35', '#F7F7F7'],
45
+ primary: ['#1AAD19', '#179B16', '26,173,25', '#9ED99D'],
46
+ warn: ['#E64340', '#CE3C39', '230,67,64', '#EC8B89'],
47
+ };
48
+ const OpenTypeEventsMap = new Map([
49
+ ['share', 'onShareAppMessage'],
50
+ ['getUserInfo', 'onUserInfo'],
51
+ ]);
52
+ const styles = StyleSheet.create({
53
+ button: {
54
+ width: '100%',
55
+ flexDirection: 'row',
56
+ justifyContent: 'center',
57
+ alignItems: 'center',
58
+ height: 46,
59
+ borderRadius: 5,
60
+ backgroundColor: '#F8F8F8',
61
+ marginHorizontal: 'auto' // 按钮默认居中
62
+ },
63
+ buttonMini: {
64
+ height: 30,
65
+ },
66
+ text: {
67
+ fontSize: 18,
68
+ color: '#000000',
69
+ },
70
+ textMini: {
71
+ fontSize: 13,
72
+ },
73
+ loading: {
74
+ width: 20,
75
+ height: 20,
76
+ },
77
+ });
78
+ const getOpenTypeEvent = (openType) => {
79
+ // @ts-ignore
80
+ if (!global?.__mpx?.config?.rnConfig) {
81
+ console.warn('Environment not supported');
82
+ return;
83
+ }
84
+ const eventName = OpenTypeEventsMap.get(openType);
85
+ if (!eventName) {
86
+ console.warn(`open-type not support ${openType}`);
87
+ return;
88
+ }
89
+ // @ts-ignore
90
+ const event = global.__mpx.config.rnConfig?.openTypeHandler?.[eventName];
91
+ if (!event) {
92
+ console.warn(`Unregistered ${eventName} event`);
93
+ return;
94
+ }
95
+ return event;
96
+ };
97
+ const Loading = ({ alone = false }) => {
98
+ const image = useRef(new Animated.Value(0)).current;
99
+ const rotate = image.interpolate({
100
+ inputRange: [0, 1],
101
+ outputRange: ['0deg', '360deg'],
102
+ });
103
+ useEffect(() => {
104
+ const animation = Animated.loop(Animated.timing(image, {
105
+ toValue: 1,
106
+ duration: 1000,
107
+ easing: Easing.linear,
108
+ useNativeDriver: true,
109
+ isInteraction: false,
110
+ }));
111
+ animation.start();
112
+ return () => {
113
+ animation.stop();
114
+ };
115
+ // eslint-disable-next-line react-hooks/exhaustive-deps
116
+ }, []);
117
+ const loadingStyle = {
118
+ ...styles.loading,
119
+ transform: [{ rotate }],
120
+ marginRight: alone ? 0 : 5,
121
+ };
122
+ return <Animated.Image testID="loading" style={loadingStyle} source={{ uri: LOADING_IMAGE_URI }}/>;
123
+ };
124
+ const Button = forwardRef((props, ref) => {
125
+ const { size = 'default', type = 'default', plain = false, disabled = false, loading = false, 'hover-class': hoverClass, 'hover-style': hoverStyle = [], 'hover-start-time': hoverStartTime = 20, 'hover-stay-time': hoverStayTime = 70, 'open-type': openType, 'enable-offset': enableOffset, style = [], children, bindgetuserinfo, bindtap, catchtap, bindtouchstart, bindtouchend, } = props;
126
+ const refs = useRef({
127
+ hoverStartTimer: undefined,
128
+ hoverStayTimer: undefined,
129
+ });
130
+ const layoutRef = useRef({});
131
+ const [isHover, setIsHover] = useState(false);
132
+ const isMiniSize = size === 'mini';
133
+ const applyHoverEffect = isHover && hoverClass !== 'none';
134
+ const inheritTextStyle = extractTextStyle(style);
135
+ const textHoverStyle = extractTextStyle(hoverStyle);
136
+ const [color, hoverColor, plainColor, disabledColor] = TypeColorMap[type];
137
+ const normalBackgroundColor = disabled ? disabledColor : applyHoverEffect || loading ? hoverColor : color;
138
+ const plainBorderColor = disabled
139
+ ? 'rgba(0, 0, 0, .2)'
140
+ : applyHoverEffect
141
+ ? `rgba(${plainColor},.6)`
142
+ : `rgb(${plainColor})`;
143
+ const normalBorderColor = type === 'default' ? 'rgba(0, 0, 0, .2)' : normalBackgroundColor;
144
+ const plainTextColor = disabled
145
+ ? 'rgba(0, 0, 0, .2)'
146
+ : applyHoverEffect
147
+ ? `rgba(${plainColor}, .6)`
148
+ : `rgb(${plainColor})`;
149
+ const normalTextColor = type === 'default'
150
+ ? `rgba(0, 0, 0, ${disabled ? 0.3 : applyHoverEffect || loading ? 0.6 : 1})`
151
+ : `rgba(255 ,255 ,255 , ${disabled || applyHoverEffect || loading ? 0.6 : 1})`;
152
+ const viewStyle = {
153
+ borderWidth: 1,
154
+ borderStyle: 'solid',
155
+ borderColor: plain ? plainBorderColor : normalBorderColor,
156
+ backgroundColor: plain ? 'transparent' : normalBackgroundColor,
157
+ };
158
+ const textStyle = {
159
+ color: plain ? plainTextColor : normalTextColor,
160
+ ...inheritTextStyle
161
+ };
162
+ const defaultViewStyle = [
163
+ styles.button,
164
+ isMiniSize && styles.buttonMini || {},
165
+ viewStyle,
166
+ ];
167
+ const defaultTextStyle = [
168
+ styles.text, isMiniSize && styles.textMini, textStyle
169
+ ];
170
+ const handleOpenTypeEvent = (evt) => {
171
+ if (!openType)
172
+ return;
173
+ const handleEvent = getOpenTypeEvent(openType);
174
+ if (openType === 'share') {
175
+ handleEvent && handleEvent({
176
+ from: 'button',
177
+ target: getCustomEvent('tap', evt, { layoutRef }, props).target,
178
+ });
179
+ }
180
+ if (openType === 'getUserInfo') {
181
+ const userInfo = handleEvent && handleEvent();
182
+ if (typeof userInfo === 'object') {
183
+ bindgetuserinfo && bindgetuserinfo(userInfo);
184
+ }
185
+ }
186
+ };
187
+ const setStayTimer = () => {
188
+ clearTimeout(refs.current.hoverStayTimer);
189
+ refs.current.hoverStayTimer = setTimeout(() => {
190
+ setIsHover(false);
191
+ clearTimeout(refs.current.hoverStayTimer);
192
+ }, hoverStayTime);
193
+ };
194
+ const setStartTimer = () => {
195
+ clearTimeout(refs.current.hoverStartTimer);
196
+ refs.current.hoverStartTimer = setTimeout(() => {
197
+ setIsHover(true);
198
+ clearTimeout(refs.current.hoverStartTimer);
199
+ }, hoverStartTime);
200
+ };
201
+ const onTouchStart = (evt) => {
202
+ bindtouchstart && bindtouchstart(evt);
203
+ if (disabled)
204
+ return;
205
+ setStartTimer();
206
+ };
207
+ const onTouchEnd = (evt) => {
208
+ bindtouchend && bindtouchend(evt);
209
+ if (disabled)
210
+ return;
211
+ setStayTimer();
212
+ };
213
+ const onTap = (evt) => {
214
+ if (disabled)
215
+ return;
216
+ bindtap && bindtap(getCustomEvent('tap', evt, { layoutRef }, props));
217
+ handleOpenTypeEvent(evt);
218
+ };
219
+ const catchTap = (evt) => {
220
+ if (disabled)
221
+ return;
222
+ catchtap && catchtap(getCustomEvent('tap', evt, { layoutRef }, props));
223
+ };
224
+ function wrapChildren(children, textStyle) {
225
+ if (every(children, (child) => isText(child))) {
226
+ children = [<Text key='buttonTextWrap' style={textStyle}>{children}</Text>];
227
+ }
228
+ else {
229
+ if (textStyle)
230
+ console.warn('Text style will be ignored unless every child of the Button is Text node!');
231
+ }
232
+ return children;
233
+ }
234
+ const { nodeRef } = useNodesRef(props, ref, {
235
+ defaultStyle: StyleSheet.flatten([
236
+ ...defaultViewStyle,
237
+ ...defaultTextStyle,
238
+ ])
239
+ });
240
+ const onLayout = () => {
241
+ nodeRef.current?.measure((x, y, width, height, offsetLeft, offsetTop) => {
242
+ layoutRef.current = { x, y, width, height, offsetLeft, offsetTop };
243
+ });
244
+ };
245
+ const innerProps = useInnerProps(props, {
246
+ ref: nodeRef,
247
+ bindtouchstart: onTouchStart,
248
+ bindtouchend: onTouchEnd,
249
+ bindtap: onTap,
250
+ catchtap: catchTap,
251
+ ...(enableOffset ? { onLayout } : {}),
252
+ }, [
253
+ 'enable-offset'
254
+ ], {
255
+ layoutRef
256
+ });
257
+ return (<View {...innerProps} style={[
258
+ ...defaultViewStyle,
259
+ style,
260
+ applyHoverEffect && hoverStyle,
261
+ ]}>
262
+ {loading && <Loading alone={!children}/>}
263
+ {wrapChildren(children, [
264
+ ...defaultTextStyle,
265
+ applyHoverEffect && textHoverStyle,
266
+ ])}
267
+ </View>);
268
+ });
269
+ Button.displayName = 'mpx-button';
270
+ export default Button;