@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.
Files changed (44) hide show
  1. package/Application/BottomSheet.tsx +4 -3
  2. package/Application/BottomTab/BottomTabBar.tsx +2 -2
  3. package/Application/BottomTab/CustomBottomTabItem.tsx +1 -1
  4. package/Application/BottomTab/index.tsx +1 -1
  5. package/Application/Components/HeaderBackground.tsx +1 -1
  6. package/Application/Components/HeaderExtendHeader.tsx +1 -1
  7. package/Application/Components/HeaderTitle.tsx +1 -1
  8. package/Application/Components/SearchHeader.tsx +1 -1
  9. package/Application/NavigationContainer.tsx +21 -25
  10. package/Application/ScaleSizeProvider.tsx +16 -0
  11. package/Application/WidgetContainer.tsx +7 -18
  12. package/Application/index.ts +2 -0
  13. package/Application/types.ts +6 -0
  14. package/Badge/Badge.tsx +3 -9
  15. package/Badge/BadgeDot.tsx +1 -1
  16. package/Badge/BadgeRibbon.tsx +1 -1
  17. package/Button/index.tsx +2 -2
  18. package/CheckBox/index.tsx +1 -1
  19. package/Context/index.ts +4 -0
  20. package/Icon/index.tsx +1 -1
  21. package/IconButton/index.tsx +1 -1
  22. package/Image/index.tsx +13 -3
  23. package/Input/Input.tsx +1 -1
  24. package/Input/InputDropDown.tsx +1 -1
  25. package/Input/InputMoney.tsx +1 -1
  26. package/Input/InputOTP.tsx +1 -1
  27. package/Input/InputPhoneNumber.tsx +1 -1
  28. package/Input/InputSearch.tsx +1 -1
  29. package/Input/InputTextArea.tsx +10 -4
  30. package/Layout/Item.tsx +1 -1
  31. package/Layout/Screen.tsx +5 -4
  32. package/Pagination/PaginationDot.tsx +1 -1
  33. package/Pagination/PaginationNumber.tsx +1 -1
  34. package/Pagination/PaginationScroll.tsx +1 -1
  35. package/Pagination/PaginationWhiteDot.tsx +1 -1
  36. package/Popup/PopupNotify.tsx +1 -1
  37. package/Popup/PopupPromotion.tsx +1 -1
  38. package/Radio/index.tsx +1 -1
  39. package/Switch/index.tsx +1 -1
  40. package/Tag/index.tsx +1 -1
  41. package/Text/index.tsx +1 -1
  42. package/Text/utils.ts +41 -18
  43. package/Title/index.tsx +1 -1
  44. 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 keyboardOffset = heightHeader - Math.min(insets.bottom, 21);
40
+ const bottomInset = Platform.OS === 'ios' ? Math.min(insets.bottom, 21) : insets.bottom;
41
+ const keyboardOffset = heightHeader - bottomInset;
41
42
 
42
- const showBaseLineDebug = context?.designSystemConfig?.isBaselineEnabled;
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: Math.min(insets.bottom, 21),
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?.designSystemConfig?.isBaselineEnabled;
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?.designSystemConfig?.isBaselineEnabled;
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?.designSystemConfig?.isBaselineEnabled;
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?.designSystemConfig?.isBaselineEnabled;
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?.designSystemConfig?.isBaselineEnabled;
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?.designSystemConfig?.isBaselineEnabled;
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
- designSystemConfig: {
59
- ...context?.designSystemConfig,
60
- allowFontScale,
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
- <Navigation
68
- screen={screen}
69
- theme={theme}
70
- options={options}
71
- maxApi={maxApi}
72
- setCurrentContext={setCurrentContext}
73
- initialParams={initialParams}
74
- localize={localize}
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, useEffect, useRef, useState } from 'react';
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: 1 }}>
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>
@@ -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
  };
@@ -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?.designSystemConfig?.isBaselineEnabled;
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}
@@ -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?.designSystemConfig?.isBaselineEnabled;
12
+ const showBaseLineDebug = context?.features?.showBaseLineDebug ?? false;
13
13
 
