@momo-kits/foundation 0.92.1-tracking.9 → 0.92.2-tracking.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -15,7 +15,7 @@ import {
15
15
  View,
16
16
  ViewStyle,
17
17
  } from 'react-native';
18
- import {ApplicationContext, MiniAppContext} from './index';
18
+ import {ApplicationContext} from './index';
19
19
  import {Colors, Radius, Spacing, Styles} from '../Consts';
20
20
  import {Image} from '../Image';
21
21
  import {
@@ -30,7 +30,10 @@ import {Icon} from '../Icon';
30
30
  import {PopupNotify} from '../Popup';
31
31
  import {Badge, BadgeDot} from '../Badge';
32
32
  import {getAccessibilityID} from './utils';
33
- const accessibilityID = getAccessibilityID("title_navigation_header")
33
+
34
+ const {
35
+ MiniAppContext,
36
+ } = require('react-native/Libraries/Components/ScreenContext');
34
37
 
35
38
  const NavigationButton: React.FC<NavigationButtonProps> = ({
36
39
  icon,
@@ -66,9 +69,10 @@ const NavigationButton: React.FC<NavigationButtonProps> = ({
66
69
  }
67
70
  }, [badgeType, badgeValue]);
68
71
 
69
- const ID = getAccessibilityID?.(accessibilityID);
70
72
  return (
71
- <View {...ID} style={{width: scaleSize(28)}}>
73
+ <View
74
+ {...getAccessibilityID(accessibilityID)}
75
+ style={{width: scaleSize(28)}}>
72
76
  <TouchableOpacity
73
77
  style={[styles.navigationButton, buttonStyle]}
74
78
  onPress={onPress}>
@@ -91,11 +95,10 @@ const HeaderTitle: React.FC<any> = props => {
91
95
  extrapolate: 'clamp',
92
96
  });
93
97
 
94
-
95
98
  return (
96
99
  <Animated.Text
97
100
  {...props}
98
- {...accessibilityID}
101
+ {...getAccessibilityID('title_navigation_header')}
99
102
  style={[
100
103
  styles.title,
101
104
  {fontFamily: `${theme.font}-Bold`, opacity, color: props.tintColor},
@@ -110,7 +113,7 @@ const HeaderLeft: React.FC<HeaderBackProps> = ({
110
113
  onPressLeftHeader,
111
114
  useBorder,
112
115
  }) => {
113
- const context = useContext(MiniAppContext);
116
+ const context = useContext<any>(MiniAppContext);
114
117
  const {navigator} = useContext(ApplicationContext);
115
118
 
116
119
  useEffect(() => {
@@ -124,26 +127,25 @@ const HeaderLeft: React.FC<HeaderBackProps> = ({
124
127
 
125
128
  const goBackSafe = () => {
126
129
  const goBack = () => {
127
- const canGoBack = navigator?.ref.current?.canGoBack();
128
- if (!canGoBack) {
129
- const currentRoute = navigator?.ref?.current?.getCurrentRoute?.();
130
- const params = {
131
- ...context,
132
- screen_name: currentRoute?.params?.screen?.name ?? currentRoute?.name,
133
- trigger_id: '111154000000000000',
134
- icon_name: 'back',
135
- };
136
- navigator?.maxApi?.showToastDebug?.({
137
- appId: context.appId,
138
- message: 'service_icon_clicked',
139
- params,
140
- });
141
- navigator?.maxApi?.trackEvent?.('service_icon_clicked', params);
142
- }
130
+ const canGoBack = navigator?.ref?.current?.canGoBack?.();
131
+ const currentRoute = navigator?.ref?.current?.getCurrentRoute?.();
132
+ const params = {
133
+ appId: context.appId,
134
+ code: context.code,
135
+ screen_name: currentRoute?.params?.screen?.name ?? currentRoute?.name,
136
+ trigger_id: '111154000000000000',
137
+ icon_name: 'back',
138
+ };
139
+ navigator?.maxApi?.showToastDebug?.({
140
+ appId: `auto - ${context.appId}`,
141
+ message: 'service_icon_clicked',
142
+ params,
143
+ });
144
+ navigator?.maxApi?.trackEvent?.('service_icon_clicked', params);
143
145
  if (canGoBack) {
144
- navigator?.ref.current?.goBack();
146
+ navigator?.ref?.current?.goBack?.();
145
147
  } else if (navigator?.maxApi) {
146
- navigator?.maxApi?.dismiss(navigator.dismissData);
148
+ navigator?.maxApi?.dismiss?.(navigator?.dismissData);
147
149
  } else {
148
150
  const currentTime = new Date().getTime();
149
151
  const requestId = `navigationBackPress#${currentTime}`;
@@ -250,8 +252,9 @@ const HeaderCustom: React.FC<TitleCustomProps> = ({
250
252
  </View>
251
253
  <View style={[Styles.flex, {paddingHorizontal: 8}]}>
252
254
  <Text
253
- {...accessibilityID}
254
- typography="header_default_bold" color={tintColor}>
255
+ {...getAccessibilityID('title_navigation_header')}
256
+ typography="header_default_bold"
257
+ color={tintColor}>
255
258
  {title}
256
259
  </Text>
257
260
  <Text typography="description_default_regular" color={tintColor}>
@@ -301,7 +304,7 @@ const HeaderToolkitAction: React.FC<any> = ({
301
304
  preventClose,
302
305
  }) => {
303
306
  const {theme, navigator} = useContext(ApplicationContext);
304
- const miniContext = useContext(MiniAppContext);
307
+ const miniContext = useContext<any>(MiniAppContext);
305
308
  const [toolConfig, setToolConfig] = useState<any>();
306
309
  const {onAction} = toolConfig ?? {};
307
310
 
@@ -408,13 +411,13 @@ const HeaderToolkitAction: React.FC<any> = ({
408
411
  },
409
412
  ]}>
410
413
  <TouchableOpacity
411
- {...getAccessibilityID?.('btn_navigation_more')}
414
+ {...getAccessibilityID('btn_navigation_more')}
412
415
  onPress={onMore}>
413
416
  <Icon color={tintColor} source="navigation_more_horiz" size={20} />
414
417
  </TouchableOpacity>
415
418
  <View style={[styles.divider, {backgroundColor: tintColor}]} />
416
419
  <TouchableOpacity
417
- {...getAccessibilityID?.('btn_navigation_close')}
420
+ {...getAccessibilityID('btn_navigation_close')}
418
421
  onPress={onClose}>
419
422
  <Icon
420
423
  color={tintColor}
@@ -433,7 +436,6 @@ const HeaderToolkitAction: React.FC<any> = ({
433
436
  const HeaderAnimated: React.FC<HeaderAnimatedProps> = ({
434
437
  animatedValue,
435
438
  image,
436
- onPress,
437
439
  children,
438
440
  }) => {
439
441
  const scale = animatedValue.interpolate({
@@ -453,23 +455,21 @@ const HeaderAnimated: React.FC<HeaderAnimatedProps> = ({
453
455
  });
454
456
 
455
457
  return (
456
- <TouchableOpacity onPress={onPress} disabled={!onPress}>
457
- <Animated.View
458
- style={{
459
- height: 210,
460
- opacity: opacity,
461
- transform: [{scale}, {translateY}],
462
- }}>
463
- {children ?? (
464
- <Image
465
- source={{
466
- uri: image,
467
- }}
468
- style={{width: '100%', height: '100%'}}
469
- />
470
- )}
471
- </Animated.View>
472
- </TouchableOpacity>
458
+ <Animated.View
459
+ style={{
460
+ height: 210,
461
+ opacity: opacity,
462
+ transform: [{scale}, {translateY}],
463
+ }}>
464
+ {children ?? (
465
+ <Image
466
+ source={{
467
+ uri: image,
468
+ }}
469
+ style={{width: '100%', height: '100%'}}
470
+ />
471
+ )}
472
+ </Animated.View>
473
473
  );
474
474
  };
475
475
 
@@ -1,29 +1,21 @@
1
- import React, {useContext, useEffect, useMemo, useRef, useState} from 'react';
1
+ import React, {useContext, useEffect, useRef} from 'react';
2
2
  import {
3
- Dimensions,
4
- Keyboard,
5
3
  KeyboardAvoidingView,
6
4
  Platform,
7
5
  Pressable,
8
6
  StyleSheet,
7
+ TouchableOpacity,
9
8
  View,
10
9
  } from 'react-native';
10
+ import {Modalize} from 'react-native-modalize';
11
11
  import {SafeAreaView, useSafeAreaInsets} from 'react-native-safe-area-context';
12
- import {
13
- BottomSheetBackdrop,
14
- BottomSheetModal,
15
- BottomSheetView,
16
- } from '@gorhom/bottom-sheet';
12
+
13
+ import {ApplicationContext} from '.';
14
+ import {Radius, Spacing, Styles} from '../Consts';
15
+ import {Icon} from '../Icon';
16
+ import {Text} from '../Text';
17
17
  import Navigation from './Navigation';
18
18
  import {BottomSheetParams, ModalParams} from './types';
19
- import {Radius, Spacing, Styles} from '../Consts';
20
- import {
21
- ApplicationContext,
22
- HeaderRightAction,
23
- NavigationButton,
24
- NavigationContainer,
25
- } from './index';
26
- import {HeaderBackground, HeaderLeft, HeaderTitle} from './Components';
27
19
 
28
20
  const ModalScreen: React.FC<any> = props => {
29
21
  /**
@@ -92,141 +84,88 @@ const Modal: React.FC<ModalParams> = props => {
92
84
  };
93
85
 
94
86
  const BottomSheet: React.FC<BottomSheetParams> = props => {
95
- const insets = useSafeAreaInsets();
96
87
  const {theme, navigator} = useContext(ApplicationContext);
97
- const [keyboardSnap, setKeyboardSnap] = useState(0);
98
- const {screen, options, snapPoint, indicatorColor}: BottomSheetParams =
99
- props.route.params;
100
- const Component = useRef(screen).current;
88
+ const {
89
+ screen: Screen,
90
+ options,
91
+ footerComponent,
92
+ flatListProps,
93
+ }: BottomSheetParams = props.route.params;
94
+
101
95
  const navigation = new Navigation(props.navigation, theme);
96
+
102
97
  const params = {
103
98
  ...props.route.params,
104
99
  navigation,
105
100
  };
106
101
 
107
102
  delete params.screen;
108
-
109
- const snapPoints = useMemo(() => {
110
- if (snapPoint) {
111
- const current = parseInt(snapPoint) + keyboardSnap * 100;
112
- return [`${current}%`];
113
- }
114
- return ['50%', '70%', '90%'];
115
- }, [keyboardSnap]);
116
-
117
- const bottomSheetRef = useRef<any>(null);
118
- const mountedRef = useRef(true);
119
-
120
- let backgroundColor = theme.colors.background.default;
121
- let bottomInset = keyboardSnap * Dimensions.get('window').height;
122
- if (bottomInset > 16) {
123
- bottomInset -= 16;
124
- }
125
- if (options?.surface) {
126
- backgroundColor = theme.colors.background.surface;
127
- }
103
+ const modalizeRef = useRef<Modalize>(null);
128
104
 
129
105
  useEffect(() => {
130
- const keyboardDidShow = Keyboard.addListener('keyboardDidShow', e => {
131
- setKeyboardSnap(
132
- e.endCoordinates.height / Dimensions.get('window').height,
133
- );
134
- bottomSheetRef.current?.expand();
135
- });
136
-
137
- const keyboardDidHide = Keyboard.addListener('keyboardDidHide', () => {
138
- setKeyboardSnap(0);
139
- });
140
-
141
- bottomSheetRef.current?.present();
142
- return () => {
143
- mountedRef.current = false;
144
- keyboardDidShow.remove();
145
- keyboardDidHide.remove();
146
- };
106
+ modalizeRef.current?.open();
147
107
  }, []);
148
108
 
149
- const backdropComponent = (backdropProps: any) => (
150
- <BottomSheetBackdrop
151
- disappearsOnIndex={-1}
152
- appearsOnIndex={0}
153
- {...backdropProps}
154
- />
155
- );
109
+ const handleClose = () => {
110
+ modalizeRef?.current?.close();
111
+ };
156
112
 
157
113
  return (
158
114
  <SafeAreaView style={Styles.flex}>
159
- <BottomSheetModal
160
- ref={bottomSheetRef}
161
- snapPoints={snapPoints}
162
- onDismiss={() => {
163
- if (mountedRef.current) {
164
- navigator?.pop();
165
- }
115
+ <Modalize
116
+ keyboardAvoidingOffset={-20}
117
+ adjustToContentHeight
118
+ closeOnOverlayTap
119
+ closeSnapPointStraightEnabled
120
+ onClosed={() => {
121
+ navigator?.pop();
166
122
  }}
167
- bottomInset={Platform.OS === 'ios' ? bottomInset : 0}
168
- handleComponent={null}
169
- backdropComponent={backdropComponent}>
170
- <BottomSheetView>
171
- <View style={[styles.sheetContainer, {backgroundColor}]}>
172
- <View style={styles.indicatorContainer}>
173
- <View
174
- style={[
175
- styles.indicator,
176
- {backgroundColor: theme.colors.text.disable},
177
- ]}
178
- />
179
- </View>
180
- <NavigationContainer
181
- maxApi={navigator?.maxApi}
182
- theme={{
183
- ...theme,
184
- assets: {...theme.assets, headerBackground: undefined},
185
- }}
186
- screen={props => <Component {...props} {...params} />}
187
- options={{
188
- ...options,
189
- ...{
190
- headerLeft: (props: any) => {
191
- if (props.canGoBack) {
192
- return <HeaderLeft {...props} useBorder={false} />;
193
- }
194
- },
195
- headerTitle: (props: any) => {
196
- return <HeaderTitle {...props} />;
197
- },
198
- headerTintColor: theme.colors.text.default,
199
- headerBackground: () => (
200
- <HeaderBackground backgroundColor={backgroundColor} />
201
- ),
202
- headerTransparent: false,
203
- },
204
- headerTitleAlign: 'center',
205
- headerRight: props => (
206
- <HeaderRightAction>
207
- <NavigationButton
208
- {...props}
209
- icon="24_navigation_close"
210
- useBorder={false}
211
- onPress={() => bottomSheetRef.current?.dismiss()}
212
- />
213
- </HeaderRightAction>
214
- ),
215
- }}
216
- />
217
- <View
218
- style={{
219
- height: Math.min(insets.bottom, 20),
220
- backgroundColor: indicatorColor ?? backgroundColor,
221
- }}
222
- />
223
- </View>
224
- </BottomSheetView>
225
- </BottomSheetModal>
123
+ ref={modalizeRef}
124
+ withHandle={false}
125
+ flatListProps={flatListProps}
126
+ HeaderComponent={headerDefault(
127
+ options?.title ?? options?.customTitle?.title ?? '',
128
+ handleClose,
129
+ )}
130
+ FooterComponent={footerDefault(footerComponent)}>
131
+ <View style={styles.bottomSheetContainer}>
132
+ <Screen {...props} {...params} />
133
+ </View>
134
+ </Modalize>
226
135
  </SafeAreaView>
227
136
  );
228
137
  };
229
138
 
139
+ const headerDefault = (title: string, onClose: () => void) => {
140
+ return (
141
+ <View style={styles.header}>
142
+ <Text
143
+ style={styles.textOption}
144
+ numberOfLines={2}
145
+ typography="header_default_bold">
146
+ {title ?? ''}
147
+ </Text>
148
+ <TouchableOpacity style={styles.buttonClose} onPress={onClose}>
149
+ <Icon source="navigation_close" />
150
+ </TouchableOpacity>
151
+ </View>
152
+ );
153
+ };
154
+
155
+ const footerDefault = (footerComponent: React.ReactNode) => {
156
+ const insets = useSafeAreaInsets();
157
+ if (!footerComponent) return;
158
+ return (
159
+ <View
160
+ style={{
161
+ marginBottom: Math.min(insets.bottom, 21) + Spacing.S,
162
+ paddingHorizontal: 12,
163
+ }}>
164
+ {footerComponent}
165
+ </View>
166
+ );
167
+ };
168
+
230
169
  const styles = StyleSheet.create({
231
170
  container: {flex: 1, flexDirection: 'row'},
232
171
  modalContent: {
@@ -263,6 +202,43 @@ const styles = StyleSheet.create({
263
202
  height: 4,
264
203
  borderRadius: Radius.S,
265
204
  },
205
+ bottomSheetContainer: {
206
+ width: '100%',
207
+ backgroundColor: 'white',
208
+ borderTopRightRadius: 16,
209
+ borderTopLeftRadius: 16,
210
+ },
211
+ header: {
212
+ height: 50,
213
+ width: '100%',
214
+ alignItems: 'center',
215
+ justifyContent: 'center',
216
+ },
217
+ textOption: {
218
+ fontSize: 16,
219
+ color: '#303233',
220
+ textAlign: 'center',
221
+ fontWeight: 'bold',
222
+ paddingHorizontal: 60,
223
+ },
224
+ imageOption: {
225
+ height: 1,
226
+ backgroundColor: '#ebebeb',
227
+ width: '100%',
228
+ position: 'absolute',
229
+ bottom: 1,
230
+ },
231
+ buttonClose: {
232
+ padding: 12,
233
+ position: 'absolute',
234
+ right: 0,
235
+ },
236
+ icon: {
237
+ width: 24,
238
+ height: 24,
239
+ tintColor: '#303233',
240
+ backgroundColor: 'red',
241
+ },
266
242
  });
267
243
 
268
244
  export default ModalScreen;
@@ -1,10 +1,10 @@
1
- import React, {useContext, useEffect, useRef, useState} from 'react';
2
- import {BottomSheetModalProvider} from '@gorhom/bottom-sheet';
1
+ import React, {useEffect, useRef, useState} from 'react';
3
2
  import {SafeAreaProvider} from 'react-native-safe-area-context';
4
3
  import {
5
4
  NavigationContainer as ReactNavigationContainer,
6
5
  NavigationContainerRef,
7
6
  } from '@react-navigation/native';
7
+ import {BottomSheetModalProvider} from '@gorhom/bottom-sheet';
8
8
  import {createStackNavigator} from '@react-navigation/stack';
9
9
  import {DeviceEventEmitter} from 'react-native';
10
10
  import StackScreen from './StackScreen';
@@ -12,9 +12,15 @@ import ModalScreen from './ModalScreen';
12
12
  import Navigator from './Navigator';
13
13
  import {getDialogOptions, getModalOptions, getStackOptions} from './utils';
14
14
  import {LocalizationObject, NavigationContainerProps} from './types';
15
- import {ApplicationContext, MiniAppContext} from './index';
15
+ import {ApplicationContext} from './index';
16
16
  import kitLocalization from '../Assets/language.json';
17
17
 
18
+ /**
19
+ * link for deprecated
20
+ */
21
+
22
+ console.log(typeof BottomSheetModalProvider);
23
+
18
24
  const Stack = createStackNavigator();
19
25
 
20
26
  const NavigationContainer: React.FC<NavigationContainerProps> = ({
@@ -25,7 +31,6 @@ const NavigationContainer: React.FC<NavigationContainerProps> = ({
25
31
  localization,
26
32
  initialParams,
27
33
  }) => {
28
- const context = useContext(MiniAppContext);
29
34
  const navigationRef = useRef<NavigationContainerRef>(null);
30
35
  const isReady = useRef(false);
31
36
  const navigator = useRef(new Navigator(navigationRef, isReady));
@@ -59,7 +64,7 @@ const NavigationContainer: React.FC<NavigationContainerProps> = ({
59
64
  * @param key
60
65
  */
61
66
  const translate = (key: string) => {
62
- const language: 'vi' | 'en' = context?.language ?? 'vi';
67
+ const language: 'vi' | 'en' = 'vi';
63
68
  const mergedLocalization: LocalizationObject = {
64
69
  vi: {...localization?.vi, ...kitLocalization.vi},
65
70
  en: {...localization?.en, ...kitLocalization.en},
@@ -69,55 +74,53 @@ const NavigationContainer: React.FC<NavigationContainerProps> = ({
69
74
 
70
75
  return (
71
76
  <SafeAreaProvider>
72
- <BottomSheetModalProvider>
73
- <ApplicationContext.Provider
74
- value={{
75
- navigator: navigator.current,
76
- config: config.current,
77
- theme,
78
- showGrid,
79
- translate,
80
- }}>
81
- <ReactNavigationContainer
82
- theme={{
83
- ...theme,
84
- colors: {
85
- ...theme.colors,
86
- background: theme.colors.background.default,
87
- card: theme.colors.background.surface,
88
- text: theme.colors.text.default,
89
- border: theme.colors.border.default,
90
- notification: theme.colors.error.primary,
91
- },
92
- }}
93
- ref={navigator.current?.ref}
94
- onReady={() => {
95
- isReady.current = true;
96
- }}
97
- independent={true}>
98
- <Stack.Navigator initialRouteName="Stack" headerMode="screen">
99
- <Stack.Screen
100
- name="Stack"
101
- component={StackScreen}
102
- initialParams={{screen, initialParams}}
103
- options={{...getStackOptions(), ...options}}
104
- />
105
- <Stack.Screen
106
- name="Dialog"
107
- component={StackScreen}
108
- options={getDialogOptions()}
109
- initialParams={{screen}}
110
- />
111
- <Stack.Screen
112
- name="Modal"
113
- component={ModalScreen}
114
- options={getModalOptions()}
115
- initialParams={{screen}}
116
- />
117
- </Stack.Navigator>
118
- </ReactNavigationContainer>
119
- </ApplicationContext.Provider>
120
- </BottomSheetModalProvider>
77
+ <ApplicationContext.Provider
78
+ value={{
79
+ navigator: navigator.current,
80
+ config: config.current,
81
+ theme,
82
+ showGrid,
83
+ translate,
84
+ }}>
85
+ <ReactNavigationContainer
86
+ theme={{
87
+ ...theme,
88
+ colors: {
89
+ ...theme.colors,
90
+ background: theme.colors.background.default,
91
+ card: theme.colors.background.surface,
92
+ text: theme.colors.text.default,
93
+ border: theme.colors.border.default,
94
+ notification: theme.colors.error.primary,
95
+ },
96
+ }}
97
+ ref={navigator.current?.ref}
98
+ onReady={() => {
99
+ isReady.current = true;
100
+ }}
101
+ independent={true}>
102
+ <Stack.Navigator initialRouteName="Stack" headerMode="screen">
103
+ <Stack.Screen
104
+ name="Stack"
105
+ component={StackScreen}
106
+ initialParams={{screen, initialParams}}
107
+ options={{...getStackOptions(), ...options}}
108
+ />
109
+ <Stack.Screen
110
+ name="Dialog"
111
+ component={StackScreen}
112
+ options={getDialogOptions()}
113
+ initialParams={{screen}}
114
+ />
115
+ <Stack.Screen
116
+ name="Modal"
117
+ component={ModalScreen}
118
+ options={getModalOptions()}
119
+ initialParams={{screen}}
120
+ />
121
+ </Stack.Navigator>
122
+ </ReactNavigationContainer>
123
+ </ApplicationContext.Provider>
121
124
  </SafeAreaProvider>
122
125
  );
123
126
  };