@momo-kits/foundation 0.161.1-beta.2 → 0.161.2-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.
- package/Application/BottomSheet.tsx +4 -3
- package/Application/BottomTab/BottomTabBar.tsx +2 -2
- package/Application/BottomTab/CustomBottomTabItem.tsx +1 -1
- package/Application/BottomTab/index.tsx +1 -1
- package/Application/Components/HeaderBackground.tsx +1 -1
- package/Application/Components/HeaderExtendHeader.tsx +1 -1
- package/Application/Components/HeaderTitle.tsx +1 -1
- package/Application/Components/SearchHeader.tsx +1 -1
- package/Application/NavigationContainer.tsx +21 -25
- package/Application/ScaleSizeProvider.tsx +16 -0
- package/Application/WidgetContainer.tsx +7 -18
- package/Application/index.ts +2 -0
- package/Application/types.ts +6 -0
- package/Badge/Badge.tsx +3 -9
- package/Badge/BadgeDot.tsx +1 -1
- package/Badge/BadgeRibbon.tsx +1 -1
- package/Button/index.tsx +2 -2
- package/CheckBox/index.tsx +1 -1
- package/Context/index.ts +4 -0
- package/Icon/index.tsx +1 -1
- package/IconButton/index.tsx +1 -1
- package/Image/index.tsx +13 -3
- package/Input/Input.tsx +1 -1
- package/Input/InputDropDown.tsx +1 -1
- package/Input/InputMoney.tsx +1 -1
- package/Input/InputOTP.tsx +1 -1
- package/Input/InputPhoneNumber.tsx +1 -1
- package/Input/InputSearch.tsx +1 -1
- package/Input/InputTextArea.tsx +10 -4
- package/Layout/Item.tsx +1 -1
- package/Layout/Screen.tsx +5 -4
- package/Pagination/PaginationDot.tsx +1 -1
- package/Pagination/PaginationNumber.tsx +1 -1
- package/Pagination/PaginationScroll.tsx +1 -1
- package/Pagination/PaginationWhiteDot.tsx +1 -1
- package/Popup/PopupNotify.tsx +1 -1
- package/Popup/PopupPromotion.tsx +1 -1
- package/Radio/index.tsx +1 -1
- package/Switch/index.tsx +1 -1
- package/Tag/index.tsx +1 -1
- package/Text/index.tsx +1 -1
- package/Text/utils.ts +41 -18
- package/Title/index.tsx +1 -1
- package/package.json +34 -34
|
@@ -37,9 +37,10 @@ const BottomSheet: React.FC<BottomSheetParams> = props => {
|
|
|
37
37
|
const action = useRef<undefined | string>(undefined);
|
|
38
38
|
const insets = useSafeAreaInsets();
|
|
39
39
|
const heightHeader = useHeaderHeight();
|
|
40
|
-
const
|
|
40
|
+
const bottomInset = Platform.OS === 'ios' ? Math.min(insets.bottom, 21) : insets.bottom;
|
|
41
|
+
const keyboardOffset = heightHeader - bottomInset;
|
|
41
42
|
|
|
42
|
-
const showBaseLineDebug = context?.
|
|
43
|
+
const showBaseLineDebug = context?.features?.showBaseLineDebug ?? false;
|
|
43
44
|
|
|
44
45
|
const {
|
|
45
46
|
screen: Screen,
|
|
@@ -311,7 +312,7 @@ const BottomSheet: React.FC<BottomSheetParams> = props => {
|
|
|
311
312
|
{useBottomInset && (
|
|
312
313
|
<View
|
|
313
314
|
style={{
|
|
314
|
-
height:
|
|
315
|
+
height: bottomInset,
|
|
315
316
|
backgroundColor: backgroundColor,
|
|
316
317
|
}}
|
|
317
318
|
/>
|
|
@@ -63,7 +63,7 @@ export default function BottomTabBar({
|
|
|
63
63
|
const focusedTab = state?.routes[state.index]?.name || routes[0]?.params;
|
|
64
64
|
|
|
65
65
|
const context = useContext<any>(MiniAppContext);
|
|
66
|
-
const showBaseLineDebug = context?.
|
|
66
|
+
const showBaseLineDebug = context?.features?.showBaseLineDebug ?? false;
|
|
67
67
|
|
|
68
68
|
/**
|
|
69
69
|
* render tab item
|
|
@@ -299,7 +299,7 @@ const styles = StyleSheet.create({
|
|
|
299
299
|
left: 0,
|
|
300
300
|
right: 0,
|
|
301
301
|
top: -2,
|
|
302
|
-
bottom: Platform.OS === 'ios' ? -6 : 4
|
|
302
|
+
bottom: Platform.OS === 'ios' ? -6 : 4
|
|
303
303
|
},
|
|
304
304
|
floatingContent: {
|
|
305
305
|
alignItems: 'center',
|
|
@@ -61,7 +61,7 @@ const CustomBottomTabItem: React.FC<CustomBottomTabItemProps> = ({
|
|
|
61
61
|
allowFontScaling,
|
|
62
62
|
}) => {
|
|
63
63
|
const context = useContext<any>(MiniAppContext);
|
|
64
|
-
const showBaseLineDebug = context?.
|
|
64
|
+
const showBaseLineDebug = context?.features?.showBaseLineDebug ?? false;
|
|
65
65
|
|
|
66
66
|
const renderIcon = () => {
|
|
67
67
|
if (icon === undefined) {
|
|
@@ -320,7 +320,7 @@ const BottomTab: React.FC<BottomTabProps> = ({
|
|
|
320
320
|
activeTintColor={theme.colors.primary}
|
|
321
321
|
style={[
|
|
322
322
|
{
|
|
323
|
-
height: 64 + Math.min(insets.bottom, 21),
|
|
323
|
+
height: 64 + (Platform.OS === 'ios' ? Math.min(insets.bottom, 21) : insets.bottom),
|
|
324
324
|
},
|
|
325
325
|
]}
|
|
326
326
|
/>
|
|
@@ -24,7 +24,7 @@ const HeaderBackground: React.FC<HeaderBackgroundProps> = ({
|
|
|
24
24
|
const gradientColor = customGradientColor ?? theme.colors.gradient;
|
|
25
25
|
const headerImage = headerBackground ?? theme.assets?.headerBackground;
|
|
26
26
|
|
|
27
|
-
const showBaseLineDebug = context?.
|
|
27
|
+
const showBaseLineDebug = context?.features?.showBaseLineDebug ?? false;
|
|
28
28
|
|
|
29
29
|
const opacityBackground = animatedValue?.interpolate({
|
|
30
30
|
inputRange: [0, 52],
|
|
@@ -49,7 +49,7 @@ const HeaderExtendHeader: React.FC<{
|
|
|
49
49
|
const headerBackground = customBackground ?? theme.assets?.headerBackground;
|
|
50
50
|
const leftPosition = inputSearchProps?.leftPosition || BACK_WIDTH + 20;
|
|
51
51
|
|
|
52
|
-
const showBaseLineDebug = context?.
|
|
52
|
+
const showBaseLineDebug = context?.features?.showBaseLineDebug ?? false;
|
|
53
53
|
|
|
54
54
|
const opacityBackground = animatedValue?.interpolate({
|
|
55
55
|
inputRange: [0, 52],
|
|
@@ -24,7 +24,7 @@ import { Skeleton } from '../../Skeleton';
|
|
|
24
24
|
const HeaderTitle: React.FC<any> = props => {
|
|
25
25
|
const context = useContext<any>(MiniAppContext);
|
|
26
26
|
|
|
27
|
-
const showBaseLineDebug = context?.
|
|
27
|
+
const showBaseLineDebug = context?.features?.showBaseLineDebug ?? false;
|
|
28
28
|
|
|
29
29
|
const opacity = props.animatedValue?.interpolate(
|
|
30
30
|
props.interpolate ?? {
|
|
@@ -77,7 +77,7 @@ const SearchHeader = React.forwardRef<InputRef, SearchHeaderProps>(
|
|
|
77
77
|
return true;
|
|
78
78
|
};
|
|
79
79
|
|
|
80
|
-
const showBaseLineDebug = context?.
|
|
80
|
+
const showBaseLineDebug = context?.features?.showBaseLineDebug ?? false;
|
|
81
81
|
|
|
82
82
|
return (
|
|
83
83
|
<View
|
|
@@ -16,6 +16,7 @@ import { DeviceEventEmitter } from 'react-native';
|
|
|
16
16
|
import StackScreen from './StackScreen';
|
|
17
17
|
import ModalScreen from './ModalScreen';
|
|
18
18
|
import Navigator from './Navigator';
|
|
19
|
+
import ScaleSizeProvider from './ScaleSizeProvider';
|
|
19
20
|
import { getModalOptions, getStackOptions } from './utils';
|
|
20
21
|
import { NavigationContainerProps } from './types';
|
|
21
22
|
import { ApplicationContext, MiniAppContext } from '../Context';
|
|
@@ -35,44 +36,39 @@ const NavigationContainer: React.FC<NavigationContainerProps> = ({
|
|
|
35
36
|
maxApi,
|
|
36
37
|
initialParams,
|
|
37
38
|
localize = new Localize({ vi: {}, en: {} }),
|
|
39
|
+
features = {
|
|
40
|
+
enableBottomTabAnimation: true,
|
|
41
|
+
enableHapticDialog: true,
|
|
42
|
+
enableForceFoundationList: false,
|
|
43
|
+
enableHapticBottomTab: true,
|
|
44
|
+
},
|
|
38
45
|
}) => {
|
|
39
46
|
const context = useContext<any>(MiniAppContext);
|
|
40
47
|
const [currentContext, setCurrentContext] = useState<any>({});
|
|
41
|
-
const [allowFontScale, setAllowFontScale] = useState<boolean>(
|
|
42
|
-
context?.designSystemConfig?.allowFontScale ?? true,
|
|
43
|
-
);
|
|
44
|
-
|
|
45
|
-
useEffect(() => {
|
|
46
|
-
const sub = maxApi?.observer?.('use_font_scale', (value: boolean) => {
|
|
47
|
-
setAllowFontScale(value ?? true);
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
return () => {
|
|
51
|
-
sub?.remove?.();
|
|
52
|
-
};
|
|
53
|
-
}, []);
|
|
54
48
|
|
|
55
49
|
const mergedContext = {
|
|
56
50
|
...context,
|
|
57
51
|
...currentContext,
|
|
58
|
-
|
|
59
|
-
...context?.
|
|
60
|
-
|
|
52
|
+
features: {
|
|
53
|
+
...context?.features,
|
|
54
|
+
...features,
|
|
61
55
|
},
|
|
62
56
|
};
|
|
63
57
|
|
|
64
58
|
return (
|
|
65
59
|
<SafeAreaProvider>
|
|
66
60
|
<MiniAppContext.Provider value={mergedContext}>
|
|
67
|
-
<
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
61
|
+
<ScaleSizeProvider scaleSizeMaxRate={mergedContext?.scaleSizeMaxRate}>
|
|
62
|
+
<Navigation
|
|
63
|
+
screen={screen}
|
|
64
|
+
theme={theme}
|
|
65
|
+
options={options}
|
|
66
|
+
maxApi={maxApi}
|
|
67
|
+
setCurrentContext={setCurrentContext}
|
|
68
|
+
initialParams={initialParams}
|
|
69
|
+
localize={localize}
|
|
70
|
+
/>
|
|
71
|
+
</ScaleSizeProvider>
|
|
76
72
|
</MiniAppContext.Provider>
|
|
77
73
|
</SafeAreaProvider>
|
|
78
74
|
);
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import React, { FC } from 'react';
|
|
2
|
+
import { ScaleSizeContext } from '../Context';
|
|
3
|
+
import { ScaleSizeProviderProps } from './types';
|
|
4
|
+
|
|
5
|
+
const ScaleSizeProvider: FC<ScaleSizeProviderProps> = ({
|
|
6
|
+
scaleSizeMaxRate,
|
|
7
|
+
children,
|
|
8
|
+
}) => {
|
|
9
|
+
return (
|
|
10
|
+
<ScaleSizeContext.Provider value={{ scaleSizeMaxRate }}>
|
|
11
|
+
{children}
|
|
12
|
+
</ScaleSizeContext.Provider>
|
|
13
|
+
);
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export default ScaleSizeProvider;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import React, { useContext,
|
|
1
|
+
import React, { useContext, useRef, useState } from 'react';
|
|
2
2
|
import { SafeAreaProvider } from 'react-native-safe-area-context';
|
|
3
3
|
import Navigator from './Navigator';
|
|
4
|
+
import ScaleSizeProvider from './ScaleSizeProvider';
|
|
4
5
|
import { WidgetContainerProps } from './types';
|
|
5
6
|
import { ApplicationContext, MiniAppContext } from '../Context';
|
|
6
7
|
import Localize from './Localize';
|
|
@@ -42,19 +43,7 @@ const WidgetContainer: React.FC<WidgetContainerProps> = ({
|
|
|
42
43
|
const isReady = useRef(false);
|
|
43
44
|
const navigator = useRef(new Navigator(navigationRef, isReady, true));
|
|
44
45
|
const [currentContext, setCurrentContext] = useState({});
|
|
45
|
-
const [allowFontScale, setAllowFontScale] = useState<boolean>(
|
|
46
|
-
context?.designSystemConfig?.allowFontScale ?? true,
|
|
47
|
-
);
|
|
48
|
-
|
|
49
|
-
useEffect(() => {
|
|
50
|
-
const sub = maxApi?.observer?.('use_font_scale', (value: boolean) => {
|
|
51
|
-
setAllowFontScale(value ?? true);
|
|
52
|
-
});
|
|
53
46
|
|
|
54
|
-
return () => {
|
|
55
|
-
sub?.remove?.();
|
|
56
|
-
};
|
|
57
|
-
}, []);
|
|
58
47
|
let headerBackground = context?.designConfig?.headerBar;
|
|
59
48
|
let headerGradient = theme.colors?.gradient;
|
|
60
49
|
|
|
@@ -82,16 +71,15 @@ const WidgetContainer: React.FC<WidgetContainerProps> = ({
|
|
|
82
71
|
const mergedContext = {
|
|
83
72
|
...context,
|
|
84
73
|
...currentContext,
|
|
85
|
-
designSystemConfig: {
|
|
86
|
-
...context?.designSystemConfig,
|
|
87
|
-
allowFontScale,
|
|
88
|
-
},
|
|
89
74
|
};
|
|
90
75
|
|
|
91
76
|
return (
|
|
92
|
-
<View style={{ height: height ?? '100%', minHeight:
|
|
77
|
+
<View style={{ height: height ?? '100%', minHeight:1 }}>
|
|
93
78
|
<SafeAreaProvider>
|
|
94
79
|
<MiniAppContext.Provider value={mergedContext}>
|
|
80
|
+
<ScaleSizeProvider
|
|
81
|
+
scaleSizeMaxRate={mergedContext?.scaleSizeMaxRate}
|
|
82
|
+
>
|
|
95
83
|
<ApplicationContext.Provider
|
|
96
84
|
value={{
|
|
97
85
|
navigator: navigator.current,
|
|
@@ -169,6 +157,7 @@ const WidgetContainer: React.FC<WidgetContainerProps> = ({
|
|
|
169
157
|
</ReactNavigationContainer>
|
|
170
158
|
</NavigationIndependentTree>
|
|
171
159
|
</ApplicationContext.Provider>
|
|
160
|
+
</ScaleSizeProvider>
|
|
172
161
|
</MiniAppContext.Provider>
|
|
173
162
|
</SafeAreaProvider>
|
|
174
163
|
</View>
|
package/Application/index.ts
CHANGED
|
@@ -16,6 +16,7 @@ export * from './Components/SearchHeader';
|
|
|
16
16
|
import { exportHeaderTitle, setAutomationID, useComponentId } from './utils';
|
|
17
17
|
import Navigation from './Navigation';
|
|
18
18
|
import Navigator from './Navigator';
|
|
19
|
+
import ScaleSizeProvider from './ScaleSizeProvider';
|
|
19
20
|
import { useTooltipPortal } from './TooltipPortal';
|
|
20
21
|
|
|
21
22
|
export {
|
|
@@ -28,5 +29,6 @@ export {
|
|
|
28
29
|
Navigation,
|
|
29
30
|
Navigator,
|
|
30
31
|
exportHeaderTitle,
|
|
32
|
+
ScaleSizeProvider,
|
|
31
33
|
useTooltipPortal,
|
|
32
34
|
};
|
package/Application/types.ts
CHANGED
|
@@ -107,6 +107,11 @@ export type Theme = {
|
|
|
107
107
|
};
|
|
108
108
|
};
|
|
109
109
|
|
|
110
|
+
export type ScaleSizeProviderProps = {
|
|
111
|
+
scaleSizeMaxRate?: number;
|
|
112
|
+
children: ViewProps['children'];
|
|
113
|
+
};
|
|
114
|
+
|
|
110
115
|
export type Context = {
|
|
111
116
|
[key: string]: any;
|
|
112
117
|
theme: Theme;
|
|
@@ -153,6 +158,7 @@ export type NavigationContainerProps = {
|
|
|
153
158
|
maxApi: any;
|
|
154
159
|
initialParams?: any;
|
|
155
160
|
localize: LocalizeProps;
|
|
161
|
+
features?: FeatureFlags;
|
|
156
162
|
};
|
|
157
163
|
|
|
158
164
|
export type WidgetContainerProps = {
|
package/Badge/Badge.tsx
CHANGED
|
@@ -18,8 +18,8 @@ const Badge: FC<BadgeProps> = ({
|
|
|
18
18
|
const { componentId } = useComponentId('Badge', accessibilityLabel);
|
|
19
19
|
const scaledSize = useScaleSize(16);
|
|
20
20
|
|
|
21
|
-
const showBaseLineDebug = context?.
|
|
22
|
-
|
|
21
|
+
const showBaseLineDebug = context?.features?.showBaseLineDebug ?? false;
|
|
22
|
+
|
|
23
23
|
const styles = StyleSheet.create({
|
|
24
24
|
badge: {
|
|
25
25
|
paddingHorizontal: Spacing.XS,
|
|
@@ -84,13 +84,7 @@ const Badge: FC<BadgeProps> = ({
|
|
|
84
84
|
}
|
|
85
85
|
|
|
86
86
|
return (
|
|
87
|
-
<View
|
|
88
|
-
style={[
|
|
89
|
-
style,
|
|
90
|
-
styles.badgeContainer,
|
|
91
|
-
showBaseLineDebug && styles.debugBaseLine,
|
|
92
|
-
]}
|
|
93
|
-
>
|
|
87
|
+
<View style={[style, styles.badgeContainer, showBaseLineDebug && styles.debugBaseLine]}>
|
|
94
88
|
<View
|
|
95
89
|
style={[styles.badge, { backgroundColor: badgeColor }]}
|
|
96
90
|
accessibilityLabel={componentId}
|
package/Badge/BadgeDot.tsx
CHANGED
|
@@ -9,7 +9,7 @@ const BadgeDot: FC<BadgeDotProps> = ({ size = 'large', style }) => {
|
|
|
9
9
|
let dotStyle;
|
|
10
10
|
let dotContainerStyle;
|
|
11
11
|
|
|
12
|
-
const showBaseLineDebug = context?.
|
|
12
|
+
const showBaseLineDebug = context?.features?.showBaseLineDebug ?? false;
|
|
13
13
|
|
|
14
14
|
if (size === 'large') {
|
|
15
15
|
dotStyle = styles.dot;
|
package/Badge/BadgeRibbon.tsx
CHANGED
|
@@ -19,7 +19,7 @@ const BadgeRibbon: FC<BadgeRibbonProps> = ({
|
|
|
19
19
|
const isRight = position === 'top_right' || position === 'bottom_right';
|
|
20
20
|
const isUpTail = position === 'bottom_left' || position === 'top_right';
|
|
21
21
|
|
|
22
|
-
const showBaseLineDebug = context?.
|
|
22
|
+
const showBaseLineDebug = context?.features?.showBaseLineDebug ?? false;
|
|
23
23
|
|
|
24
24
|
const ribbonRotate = useMemo(() => (isRight ? '180deg' : '0deg'), [isRight]);
|
|
25
25
|
const textRotate = ribbonRotate;
|
package/Button/index.tsx
CHANGED
|
@@ -77,7 +77,7 @@ const Button: FC<ButtonProps> = ({
|
|
|
77
77
|
const animationRef = useRef<LottieView>(null);
|
|
78
78
|
const pressAnim = useSharedValue(0);
|
|
79
79
|
|
|
80
|
-
const showBaseLineDebug = context?.
|
|
80
|
+
const showBaseLineDebug = context?.features?.showBaseLineDebug ?? false;
|
|
81
81
|
|
|
82
82
|
const componentName = 'Button';
|
|
83
83
|
const { componentId } = useComponentId(
|
|
@@ -355,7 +355,7 @@ const Button: FC<ButtonProps> = ({
|
|
|
355
355
|
onPressOut={animateOut}
|
|
356
356
|
>
|
|
357
357
|
<Reanimated.View style={[buttonStyle, animatedStyle]}>
|
|
358
|
-
|
|
358
|
+
{renderIcon('left')}
|
|
359
359
|
{renderTitle()}
|
|
360
360
|
{renderIcon('right')}
|
|
361
361
|
{gradientPros && (
|
package/CheckBox/index.tsx
CHANGED
|
@@ -34,7 +34,7 @@ const CheckBox: FC<CheckBoxProps> = ({
|
|
|
34
34
|
props.accessibilityLabel,
|
|
35
35
|
);
|
|
36
36
|
|
|
37
|
-
const showBaseLineDebug = context?.
|
|
37
|
+
const showBaseLineDebug = context?.features?.showBaseLineDebug ?? false;
|
|
38
38
|
|
|
39
39
|
if (haveValue) {
|
|
40
40
|
borderColor = theme.colors.primary;
|
package/Context/index.ts
CHANGED
|
@@ -9,6 +9,9 @@ const MiniAppContext = (Platform as any).MiniAppContext ?? Context;
|
|
|
9
9
|
const ScreenContext = (Platform as any).ScreenContext ?? Context;
|
|
10
10
|
const ComponentContext = (Platform as any).ComponentContext ?? Context;
|
|
11
11
|
const SkeletonContext = createContext({ loading: false });
|
|
12
|
+
const ScaleSizeContext = createContext<{ scaleSizeMaxRate?: number }>({
|
|
13
|
+
scaleSizeMaxRate: undefined,
|
|
14
|
+
});
|
|
12
15
|
const TrackingScopeContext = createContext<{ scopeName?: string }>({
|
|
13
16
|
scopeName: undefined,
|
|
14
17
|
});
|
|
@@ -20,4 +23,5 @@ export {
|
|
|
20
23
|
ComponentContext,
|
|
21
24
|
SkeletonContext,
|
|
22
25
|
TrackingScopeContext,
|
|
26
|
+
ScaleSizeContext,
|
|
23
27
|
};
|
package/Icon/index.tsx
CHANGED
|
@@ -17,7 +17,7 @@ const Icon: React.FC<IconProps> = ({
|
|
|
17
17
|
const { theme } = useContext(ApplicationContext);
|
|
18
18
|
const context = useContext<any>(MiniAppContext);
|
|
19
19
|
|
|
20
|
-
const showBaseLineDebug = context?.
|
|
20
|
+
const showBaseLineDebug = context?.features?.showBaseLineDebug ?? false;
|
|
21
21
|
|
|
22
22
|
/**
|
|
23
23
|
* get icon source maps or remote http
|
package/IconButton/index.tsx
CHANGED
|
@@ -46,7 +46,7 @@ const IconButton: React.FC<IconButtonProps> = ({
|
|
|
46
46
|
const { theme } = useContext(ApplicationContext);
|
|
47
47
|
const context = useContext<any>(MiniAppContext);
|
|
48
48
|
|
|
49
|
-
const showBaseLineDebug = context?.
|
|
49
|
+
const showBaseLineDebug = context?.features?.showBaseLineDebug ?? false;
|
|
50
50
|
|
|
51
51
|
/**
|
|
52
52
|
* get size icon button
|
package/Image/index.tsx
CHANGED
|
@@ -28,6 +28,11 @@ const Image: React.FC<ImageProps> = ({
|
|
|
28
28
|
source,
|
|
29
29
|
loading = true,
|
|
30
30
|
children,
|
|
31
|
+
onProgress,
|
|
32
|
+
onLoadStart,
|
|
33
|
+
onLoad,
|
|
34
|
+
onLoadEnd,
|
|
35
|
+
onError,
|
|
31
36
|
...rest
|
|
32
37
|
}) => {
|
|
33
38
|
const { theme } = useContext(ApplicationContext);
|
|
@@ -37,7 +42,7 @@ const Image: React.FC<ImageProps> = ({
|
|
|
37
42
|
const error = useRef(false);
|
|
38
43
|
const [status, setStatus] = useState<Status>('success');
|
|
39
44
|
|
|
40
|
-
const showBaseLineDebug = context?.
|
|
45
|
+
const showBaseLineDebug = context?.features?.showBaseLineDebug ?? false;
|
|
41
46
|
|
|
42
47
|
let accessibilityLabel: any = `img|${getImageName(source)}`;
|
|
43
48
|
if (component?.componentId) {
|
|
@@ -84,17 +89,20 @@ const Image: React.FC<ImageProps> = ({
|
|
|
84
89
|
style,
|
|
85
90
|
showBaseLineDebug && styles.debugBaseLine,
|
|
86
91
|
]}
|
|
87
|
-
onProgress={
|
|
92
|
+
onProgress={event => {
|
|
88
93
|
error.current = false;
|
|
89
94
|
if (status !== 'loading' && loading) {
|
|
90
95
|
setStatus('loading');
|
|
91
96
|
}
|
|
97
|
+
onProgress?.(event);
|
|
92
98
|
}}
|
|
93
99
|
onLoadStart={() => {
|
|
94
100
|
error.current = false;
|
|
101
|
+
onLoadStart?.();
|
|
95
102
|
}}
|
|
96
|
-
onLoad={
|
|
103
|
+
onLoad={event => {
|
|
97
104
|
error.current = false;
|
|
105
|
+
onLoad?.(event);
|
|
98
106
|
}}
|
|
99
107
|
onLoadEnd={() => {
|
|
100
108
|
let current: Status = 'success';
|
|
@@ -102,9 +110,11 @@ const Image: React.FC<ImageProps> = ({
|
|
|
102
110
|
current = 'error';
|
|
103
111
|
}
|
|
104
112
|
setStatus(prevState => (prevState !== current ? current : prevState));
|
|
113
|
+
onLoadEnd?.();
|
|
105
114
|
}}
|
|
106
115
|
onError={() => {
|
|
107
116
|
error.current = true;
|
|
117
|
+
onError?.();
|
|
108
118
|
}}
|
|
109
119
|
>
|
|
110
120
|
{renderContent()}
|
package/Input/Input.tsx
CHANGED
|
@@ -81,7 +81,7 @@ const Input = forwardRef(
|
|
|
81
81
|
const inputRef = useRef<TextInput | null>(null);
|
|
82
82
|
const componentName = 'Input';
|
|
83
83
|
|
|
84
|
-
const showBaseLineDebug = context?.
|
|
84
|
+
const showBaseLineDebug = context?.features?.showBaseLineDebug ?? false;
|
|
85
85
|
|
|
86
86
|
const { componentId } = useComponentId(
|
|
87
87
|
`${componentName}/${placeholder}`,
|
package/Input/InputDropDown.tsx
CHANGED
|
@@ -43,7 +43,7 @@ const InputDropDown = ({
|
|
|
43
43
|
const scaleHeight = useScaleSize(size === 'small' ? 48 : 56);
|
|
44
44
|
const componentName = 'InputDropDown';
|
|
45
45
|
|
|
46
|
-
const showBaseLineDebug = context?.
|
|
46
|
+
const showBaseLineDebug = context?.features?.showBaseLineDebug ?? false;
|
|
47
47
|
|
|
48
48
|
const { componentId } = useComponentId(
|
|
49
49
|
`${componentName}/${placeholder}`,
|
package/Input/InputMoney.tsx
CHANGED
|
@@ -76,7 +76,7 @@ const InputMoney = forwardRef(
|
|
|
76
76
|
const inputRef = useRef<TextInput>(null);
|
|
77
77
|
const componentName = 'InputMoney';
|
|
78
78
|
|
|
79
|
-
const showBaseLineDebug = context?.
|
|
79
|
+
const showBaseLineDebug = context?.features?.showBaseLineDebug ?? false;
|
|
80
80
|
|
|
81
81
|
const { componentId } = useComponentId(
|
|
82
82
|
`${componentName}/${placeholder}`,
|
package/Input/InputOTP.tsx
CHANGED
|
@@ -99,7 +99,7 @@ const InputOTP = forwardRef(
|
|
|
99
99
|
|
|
100
100
|
const componentName = 'InputOTP';
|
|
101
101
|
|
|
102
|
-
const showBaseLineDebug = context?.
|
|
102
|
+
const showBaseLineDebug = context?.features?.showBaseLineDebug ?? false;
|
|
103
103
|
|
|
104
104
|
const { componentId } = useComponentId(
|
|
105
105
|
`${componentName}/${placeholder}`,
|
|
@@ -73,7 +73,7 @@ const InputPhoneNumber = forwardRef(
|
|
|
73
73
|
const inputRef = useRef<TextInput | null>(null);
|
|
74
74
|
const componentName = 'InputPhoneNumber';
|
|
75
75
|
|
|
76
|
-
const showBaseLineDebug = context?.
|
|
76
|
+
const showBaseLineDebug = context?.features?.showBaseLineDebug ?? false;
|
|
77
77
|
|
|
78
78
|
const { componentId } = useComponentId(
|
|
79
79
|
`${componentName}/${placeholder}`,
|
package/Input/InputSearch.tsx
CHANGED
|
@@ -146,7 +146,7 @@ const InputSearch: ForwardRefRenderFunction<InputRef, InputSearchProps> = (
|
|
|
146
146
|
const context = useContext<any>(MiniAppContext);
|
|
147
147
|
const scaledFontSize = useScaleSize(14);
|
|
148
148
|
|
|
149
|
-
const showBaseLineDebug = context?.
|
|
149
|
+
const showBaseLineDebug = context?.features?.showBaseLineDebug ?? false;
|
|
150
150
|
|
|
151
151
|
const [focused, setFocused] = useState(false);
|
|
152
152
|
const [internalText, setInternalText] = useState(defaultValue || '');
|
package/Input/InputTextArea.tsx
CHANGED
|
@@ -21,7 +21,7 @@ import { ErrorView, FloatingView, getBorderColor, MAX_LENGTH } from './common';
|
|
|
21
21
|
import { InputTextAreaProps } from './index';
|
|
22
22
|
import styles from './styles';
|
|
23
23
|
import SystemTextInput from './SystemTextInput';
|
|
24
|
-
import { useComponentId } from '../Application';
|
|
24
|
+
import { setAutomationID, useComponentId } from '../Application';
|
|
25
25
|
|
|
26
26
|
const InputTextArea = forwardRef(
|
|
27
27
|
(
|
|
@@ -57,7 +57,7 @@ const InputTextArea = forwardRef(
|
|
|
57
57
|
const context = useContext<any>(MiniAppContext);
|
|
58
58
|
const DEFAULT_HEIGHT = useScaleSize(104);
|
|
59
59
|
|
|
60
|
-
const showBaseLineDebug = context?.
|
|
60
|
+
const showBaseLineDebug = context?.features?.showBaseLineDebug ?? false;
|
|
61
61
|
const scaledFontSize = useScaleSize(14);
|
|
62
62
|
const [focused, setFocused] = useState(false);
|
|
63
63
|
const [inputValue, setInputValue] = useState(defaultValue ?? '');
|
|
@@ -121,6 +121,8 @@ const InputTextArea = forwardRef(
|
|
|
121
121
|
|
|
122
122
|
return (
|
|
123
123
|
<View
|
|
124
|
+
accessible={false}
|
|
125
|
+
importantForAccessibility="no"
|
|
124
126
|
style={[
|
|
125
127
|
styles.textAreaWrapper,
|
|
126
128
|
{
|
|
@@ -139,11 +141,15 @@ const InputTextArea = forwardRef(
|
|
|
139
141
|
componentId={componentId}
|
|
140
142
|
/>
|
|
141
143
|
<View style={styles.rowArea}>
|
|
142
|
-
<View
|
|
144
|
+
<View
|
|
145
|
+
accessible={false}
|
|
146
|
+
importantForAccessibility="no"
|
|
147
|
+
style={styles.textAreaView}
|
|
148
|
+
>
|
|
143
149
|
<SystemTextInput
|
|
144
150
|
{...props}
|
|
145
151
|
ref={inputRef}
|
|
146
|
-
|
|
152
|
+
{...setAutomationID(componentId)}
|
|
147
153
|
accessibilityState={{
|
|
148
154
|
disabled: disabled,
|
|
149
155
|
...props.accessibilityState,
|
package/Layout/Item.tsx
CHANGED
|
@@ -27,7 +27,7 @@ const Item: React.FC<ItemProps> = ({
|
|
|
27
27
|
const context = useContext<any>(MiniAppContext);
|
|
28
28
|
const grid = useContext(GridContext);
|
|
29
29
|
|
|
30
|
-
const showBaseLineDebug = context?.
|
|
30
|
+
const showBaseLineDebug = context?.features?.showBaseLineDebug ?? false;
|
|
31
31
|
|
|
32
32
|
/**
|
|
33
33
|
* render overlay view only dev mode
|
package/Layout/Screen.tsx
CHANGED
|
@@ -204,9 +204,10 @@ const Screen = forwardRef(
|
|
|
204
204
|
let handleScroll;
|
|
205
205
|
let Component: any = View;
|
|
206
206
|
|
|
207
|
-
|
|
207
|
+
const bottomInset = Platform.OS === 'ios' ? Math.min(insets.bottom, 21) : insets.bottom;
|
|
208
|
+
let keyboardOffset = heightHeader - bottomInset;
|
|
208
209
|
if (headerType === 'extended' || animatedHeader || inputSearchProps) {
|
|
209
|
-
keyboardOffset = -
|
|
210
|
+
keyboardOffset = -bottomInset;
|
|
210
211
|
}
|
|
211
212
|
|
|
212
213
|
/**
|
|
@@ -616,7 +617,7 @@ const Screen = forwardRef(
|
|
|
616
617
|
{...floatingButtonProps}
|
|
617
618
|
animatedValue={animatedValue.current}
|
|
618
619
|
bottom={
|
|
619
|
-
Footer || isTab ? 12 :
|
|
620
|
+
Footer || isTab ? 12 : bottomInset + Spacing.S
|
|
620
621
|
}
|
|
621
622
|
/>
|
|
622
623
|
</View>
|
|
@@ -627,7 +628,7 @@ const Screen = forwardRef(
|
|
|
627
628
|
style={[
|
|
628
629
|
styles.shadow,
|
|
629
630
|
{
|
|
630
|
-
paddingBottom:
|
|
631
|
+
paddingBottom: bottomInset + Spacing.S,
|
|
631
632
|
backgroundColor: theme.colors.background.surface,
|
|
632
633
|
},
|
|
633
634
|
]}
|
|
@@ -14,7 +14,7 @@ const PaginationDot: FC<ChildPaginationProps> = ({
|
|
|
14
14
|
const { theme } = useContext(ApplicationContext);
|
|
15
15
|
const context = useContext<any>(MiniAppContext);
|
|
16
16
|
|
|
17
|
-
const showBaseLineDebug = context?.
|
|
17
|
+
const showBaseLineDebug = context?.features?.showBaseLineDebug ?? false;
|
|
18
18
|
|
|
19
19
|
const renderDots = () => {
|
|
20
20
|
const dots: React.ReactElement[] = [];
|
|
@@ -13,7 +13,7 @@ const PaginationNumber: FC<ChildPaginationProps> = ({
|
|
|
13
13
|
}) => {
|
|
14
14
|
const context = useContext<any>(MiniAppContext);
|
|
15
15
|
|
|
16
|
-
const showBaseLineDebug = context?.
|
|
16
|
+
const showBaseLineDebug = context?.features?.showBaseLineDebug ?? false;
|
|
17
17
|
|
|
18
18
|
return (
|
|
19
19
|
<View
|
|
@@ -17,7 +17,7 @@ const PaginationScroll: FC<ScrollIndicatorProps> = ({
|
|
|
17
17
|
const [scrollViewWidth, setScrollViewWidth] = useState(0);
|
|
18
18
|
const [scrollContentWidth, setScrollContentWidth] = useState(0);
|
|
19
19
|
|
|
20
|
-
const showBaseLineDebug = context?.
|
|
20
|
+
const showBaseLineDebug = context?.features?.showBaseLineDebug ?? false;
|
|
21
21
|
|
|
22
22
|
const translateX = () => {
|
|
23
23
|
if (scrollViewWidth && scrollContentWidth) {
|
|
@@ -13,7 +13,7 @@ const PaginationWhiteDot: FC<ChildPaginationProps> = ({
|
|
|
13
13
|
}) => {
|
|
14
14
|
const context = useContext<any>(MiniAppContext);
|
|
15
15
|
|
|
16
|
-
const showBaseLineDebug = context?.
|
|
16
|
+
const showBaseLineDebug = context?.features?.showBaseLineDebug ?? false;
|
|
17
17
|
|
|
18
18
|
const renderDots = () => {
|
|
19
19
|
const dots: React.ReactElement[] = [];
|
package/Popup/PopupNotify.tsx
CHANGED
|
@@ -32,7 +32,7 @@ const PopupNotify: React.FC<PopupNotifyProps> = ({
|
|
|
32
32
|
const { width: widthDevice } = Dimensions.get('window');
|
|
33
33
|
const scaledMaxHeight = useScaleSize(172);
|
|
34
34
|
|
|
35
|
-
const showBaseLineDebug = context?.
|
|
35
|
+
const showBaseLineDebug = context?.features?.showBaseLineDebug ?? false;
|
|
36
36
|
const closeAction = useRef('touch_outside');
|
|
37
37
|
let descriptionStyle = {};
|
|
38
38
|
let Description: any = View;
|
package/Popup/PopupPromotion.tsx
CHANGED
|
@@ -17,7 +17,7 @@ const PopupPromotion: React.FC<PopupPromotionProps> = ({
|
|
|
17
17
|
const { width: widthDevice } = Dimensions.get('window');
|
|
18
18
|
const closeAction = useRef('touch_outside');
|
|
19
19
|
|
|
20
|
-
const showBaseLineDebug = context?.
|
|
20
|
+
const showBaseLineDebug = context?.features?.showBaseLineDebug ?? false;
|
|
21
21
|
|
|
22
22
|
/**
|
|
23
23
|
* on action popup
|
package/Radio/index.tsx
CHANGED
|
@@ -33,7 +33,7 @@ const Radio: FC<RadioProps> = ({
|
|
|
33
33
|
accessibilityLabel,
|
|
34
34
|
);
|
|
35
35
|
|
|
36
|
-
const showBaseLineDebug = context?.
|
|
36
|
+
const showBaseLineDebug = context?.features?.showBaseLineDebug ?? false;
|
|
37
37
|
let disabledStyle = {};
|
|
38
38
|
let checkBoxStyle = {
|
|
39
39
|
borderWidth: 2,
|
package/Switch/index.tsx
CHANGED
|
@@ -22,7 +22,7 @@ const Switch: FC<SwitchProps> = ({
|
|
|
22
22
|
|
|
23
23
|
const { componentId } = useComponentId(componentName, accessibilityLabel);
|
|
24
24
|
|
|
25
|
-
const showBaseLineDebug = context?.
|
|
25
|
+
const showBaseLineDebug = context?.features?.showBaseLineDebug ?? false;
|
|
26
26
|
|
|
27
27
|
let backgroundColor = value ? Colors.green_03 : Colors.black_07;
|
|
28
28
|
if (disabled) {
|
package/Tag/index.tsx
CHANGED
|
@@ -38,7 +38,7 @@ const Tag: FC<TagProps> = ({
|
|
|
38
38
|
const scaledHeight24 = useScaleSize(24);
|
|
39
39
|
const scaledHeight18 = useScaleSize(18);
|
|
40
40
|
|
|
41
|
-
const showBaseLineDebug = context?.
|
|
41
|
+
const showBaseLineDebug = context?.features?.showBaseLineDebug ?? false;
|
|
42
42
|
|
|
43
43
|
const styles = StyleSheet.create({
|
|
44
44
|
container: {
|
package/Text/index.tsx
CHANGED
|
@@ -158,7 +158,7 @@ const Text: React.FC<TextProps> = ({
|
|
|
158
158
|
);
|
|
159
159
|
}
|
|
160
160
|
|
|
161
|
-
const showBaseLineDebug = context?.
|
|
161
|
+
const showBaseLineDebug = context?.features?.showBaseLineDebug ?? false;
|
|
162
162
|
|
|
163
163
|
if (skeleton.loading) {
|
|
164
164
|
return (
|
package/Text/utils.ts
CHANGED
|
@@ -1,39 +1,62 @@
|
|
|
1
1
|
import { Dimensions, PixelRatio, useWindowDimensions } from 'react-native';
|
|
2
2
|
import { useContext } from 'react';
|
|
3
|
-
import {
|
|
3
|
+
import { ScaleSizeContext } from '../Context';
|
|
4
4
|
|
|
5
5
|
const deviceWidth = Dimensions.get('window').width;
|
|
6
6
|
const DEFAULT_SCREEN_SIZE = 375;
|
|
7
|
-
const MAX_FONT_SCALE = 1.
|
|
7
|
+
const MAX_FONT_SCALE = 1.5;
|
|
8
|
+
const MAX_DEVICE_SCALE = 5;
|
|
8
9
|
|
|
9
|
-
const useScaleSize = (size: number) => {
|
|
10
|
+
const useScaleSize = (size: number, scaleRate?: number) => {
|
|
11
|
+
const { scaleSizeMaxRate = MAX_FONT_SCALE } = useContext(ScaleSizeContext);
|
|
12
|
+
const fontScale = PixelRatio.getFontScale();
|
|
10
13
|
const { width } = useWindowDimensions();
|
|
11
|
-
const
|
|
12
|
-
|
|
14
|
+
const deviceScale = width / DEFAULT_SCREEN_SIZE;
|
|
15
|
+
|
|
16
|
+
const maxScaleRate = scaleRate ?? scaleSizeMaxRate;
|
|
13
17
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
const fontScale = PixelRatio.getFontScale();
|
|
18
|
+
let fontSizeDeviceScale = size;
|
|
19
|
+
let fontSizeOSScale = size;
|
|
17
20
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
+
if (deviceScale > 1) {
|
|
22
|
+
fontSizeDeviceScale = Math.min(
|
|
23
|
+
fontSizeDeviceScale * deviceScale,
|
|
24
|
+
fontSizeDeviceScale + MAX_DEVICE_SCALE,
|
|
25
|
+
);
|
|
26
|
+
}
|
|
21
27
|
|
|
22
|
-
|
|
28
|
+
if (fontScale > 1) {
|
|
29
|
+
fontSizeOSScale = Math.min(
|
|
30
|
+
fontSizeOSScale * fontScale,
|
|
31
|
+
fontSizeOSScale * maxScaleRate,
|
|
32
|
+
);
|
|
23
33
|
}
|
|
24
34
|
|
|
25
|
-
return
|
|
35
|
+
return Math.max(fontSizeDeviceScale, fontSizeOSScale);
|
|
26
36
|
};
|
|
27
37
|
|
|
28
38
|
const scaleSize = (size: number) => {
|
|
29
|
-
const deviceScale = deviceWidth / DEFAULT_SCREEN_SIZE;
|
|
30
39
|
const fontScale = PixelRatio.getFontScale();
|
|
40
|
+
const deviceScale = deviceWidth / DEFAULT_SCREEN_SIZE;
|
|
31
41
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
42
|
+
let fontSizeDeviceScale = size;
|
|
43
|
+
let fontSizeOSScale = size;
|
|
44
|
+
|
|
45
|
+
if (deviceScale > 1) {
|
|
46
|
+
fontSizeDeviceScale = Math.min(
|
|
47
|
+
fontSizeDeviceScale * deviceScale,
|
|
48
|
+
fontSizeDeviceScale + MAX_DEVICE_SCALE,
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if (fontScale > 1) {
|
|
53
|
+
fontSizeOSScale = Math.min(
|
|
54
|
+
fontSizeOSScale * fontScale,
|
|
55
|
+
fontSizeOSScale * MAX_FONT_SCALE,
|
|
56
|
+
);
|
|
57
|
+
}
|
|
35
58
|
|
|
36
|
-
return Math.
|
|
59
|
+
return Math.max(fontSizeDeviceScale, fontSizeOSScale);
|
|
37
60
|
};
|
|
38
61
|
|
|
39
62
|
export { scaleSize, useScaleSize };
|
package/Title/index.tsx
CHANGED
|
@@ -39,7 +39,7 @@ const Title: FC<TitleProps> = ({
|
|
|
39
39
|
const [badgeWidth, setBadgeWidth] = useState(0);
|
|
40
40
|
const [contentWidth, setContentWidth] = useState(0);
|
|
41
41
|
|
|
42
|
-
const showBaseLineDebug = context?.
|
|
42
|
+
const showBaseLineDebug = context?.features?.showBaseLineDebug ?? false;
|
|
43
43
|
|
|
44
44
|
const size18 = useScaleSize(18);
|
|
45
45
|
const size22 = useScaleSize(22);
|
package/package.json
CHANGED
|
@@ -1,35 +1,35 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
}
|
|
2
|
+
"name": "@momo-kits/foundation",
|
|
3
|
+
"version": "0.161.2-beta.10",
|
|
4
|
+
"description": "React Native Component Kits",
|
|
5
|
+
"main": "index.ts",
|
|
6
|
+
"scripts": {},
|
|
7
|
+
"keywords": [
|
|
8
|
+
"@momo-kits/foundation"
|
|
9
|
+
],
|
|
10
|
+
"dependencies": {
|
|
11
|
+
"react-native-fast-image": "git+https://oauth2:TGi6oBj-LdzsKpLXQSoH@gitlab.mservice.com.vn/momo-platform/public/react-native-fast-image.git#v8.11.0",
|
|
12
|
+
"@react-navigation/bottom-tabs": "7.4.2",
|
|
13
|
+
"@react-navigation/core": "7.12.1",
|
|
14
|
+
"@react-navigation/elements": "2.5.2",
|
|
15
|
+
"@react-navigation/native": "7.1.14",
|
|
16
|
+
"@react-navigation/routers": "7.4.1",
|
|
17
|
+
"@react-navigation/stack": "7.4.2",
|
|
18
|
+
"react-native-gesture-handler": "2.27.1",
|
|
19
|
+
"react-native-linear-gradient": "git+https://oauth2:TGi6oBj-LdzsKpLXQSoH@gitlab.mservice.com.vn/momo-platform/public/react-native-linear-gradient#v3.0.0",
|
|
20
|
+
"react-native-reanimated": "4.2.2",
|
|
21
|
+
"react-native-safe-area-context": "5.5.2",
|
|
22
|
+
"@shopify/flash-list": "2.1.0",
|
|
23
|
+
"lottie-react-native": "7.2.4"
|
|
24
|
+
},
|
|
25
|
+
"peerDependencies": {
|
|
26
|
+
"react-native": "*"
|
|
27
|
+
},
|
|
28
|
+
"devDependencies": {
|
|
29
|
+
"@types/color": "3.0.6"
|
|
30
|
+
},
|
|
31
|
+
"publishConfig": {
|
|
32
|
+
"registry": "https://registry.npmjs.org/"
|
|
33
|
+
},
|
|
34
|
+
"license": "MoMo"
|
|
35
|
+
}
|