14
14
  if (size === 'large') {
15
15
  dotStyle = styles.dot;
@@ -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?.designSystemConfig?.isBaselineEnabled;
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?.designSystemConfig?.isBaselineEnabled;
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
- {renderIcon('left')}
358
+ {renderIcon('left')}
359
359
  {renderTitle()}
360
360
  {renderIcon('right')}
361
361
  {gradientPros && (
@@ -34,7 +34,7 @@ const CheckBox: FC<CheckBoxProps> = ({
34
34
  props.accessibilityLabel,
35
35
  );
36
36
 
37
- const showBaseLineDebug = context?.designSystemConfig?.isBaselineEnabled;
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?.designSystemConfig?.isBaselineEnabled;
20
+ const showBaseLineDebug = context?.features?.showBaseLineDebug ?? false;
21
21
 
22
22
  /**
23
23
  * get icon source maps or remote http
@@ -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?.designSystemConfig?.isBaselineEnabled;
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?.designSystemConfig?.isBaselineEnabled;
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?.designSystemConfig?.isBaselineEnabled;
84
+ const showBaseLineDebug = context?.features?.showBaseLineDebug ?? false;
85
85
 
86
86
  const { componentId } = useComponentId(
87
87
  `${componentName}/${placeholder}`,
@@ -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?.designSystemConfig?.isBaselineEnabled;
46
+ const showBaseLineDebug = context?.features?.showBaseLineDebug ?? false;
47
47
 
48
48
  const { componentId } = useComponentId(
49
49
  `${componentName}/${placeholder}`,
@@ -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?.designSystemConfig?.isBaselineEnabled;
79
+ const showBaseLineDebug = context?.features?.showBaseLineDebug ?? false;
80
80
 
81
81
  const { componentId } = useComponentId(
82
82
  `${componentName}/${placeholder}`,
@@ -99,7 +99,7 @@ const InputOTP = forwardRef(
99
99
 
100
100
  const componentName = 'InputOTP';
101
101
 
102
- const showBaseLineDebug = context?.designSystemConfig?.isBaselineEnabled;
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?.designSystemConfig?.isBaselineEnabled;
76
+ const showBaseLineDebug = context?.features?.showBaseLineDebug ?? false;
77
77
 
78
78
  const { componentId } = useComponentId(
79
79
  `${componentName}/${placeholder}`,
@@ -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?.designSystemConfig?.isBaselineEnabled;
149
+ const showBaseLineDebug = context?.features?.showBaseLineDebug ?? false;
150
150
 
151
151
  const [focused, setFocused] = useState(false);
152
152
  const [internalText, setInternalText] = useState(defaultValue || '');
@@ -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?.designSystemConfig?.isBaselineEnabled;
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 style={styles.textAreaView}>
144
+ <View
145
+ accessible={false}
146
+ importantForAccessibility="no"
147
+ style={styles.textAreaView}
148
+ >
143
149
  <SystemTextInput
144
150
  {...props}
145
151
  ref={inputRef}
146
- accessibilityLabel={`${componentId}`}
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?.designSystemConfig?.isBaselineEnabled;
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
- let keyboardOffset = heightHeader - Math.min(insets.bottom, 21);
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 = -Math.min(insets.bottom, 21);
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 : Math.min(insets.bottom, 21) + Spacing.S
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: Math.min(insets.bottom, 21) + Spacing.S,
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?.designSystemConfig?.isBaselineEnabled;
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?.designSystemConfig?.isBaselineEnabled;
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?.designSystemConfig?.isBaselineEnabled;
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?.designSystemConfig?.isBaselineEnabled;
16
+ const showBaseLineDebug = context?.features?.showBaseLineDebug ?? false;
17
17
 
18
18
  const renderDots = () => {
19
19
  const dots: React.ReactElement[] = [];
@@ -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?.designSystemConfig?.isBaselineEnabled;
35
+ const showBaseLineDebug = context?.features?.showBaseLineDebug ?? false;
36
36
  const closeAction = useRef('touch_outside');
37
37
  let descriptionStyle = {};
38
38
  let Description: any = View;
@@ -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?.designSystemConfig?.isBaselineEnabled;
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?.designSystemConfig?.isBaselineEnabled;
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?.designSystemConfig?.isBaselineEnabled;
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?.designSystemConfig?.isBaselineEnabled;
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?.designSystemConfig?.isBaselineEnabled;
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 { MiniAppContext } from '../Context';
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.2;
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 context = useContext<any>(MiniAppContext);
12
- const allowFontScale = context?.designSystemConfig?.allowFontScale ?? true;
14
+ const deviceScale = width / DEFAULT_SCREEN_SIZE;
15
+
16
+ const maxScaleRate = scaleRate ?? scaleSizeMaxRate;
13
17
 
14
- if (allowFontScale) {
15
- const deviceScale = width / DEFAULT_SCREEN_SIZE;
16
- const fontScale = PixelRatio.getFontScale();
18
+ let fontSizeDeviceScale = size;
19
+ let fontSizeOSScale = size;
17
20
 
18
- const maxSize = size * MAX_FONT_SCALE;
19
- const fontSizeScaleDevice = deviceScale > 1 ? deviceScale * size : size;
20
- const fontSizeScaleOS = fontScale > 1 ? fontScale * size : size;
21
+ if (deviceScale > 1) {
22
+ fontSizeDeviceScale = Math.min(
23
+ fontSizeDeviceScale * deviceScale,
24
+ fontSizeDeviceScale + MAX_DEVICE_SCALE,
25
+ );
26
+ }
21
27
 
22
- return Math.min(Math.max(fontSizeScaleDevice, fontSizeScaleOS), maxSize);
28
+ if (fontScale > 1) {
29
+ fontSizeOSScale = Math.min(
30
+ fontSizeOSScale * fontScale,
31
+ fontSizeOSScale * maxScaleRate,
32
+ );
23
33
  }
24
34
 
25
- return size;
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
- const maxSize = size * MAX_FONT_SCALE;
33
- const fontSizeScaleDevice = deviceScale > 1 ? deviceScale * size : size;
34
- const fontSizeScaleOS = fontScale > 1 ? fontScale * size : size;
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.min(Math.max(fontSizeScaleDevice, fontSizeScaleOS), maxSize);
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?.designSystemConfig?.isBaselineEnabled;
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
- "name": "@momo-kits/foundation",
3
- "version": "0.161.1-beta.2",
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.1.0",
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
- }
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
+ }