@momo-kits/foundation 0.80.9 → 0.81.1-beta.0

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 (87) hide show
  1. package/Application/BottomSheet.tsx +212 -0
  2. package/Application/BottomTab/BottomTabBar.tsx +278 -0
  3. package/Application/BottomTab/index.tsx +143 -0
  4. package/Application/Components.tsx +379 -209
  5. package/Application/ModalScreen.tsx +14 -178
  6. package/Application/Navigation.ts +15 -19
  7. package/Application/NavigationContainer.tsx +66 -63
  8. package/Application/Navigator.ts +106 -53
  9. package/Application/StackScreen.tsx +123 -9
  10. package/Application/index.ts +19 -6
  11. package/Application/types.ts +83 -26
  12. package/Application/utils.tsx +38 -49
  13. package/Assets/icon.json +83 -5
  14. package/Assets/icon_bank.json +506 -0
  15. package/Assets/language.json +3 -1
  16. package/Badge/Badge.tsx +56 -0
  17. package/Badge/BadgeDot.tsx +11 -0
  18. package/Badge/BadgeRibbon.tsx +125 -0
  19. package/Badge/Shape.tsx +29 -0
  20. package/Badge/index.tsx +7 -0
  21. package/Badge/styles.ts +58 -0
  22. package/Badge/types.ts +63 -0
  23. package/Button/index.tsx +64 -28
  24. package/Button/styles.ts +19 -0
  25. package/CheckBox/index.tsx +37 -27
  26. package/CheckBox/types.ts +5 -3
  27. package/Consts/colors+spacing+radius.ts +18 -0
  28. package/Icon/index.tsx +14 -9
  29. package/Icon/types.ts +4 -3
  30. package/IconButton/index.tsx +24 -15
  31. package/Image/index.tsx +62 -47
  32. package/Image/styles.ts +1 -9
  33. package/Image/types.ts +5 -1
  34. package/Input/Input.tsx +104 -25
  35. package/Input/InputDropDown.tsx +35 -23
  36. package/Input/InputMoney.tsx +79 -18
  37. package/Input/InputOTP.tsx +190 -149
  38. package/Input/InputSearch.tsx +96 -44
  39. package/Input/InputTextArea.tsx +33 -17
  40. package/Input/common.tsx +26 -17
  41. package/Input/index.tsx +69 -24
  42. package/Input/styles.ts +5 -7
  43. package/Input/utils.ts +1 -1
  44. package/Layout/AnimatedInputSearch.tsx +44 -0
  45. package/Layout/Card.tsx +37 -13
  46. package/Layout/FloatingButton.tsx +168 -0
  47. package/Layout/GridSystem.tsx +2 -3
  48. package/Layout/Item.tsx +1 -2
  49. package/Layout/ItemList.tsx +55 -0
  50. package/Layout/ItemSectionList.tsx +39 -0
  51. package/Layout/Screen.tsx +404 -181
  52. package/Layout/Section.tsx +22 -22
  53. package/Layout/TextTyping.tsx +114 -0
  54. package/Layout/index.ts +12 -2
  55. package/Layout/styles.ts +46 -13
  56. package/Layout/types.ts +13 -5
  57. package/Layout/utils.ts +7 -12
  58. package/Loader/index.tsx +2 -0
  59. package/Pagination/PaginationDot.tsx +6 -1
  60. package/Pagination/PaginationNumber.tsx +7 -4
  61. package/Pagination/PaginationScroll.tsx +0 -1
  62. package/Pagination/PaginationWhiteDot.tsx +6 -1
  63. package/Pagination/styles.ts +3 -0
  64. package/Pagination/types.ts +2 -0
  65. package/Popup/PopupNotify.tsx +108 -40
  66. package/Popup/PopupPromotion.tsx +45 -10
  67. package/Popup/types.ts +13 -10
  68. package/Radio/index.tsx +35 -21
  69. package/Radio/types.ts +7 -5
  70. package/Skeleton/index.tsx +1 -1
  71. package/Switch/index.tsx +32 -19
  72. package/Switch/types.ts +5 -3
  73. package/Tag/index.tsx +2 -4
  74. package/Text/index.tsx +26 -6
  75. package/Text/styles.ts +38 -0
  76. package/Text/types.ts +25 -13
  77. package/Title/index.tsx +177 -63
  78. package/Title/styles.ts +48 -15
  79. package/Title/types.ts +16 -47
  80. package/code-scanner.js +125 -16
  81. package/index.ts +9 -0
  82. package/migrate_typo.js +56 -0
  83. package/package.json +9 -8
  84. package/publish.sh +21 -16
  85. package/tsconfig.json +1 -2
  86. package/verify.js +24 -6
  87. package/Application/BottomTab.tsx +0 -65
@@ -1,32 +1,146 @@
1
- import React, {useContext, useLayoutEffect} from 'react';
1
+ import React, {useContext, useEffect, useLayoutEffect, useRef} from 'react';
2
2
  import {ScreenParams} from './types';
3
3
  import Navigation from './Navigation';
4
- import {ApplicationContext} from './index';
4
+ import {ApplicationContext, MiniAppContext, ScreenContext} from './index';
5
5
  import {GridSystem} from '../Layout';
6
+ import {useHeaderHeight} from '@react-navigation/stack';
7
+ import {Alert, InteractionManager} from 'react-native';
6
8
 
7
9
  const StackScreen: React.FC<ScreenParams> = props => {
8
- const {screen: Component, options}: ScreenParams = props.route.params;
9
- const {theme, showGrid} = useContext(ApplicationContext);
10
+ const {theme, showGrid, navigator} = useContext(ApplicationContext);
11
+ const startTime = useRef(Date.now());
12
+ const endTime = useRef(Date.now());
13
+ const timeLoad = useRef(0);
14
+ const timeInteraction = useRef(0);
15
+ const timeoutLoad = useRef<any>();
16
+ const tracked = useRef<any>({
17
+ releaseLoad: undefined,
18
+ releaseInteraction: undefined,
19
+ timeoutLoad: undefined,
20
+ timeoutInteraction: undefined,
21
+ });
22
+ const interaction = useRef<any>();
23
+ const context = useContext<any>(MiniAppContext);
24
+
25
+ const {screen: Component, options, initialParams} = props.route.params;
10
26
  const navigation = new Navigation(props.navigation, theme);
27
+ const heightHeader = useHeaderHeight();
11
28
 
12
- const params = {
29
+ const data = {
30
+ ...initialParams,
13
31
  ...props.route.params,
14
32
  navigation,
15
33
  };
16
34
 
17
- delete params.screen;
35
+ delete data.screen;
36
+ delete data.initialParams;
37
+
38
+ const screenName = Component?.name || Component?.type?.name || 'Invalid';
18
39
 
40
+ /**
41
+ * set options for screen
42
+ */
19
43
  useLayoutEffect(() => {
20
44
  if (options) {
21
45
  navigation.setOptions(options);
22
46
  }
23
47
  }, [options]);
24
48
 
49
+ /**
50
+ * tracking for screen
51
+ */
52
+ useEffect(() => {
53
+ if (__DEV__ && (!screenName || screenName == 'Invalid')) {
54
+ Alert.alert('Design system', `Unvalidated screen name "${screenName}" !`);
55
+ }
56
+
57
+ navigator?.maxApi?.of?.({screenName});
58
+ tracked.current.timeoutLoad = setTimeout(() => {
59
+ onScreenLoad();
60
+ }, 5000);
61
+ tracked.current.timeoutInteraction = setTimeout(() => {
62
+ onScreenInteraction();
63
+ }, 5000);
64
+
65
+ return () => {
66
+ onScreenLoad();
67
+ onScreenInteraction();
68
+ };
69
+ }, []);
70
+
71
+ /**
72
+ * tracking for screen load
73
+ */
74
+ const onScreenLoad = () => {
75
+ clearTimeout(tracked.current.timeoutLoad);
76
+ if (!tracked.current?.releaseLoad) {
77
+ context.autoTracking?.({
78
+ appId: context.appId,
79
+ code: context.code,
80
+ buildNumber: context.buildNumber,
81
+ screenName,
82
+ componentName: 'Screen',
83
+ state: 'load',
84
+ duration: timeLoad.current,
85
+ });
86
+ navigator?.maxApi?.showToastDebug?.({
87
+ appId: `auto - ${context.appId}`,
88
+ message: `${screenName} screen_load_time ${timeLoad.current}`,
89
+ });
90
+ tracked.current.releaseLoad = true;
91
+ }
92
+ };
93
+
94
+ /**
95
+ * tracking for screen load
96
+ */
97
+ const onScreenInteraction = () => {
98
+ clearTimeout(tracked.current.timeoutInteraction);
99
+ if (!tracked.current?.releaseInteraction) {
100
+ context.autoTracking?.({
101
+ appId: context.appId,
102
+ code: context.code,
103
+ buildNumber: context.buildNumber,
104
+ screenName,
105
+ componentName: 'Screen',
106
+ state: 'interaction',
107
+ duration: timeInteraction.current - timeLoad.current,
108
+ });
109
+
110
+ navigator?.maxApi?.showToastDebug?.({
111
+ appId: `auto - ${context.appId}`,
112
+ message: `${screenName} screen_interaction_time ${timeInteraction.current}`,
113
+ });
114
+ tracked.current.releaseInteraction = true;
115
+ }
116
+ };
117
+
25
118
  return (
26
- <>
27
- <Component {...params} />
119
+ <ScreenContext.Provider
120
+ value={{
121
+ screenName,
122
+ onElementLoad: () => {
123
+ endTime.current = Date.now();
124
+ interaction.current?.cancel?.();
125
+ interaction.current = InteractionManager.runAfterInteractions(() => {
126
+ timeInteraction.current = Date.now() - startTime.current;
127
+ });
128
+ clearTimeout(timeoutLoad.current);
129
+ timeoutLoad.current = setTimeout(() => {
130
+ if (timeLoad.current === 0) {
131
+ timeLoad.current = endTime.current - startTime.current;
132
+ }
133
+ }, 2000);
134
+ },
135
+ }}>
136
+ <Component
137
+ heightHeader={heightHeader}
138
+ {...data}
139
+ onScreenLoad={onScreenLoad}
140
+ onScreenInteraction={onScreenInteraction}
141
+ />
28
142
  {showGrid && <GridSystem />}
29
- </>
143
+ </ScreenContext.Provider>
30
144
  );
31
145
  };
32
146
 
@@ -1,24 +1,37 @@
1
+ import {Platform} from 'react-native';
1
2
  import {NavigationContainer} from './NavigationContainer';
2
3
  import Screen from '../Layout/Screen';
3
4
  import {
5
+ HeaderAnimated,
6
+ HeaderBackground,
7
+ HeaderCustom,
4
8
  HeaderRightAction,
5
- NavigationButton,
6
- HeaderToolkitAction,
7
9
  HeaderTitle,
10
+ NavigationButton,
8
11
  } from './Components';
9
12
  import BottomTab from './BottomTab';
10
13
  import {createContext} from 'react';
11
14
  import {defaultContext} from '../Consts';
12
15
 
16
+ const Context = createContext({});
13
17
  const ApplicationContext = createContext(defaultContext);
14
18
 
19
+ const MiniAppContext = (Platform as any).MiniAppContext ?? createContext({});
20
+ const ScreenContext = (Platform as any).ScreenContext ?? createContext({});
21
+ const ComponentContext = (Platform as any).ComponentContext ?? Context;
22
+
15
23
  export {
16
- NavigationContainer,
17
24
  ApplicationContext,
25
+ MiniAppContext,
26
+ ScreenContext,
27
+ ComponentContext,
28
+ NavigationContainer,
18
29
  Screen,
30
+ BottomTab,
19
31
  NavigationButton,
20
- HeaderRightAction,
21
- HeaderToolkitAction,
22
32
  HeaderTitle,
23
- BottomTab,
33
+ HeaderBackground,
34
+ HeaderRightAction,
35
+ HeaderCustom,
36
+ HeaderAnimated,
24
37
  };
@@ -1,8 +1,9 @@
1
- import {Animated} from 'react-native';
2
- import React from 'react';
3
- import Navigator from './Navigator';
1
+ import {StackNavigationOptions} from '@react-navigation/stack';
2
+ import React, {ReactElement} from 'react';
3
+ import {Animated, ViewProps} from 'react-native';
4
4
  import {PopupNotifyProps} from '../Popup/types';
5
5
  import Navigation from './Navigation';
6
+ import Navigator from './Navigator';
6
7
 
7
8
  type Screen = React.ComponentType<NavigationScreenProps>;
8
9
 
@@ -62,10 +63,10 @@ export type Theme = {
62
63
  };
63
64
 
64
65
  export type Context = {
66
+ [key: string]: any;
65
67
  theme: Theme;
66
68
  navigator?: Navigator;
67
69
  showGrid?: boolean;
68
- language?: 'vi' | 'en';
69
70
  translate?: (key: string) => string;
70
71
  };
71
72
 
@@ -82,8 +83,9 @@ export type NavigationContainerProps = {
82
83
  screen: Screen;
83
84
  options?: NavigationOptions;
84
85
  theme: Theme;
85
- maxApi?: any;
86
+ maxApi: any;
86
87
  localization?: LocalizationObject;
88
+ initialParams?: any;
87
89
  };
88
90
 
89
91
  export type NavigationScreenProps = {
@@ -98,52 +100,87 @@ export type ScreenParams = {
98
100
  options?: NavigationOptions;
99
101
  };
100
102
 
101
- export interface ModalParams extends ScreenParams {
103
+ export type ModalParams = {
102
104
  [key: string]: any;
105
+ screen: React.ComponentType;
103
106
  onDismiss?: () => void;
104
107
  barrierDismissible?: boolean;
105
- }
108
+ };
106
109
 
107
- export interface BottomSheetParams extends ScreenParams {
110
+ export type BottomSheetParams = {
108
111
  [key: string]: any;
109
- onDismiss?: () => void;
110
- snapPoint?: '30%' | '50%' | '70%' | '90%';
111
- }
112
+ screen: React.ComponentType;
113
+ options: {
114
+ title: string;
115
+ surface?: boolean;
116
+ };
117
+ surface?: boolean;
118
+ onDismiss?: (type?: string) => void;
119
+ barrierDismissible?: boolean;
120
+ draggable?: boolean;
121
+ useBottomInset?: boolean;
122
+ keyboardVerticalOffset?: number;
123
+ };
112
124
 
113
125
  export type NavigationButtonProps = {
114
126
  icon: string;
115
127
  tintColor?: string;
116
- backgroundColor?: string;
117
128
  useBorder?: boolean;
118
129
  onPress: () => void;
130
+ badgeType?: 'dot' | 'number';
131
+ badgeValue?: number;
119
132
  accessibilityLabel?: string;
120
133
  };
121
134
 
122
- export type NavigationOptions = {
135
+ export type PinnedToolType = {
136
+ key: string;
137
+ badgeValue?: number;
138
+ badgeType?: 'number' | 'dot';
139
+ };
140
+
141
+ export type RuntimeToolType = {
142
+ title: {vi: string; en: string};
143
+ icon: string;
144
+ key: string;
145
+ };
146
+
147
+ export interface NavigationOptions
148
+ extends Omit<StackNavigationOptions, 'headerRight'> {
123
149
  preventBack?: PopupNotifyProps;
124
150
  onPressLeftHeader?: () => void;
125
151
  surface?: boolean;
126
- headerTransparent?: boolean;
127
152
  hiddenBack?: boolean;
128
- title?: string;
129
- headerTitle?: (props?: any) => React.ReactElement;
130
- headerTitleAlign?: 'left' | 'center';
131
153
  customTitle?: TitleCustomProps;
132
- headerRight?: (props?: any) => React.ReactElement;
133
- animatedValue?: Animated.Value;
154
+ headerRight?: HeaderRightToolkit | HeaderRightActions | Element;
155
+ }
156
+
157
+ export type HeaderRightToolkit = {
158
+ type?: 'toolkit';
159
+ pinnedTool?: PinnedToolType;
160
+ runtimeTools?: RuntimeToolType[];
161
+ preventClose?: PopupNotifyProps;
162
+ useMore?: boolean;
163
+ };
164
+
165
+ export type HeaderRightActions = {
166
+ type?: 'iconButton';
167
+ buttons: IconButton[];
168
+ };
169
+
170
+ export type IconButton = {
171
+ icon: string;
172
+ onPress: () => void;
134
173
  };
135
174
 
136
175
  export interface HeaderBackProps extends NavigationButtonProps {
137
176
  preventBack?: PopupNotifyProps;
138
177
  onPressLeftHeader?: () => void;
139
- accessibilityLabel?: string;
140
178
  }
141
179
 
142
180
  export type HeaderBackgroundProps = {
143
181
  image?: string | null;
144
- backgroundColor?: string | null;
145
182
  animatedValue?: Animated.Value;
146
- useBorder?: boolean;
183
+ useSurface?: boolean;
147
184
  };
148
185
 
149
186
  export type TitleCustomProps = {
@@ -159,26 +196,46 @@ export type TitleCustomProps = {
159
196
  export type HeaderToolkitProps = {
160
197
  [key: string]: any;
161
198
  appCode: string;
162
- hidden: boolean;
163
- type: string;
164
- onAction?: (action: string) => void;
199
+ configs: any[];
165
200
  };
166
201
 
202
+ export interface HeaderAnimatedProps extends ViewProps {
203
+ animatedValue: Animated.Value;
204
+ image: string;
205
+ }
206
+
167
207
  export type BottomTabItemProps = {
168
208
  name: string;
169
209
  label: string;
170
210
  icon: string;
171
211
  showDot?: boolean;
172
- badgeLabel?: string;
212
+ badgeLabel?: string | number;
173
213
  screen: Screen;
174
214
  options: NavigationOptions;
215
+ initialParams?: any;
175
216
  };
176
217
 
177
218
  export type BottomTabProps = {
219
+ nested?: boolean;
178
220
  tabs: BottomTabItemProps[];
221
+ initialRouteName?: string;
179
222
  navigation: Navigation;
180
223
  listeners?: {
181
224
  tabPress?: any;
182
225
  focus?: any;
183
226
  };
227
+ floatingButton?: FloatingButtonProps;
228
+ };
229
+
230
+ export type FloatingButtonProps = {
231
+ container?: React.ReactNode;
232
+ icon: string | React.ReactNode;
233
+ label: string;
234
+ onPress: () => void;
235
+ };
236
+
237
+ export type AnimatedHeader = {
238
+ type: 'default' | 'surface';
239
+ component?: (props?: any) => React.ReactElement;
240
+ headerTitle?: (props?: any) => React.ReactElement;
184
241
  };
@@ -13,39 +13,37 @@ import {
13
13
  import {NavigationOptions, Theme} from './types';
14
14
  import {Colors} from '../Consts';
15
15
 
16
- const getTintColor = (theme: Theme): any => {
17
- if (theme.assets?.headerBackground) {
18
- return {
19
- headerTintColor: Colors.black_01,
20
- };
21
- }
22
- return {
23
- headerTintColor: theme.colors.text.default,
24
- };
25
- };
26
-
27
- const getStackOptions = (theme: Theme): StackNavigationOptions => {
16
+ /**
17
+ * default options for stack screen
18
+ */
19
+ const getStackOptions = (): StackNavigationOptions => {
28
20
  return {
29
21
  headerTitleAlign: 'left',
30
22
  headerTitle: HeaderTitle,
31
- headerBackground: HeaderBackground,
23
+ headerBackground: (props: any) => <HeaderBackground {...props} />,
32
24
  headerLeft: (props: any) => <HeaderLeft {...props} />,
33
25
  headerRight: (props: any) => <HeaderToolkitAction {...props} />,
34
- ...getTintColor(theme),
26
+ headerTintColor: Colors.black_01,
35
27
  };
36
28
  };
37
29
 
38
- const getDialogOptions = (theme: Theme): StackNavigationOptions => {
30
+ /**
31
+ * default options for dialog screen
32
+ */
33
+ const getDialogOptions = (): StackNavigationOptions => {
39
34
  return {
40
35
  headerTitleAlign: 'left',
41
36
  headerTitle: HeaderTitle,
42
37
  headerLeft: (props: any) => <HeaderLeft {...props} />,
43
- headerBackground: HeaderBackground,
44
- ...getTintColor(theme),
38
+ headerBackground: (props: any) => <HeaderBackground {...props} />,
39
+ headerTintColor: Colors.black_01,
45
40
  ...TransitionPresets.ModalTransition,
46
41
  };
47
42
  };
48
43
 
44
+ /**
45
+ * default options for modal screen
46
+ */
49
47
  const getModalOptions = (): StackNavigationOptions => {
50
48
  return {
51
49
  headerShown: false,
@@ -71,9 +69,10 @@ const getModalOptions = (): StackNavigationOptions => {
71
69
  };
72
70
  };
73
71
 
72
+ /**
73
+ * build react-navigation options
74
+ */
74
75
  const getOptions = (params: NavigationOptions, theme: Theme) => {
75
- let backgroundProps: any;
76
- let titleProps: any;
77
76
  let options = {};
78
77
 
79
78
  if (
@@ -95,40 +94,24 @@ const getOptions = (params: NavigationOptions, theme: Theme) => {
95
94
  };
96
95
  }
97
96
 
98
- if (typeof params.surface == 'boolean') {
97
+ if (typeof params.surface === 'boolean') {
99
98
  if (params.surface) {
100
99
  options = {
101
100
  ...options,
102
- ...getTintColor({
103
- ...theme,
104
- assets: {...theme.assets, headerBackground: undefined},
105
- }),
106
- };
107
- backgroundProps = {
108
- image: null,
109
- backgroundColor: theme.colors.background.surface,
110
- useBorder: true,
101
+ headerTintColor: theme.colors.text.default,
102
+ headerBackground: () => (
103
+ <HeaderBackground image={null} useSurface={true} />
104
+ ),
111
105
  };
112
106
  } else {
113
107
  options = {
114
108
  ...options,
115
- ...getTintColor(theme),
109
+ headerTintColor: Colors.black_01,
116
110
  headerBackground: HeaderBackground,
117
111
  };
118
112
  }
119
113
  }
120
114
 
121
- if (params.animatedValue) {
122
- backgroundProps = {...backgroundProps, animatedValue: params.animatedValue};
123
- titleProps = {animatedValue: params.animatedValue};
124
- options = {
125
- ...options,
126
- headerTitle: (props: any) => {
127
- return <HeaderTitle {...titleProps} {...props} />;
128
- },
129
- };
130
- }
131
-
132
115
  if (params.customTitle) {
133
116
  options = {
134
117
  ...options,
@@ -139,17 +122,23 @@ const getOptions = (params: NavigationOptions, theme: Theme) => {
139
122
  };
140
123
  }
141
124
 
142
- if (backgroundProps) {
143
- options = {
144
- ...options,
145
- headerBackground: () => <HeaderBackground {...backgroundProps} />,
146
- };
147
- }
148
-
149
125
  return {
150
126
  ...params,
151
127
  ...options,
152
128
  };
153
129
  };
154
130
 
155
- export {getStackOptions, getDialogOptions, getModalOptions, getOptions};
131
+ const formatNameLength = (name = '') => {
132
+ let formattedName = name;
133
+ if (formattedName.length > 100) {
134
+ formattedName = formattedName.substring(0, 100);
135
+ }
136
+ return formattedName;
137
+ };
138
+ export {
139
+ getStackOptions,
140
+ getDialogOptions,
141
+ getModalOptions,
142
+ getOptions,
143
+ formatNameLength,
144
+ };
package/Assets/icon.json CHANGED
@@ -801,7 +801,7 @@
801
801
  "uri": "https://img.mservice.com.vn/app/img/kits/navigation_minus_circle_full.png"
802
802
  },
803
803
  "navigation_more_horiz": {
804
- "uri": "https://img.mservice.com.vn/app/img/kits/navigation_more_horiz.png"
804
+ "uri": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAgKADAAQAAAABAAAAgAAAAABIjgR3AAAFAklEQVR4Ae2aS4tcRRiGM2rEO14SY7wFURGc+CPEyyYJLnSlaCCKLgSzUNBNRAMSF0LIRhGDBMQQMAQ3Zin+A/VHKOIlTm4aJ5fx+VBCT5Puru9UleOE54OX7nO66n2rnj7dp+ucXrPGkoAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhLoTmCue8JYwNLS0m3s2ooeQXeiJfQj+h59NTc39zuP3Yr89ZhH/mYU+RdQ5H+HIn+Bx25F/u2YR/48ivzzKPK/RUfJP87j5VdM/EH0BTqHJtVZXjiI7mtNAM+H0BF0Hk2qyP8MbeqQ/zC+X6Jp+Yu8fgDd2zp/Rf2Y0E4UcEvrLxq+3GrQeL2OMvlnaL+jYf6b+E078Hl5Wf3J1gut8lfUh4nsWza13Mae2sET92Euclnr3Q3yP1nmmNvYVZu/ov2Z62u5+V6y9UtDJ4FbfPJra3tF/lu14fR/dmj+ivZj4A+gOKfVVnwd3pOdDH3inJ/52p80ztO8sHFA/jz9pp3vJ+WN7z/Jjvjh2KWu6OL6j+l7PKxt4H8NHu8O8InTx1UD+o13uY4d74zvLNh+nzYt+N6Az9sFeYOadFkGcsTewmh+Ri3egJjYGbSOJdLp2JhV5MdS7yfU4g2IuMiN/BjHzCI/vjF+QK34nsBrPfmLM8OTDVoBGo/dwo5Wb354x7fAk/GksGKd3XJu1+P3eGF2NNuGWr354XcTejSetK6WkEbHFhdZWlfGM9O2dJwZz0zbHvmlnk0/JaOhcYWrdWU8M21Lx5nxzLTtkV/q2e0AiMurrSvjmWlbOs6MZ6Ztj/xSz24HQFzbbl0Zz0zb0nFmPDNte+SXenY7AOLGSuvKeGbalo4z45lp2yO/1LPpL9WLoSyDbmTjV3T1xZ11T7LLsJuJ+wW1WomklmHMfx3ZsQy9ErWoY5hsYBl4roXZqEeXVQADPUnI56NBlc8PlK7BI4e2Czwcqswc7f4pnoujO6Y9p20c/IentUm+th/P5m9+cgy55nwK7kZ/oNo6gUH6Uih9NqG4q1dbCxjEfxhSRZ/7UYtL4b/hE99oq68Y+POopi7Q+ZmhM6fvjppw+kb+UxX5r1Tmx72EuKi2eosJ7BoIIeC/UTtzPHZX5O9skL9nYH68+a/W5v8v+jOR59CpBIjjtH261eDx2o7irl5pxdf+4E/++LjxehFlTofHaL913GdVbzOhO9BHKG5vTqo438cfSOJmTtPCcyP6GE07EOPA24vS5/xZg8XzLrQfTTsQ48D7AN06y6/V6y1vWBSNicnFjZ3H0KX+FPp15td2UeBYo3/z48bOZhSXbOOqXVy4ibX7N/9B/rXkPIHmUeSP/ik08s+yz5KABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISuJwI/A2lzL3lHltsxwAAAABJRU5ErkJggg=="
805
805
  },
806
806
  "navigation_more_vert": {
807
807
  "uri": "https://img.mservice.com.vn/app/img/kits/navigation_more_vert.png"
@@ -822,7 +822,7 @@
822
822
  "uri": "https://img.mservice.com.vn/app/img/kits/navigation_scan.png"
823
823
  },
824
824
  "navigation_search": {
825
- "uri": "https://img.mservice.com.vn/app/img/kits/navigation_search.png"
825
+ "uri": "data:image/webp;base64,UklGRqwEAABXRUJQVlA4TKAEAAAvf8AfEDVIchtJkqT6/6fZ21hkukWeZouKkARJtmlbtm3btm3b741sjWzbtm3btm184xkLgiS5cZsGUuXbsJOAoPSD88dlwMVKiDwdxtRJ4UUP+XlwcpVn1A0I4dWOVnEMET7n62avxi24FD4tSyT9AJCpq/YI7oQjYZj3Bp2zU3A/dBDfF0y+bsBMGCK3KTpOwFyoR70h9Nreo+EvXyi7Ye4vmA7TaLcCQy4ohB90NoLaKqiEL1HbwOH84sdyqk+aQC5smHLkKViZWT8vXlACZQ/EfAcXOJa5bPO4uGm51A91wtzix3+w5I88UhfXAw5GL6Rh6Bvcu77smyD4N4okpNkXWIVGSPVXWz7DqyjYN+vEa3yZctrvunwjw9gGSmW3/EXx6ZILFiTM/BYx2FjwRqzabUHmhe1UtXBWS4RTBMW1xt/MLYm5eiGKXqSGnsX3ZwPNaMUsvYMYtGoL/eIymuGauS66JIzSmOMkP4NE9z9GeAdfELGdrxqK0cgj0sqM6Sa/a6NuxI5BCrENnHO763RvvF7jUlV4B8hOY7PHVvq/EQNSCJpHAyS1AQaWs8QZxHGq40oLu9a32IIU5Mc3dx7z76wGipNE0TT28W8WfnHd4hSrhz5MTSKvuW7C9q931W1Cqjo3KK/1Xpxx0ThVVBKTtWVLZhdU/9P8A3OUvIRheXDUmz4AwVFp0fKJsExgwmKUm8BJe26nmggb7XqpWr1t6BK1k7Al0togegyMTiKcCKjv2xwFliaRT7jUWQ3slyZeNnUmAjeTGCdM6wylAzGTqCcc68wGLieRSnjW2QrsjY6sieA6V4Hl0Q1noqx+xM5Xp4NC9hqYbcPXOgJiJ/CzjVmrg2pN5eIsk5YwGiUu4VZmI0E3imGipQtpeqS7Mwqhz7RnhlvFBQTahwu2nArmUGUm4TVMUmKkCRtIMA4jDVIQKpKX2Bov2XGiuQeVl+ahH2HxCD/eGhmpdp/ox2GOV4234PWe6CtUrTMmu9LIaxIkDAqIR75jqOAH4qMhdie299sGnAIaPkDeczWQe8fQNv/F4fAbJLZLZz/U5xQ9DaGDWLMvMq1zLv7mZDl8xMkgiGTU+gbfzDvX0csGFiceYNdAMQ1yyD1zz3AAMsrFdQOtHyCHUcRTb+Q3yBR2z/X7Wp3uxDvS7vj6AAtEu4OTKLAIr2Jg3W/2JsEyXGPrphKwCmds770kKhnewXuzhKITLMMJJ9iXYZX3vdBvlzANg3X4p5wK1CsjLpcfQ96OCV0juBL+6xVIFd2vawEMvEyl2fg+47xrQpIDroZHR1ZNGDJry5VPMBCusXZfjI83cDf2T2JOCxQSdb1VItAwzelXs8e2Vx5ajif5kvHVGvZLGMI9jrH9PWfsmAepWH9mLrH4mrJ2zYNAkLO7fOpjCHHRirfLA5G8In9usCX8x/Zm8zwHOnnhJr1d4E47rx9b24ncI2ARZClMrVFL9t344dKeZb1yBDL6ua+byl1jLl39vktXq8Ty/ET6+NRwHp84H59sXghPT24vhKcnqRfCw9MetPPs9EHyhfDUQKrhx2WS58GBkw030p/3/nUYBw=="
826
826
  },
827
827
  "navigation_search_add": {
828
828
  "uri": "https://img.mservice.com.vn/app/img/kits/navigation_search_add.png"
@@ -2640,7 +2640,7 @@
2640
2640
  "uri": "https://img.mservice.io/momo_app_v2/new_version/img/appx_icon/16_navigation_close_circle_full.png"
2641
2641
  },
2642
2642
  "16_navigation_close_circle": {
2643
- "uri": "https://img.mservice.io/momo_app_v2/new_version/img/appx_icon/16_navigation_close_circle.png"
2643
+ "uri": "data:image/webp;base64,UklGRkICAABXRUJQVlA4TDUCAAAvP8APEM8x//M//wzbRlKcvMws3D1DYBwIAASMF4YAQCHQAAED7AAg8AMYB0DhQCMgGAnwAARuAAHcAABsSCQMYAgFAFIhSQDYtJHKzMzMzB3//2mWbdmahaMVR/QfgiS5cZsB4DskKoXzC7H/FklUBov99fENkd/zoJJwTKqzegmDvEIn5Y706CFQEo3Y0dm9m0AL9yIHNC/CSkLTlvhY5+N50q2XslGo+8lZ5w3HrchshMJhWGStRMGrHm0yFuSOArKtYpyqbhWnjgFvdw84tbF+RSfo1x2rGeX1LBlDS5gpLyPcafAvfvoxK4kC/IM4BnjRsxGzFB/gPZh4g6+tjdnDl+b4S1wAfXYgEQzghIkePM1NYsHDeqZUvYFbk24I4NJbWs9ISFqqG+X5NG/Ch3lZE3/AyZG+zjxAtGvs4/27pid6e//R6A6UkZSOjpBUVebCSzWZ93NNCgE3g441SFVWmQqoJvNB4xhI4pXu5JdkqKHwVtRgnNcQQClNmP4P2kJRU9XghLaMAE8qKgNQpphRijTms2SgspRMGKlI44lkqbKXdBmpSOOuJKhcJXVGKtI4SK4qD0mJEWphHEDkqnwlWcYo3jgrCfTQv6H/Cf1B5HG7+D15UyHLW3zdyDurG+R1i75u0tdtRN9o2/SNAqZv0Pct8r5J37fJ5wbyuYV+biKf22znxpb93Eg+t5LPzeRzO/XeQL63UO9NLve2tXlvW4eU672xOliqe+NywInY/4owAA=="
2644
2644
  },
2645
2645
  "16_navigation_close": {
2646
2646
  "uri": "https://img.mservice.io/momo_app_v2/new_version/img/appx_icon/16_navigation_close.png"
@@ -3918,7 +3918,7 @@
3918
3918
  "uri": "https://img.mservice.com.vn/app/img/kits/Phonebook-outline.png"
3919
3919
  },
3920
3920
  "ic_back": {
3921
- "uri": "https://img.mservice.com.vn/momo_app_v2/new_version/img/appx_icon/ic_back_ios.png"
3921
+ "uri": "data:image/webp;base64,UklGRqIBAABXRUJQVlA4TJYBAAAvX8AXEFVActtIkjT//zRn9WzKYwOJRgQkAADLRtvOtm3btm3b9r1svWzbtm3btu27OHIkN26abK9JbpFIPuE+bAQmFS5c6qcQhrE34CPEZKHr9/kJf0SiUPENfAnNTcj4eH7FaRKiXoGBmyJ4PQILPUGwuwUmtHpgdLFV0RO1461eyDmQ2tsahZYTgY2tGZg54VjcWoabE4aprU1EOaEa3tpHnhOS7q1TNDkhaN66wpQTnKqtOxw5QRVsPeHvLRfSt16J9ZS49UGup/Ctb+o9BW790u/JbeufZU82/jecggWWvy3fnrT8bAX1pORrK7YnKe9byT1RetrKAe2hcqsM7PZwMVEP/h5A/Eb52039I3LfPlL/IUkvkHvA/7q+Lgm+t76u8ikm2/q+cC/37/e1/L5cTGHf1xUH1EX5ui4IqMLv69ID6up4X+AS01se0Ncc0Jcd0Ffm++JgIvxBX9+fS/TnKsHE8O1cqD/XKia+b+Zy/bniAXPRZlAd5ZjmA+bS1WDq51MVI+R2A4tKRx51UL6PD3EB"
3922
3922
  },
3923
3923
  "share": {
3924
3924
  "uri": "https://img.mservice.com.vn/app/img/mini-app-center/share.png"
@@ -3936,7 +3936,7 @@
3936
3936
  "uri": "https://img.mservice.com.vn/app/img/kits/error_mess_icon.png"
3937
3937
  },
3938
3938
  "media_fail": {
3939
- "uri": "https://static.momocdn.net/app/img/kits/media_fail.png"
3939
+ "uri": "data:image/png;base64,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"
3940
3940
  },
3941
3941
  "ic_checked": {
3942
3942
  "uri": "https://img.mservice.com.vn/app/img/kits/checked_ic.png"
@@ -3949,5 +3949,83 @@
3949
3949
  },
3950
3950
  "ic_money_bag": {
3951
3951
  "uri": "https://static.momocdn.net/app/img/kits/ic_money_bag.png"
3952
+ },
3953
+ "basic_flaged": {
3954
+ "uri": "https://static.momocdn.net/app/img/kits/basic_flaged.png"
3955
+ },
3956
+ "basic_user": {
3957
+ "uri": "https://static.momocdn.net/app/img/kits/basic_user.png"
3958
+ },
3959
+ "media_player_play_not": {
3960
+ "uri": "https://static.momocdn.net/app/img/kits/media_player_play_not.png"
3961
+ },
3962
+ "navigation_AR": {
3963
+ "uri": "https://static.momocdn.net/app/img/kits/navigation_AR.png"
3964
+ },
3965
+ "navigation_scan_barcode": {
3966
+ "uri": "https://static.momocdn.net/app/img/kits/navigation_scan_barcode.png"
3967
+ },
3968
+ "notifications_follow": {
3969
+ "uri": "https://static.momocdn.net/app/img/kits/notifications_follow.png"
3970
+ },
3971
+ "notifications_followed": {
3972
+ "uri": "https://static.momocdn.net/app/img/kits/notifications_followed.png"
3973
+ },
3974
+ "notifications_unfollow": {
3975
+ "uri": "https://static.momocdn.net/app/img/kits/notifications_unfollow.png"
3976
+ },
3977
+ "reaction_disliked": {
3978
+ "uri": "https://static.momocdn.net/app/img/kits/reaction_disliked.png"
3979
+ },
3980
+ "reaction_liked": {
3981
+ "uri": "https://static.momocdn.net/app/img/kits/reaction_liked.png"
3982
+ },
3983
+ "travel_247": {
3984
+ "uri": "https://static.momocdn.net/app/img/kits/travel_247.png"
3985
+ },
3986
+ "travel_children_area": {
3987
+ "uri": "https://static.momocdn.net/app/img/kits/travel_children_area.png"
3988
+ },
3989
+ "travel_cooker": {
3990
+ "uri": "https://static.momocdn.net/app/img/kits/travel_cooker.png"
3991
+ },
3992
+ "travel_dishwasher": {
3993
+ "uri": "https://static.momocdn.net/app/img/kits/travel_dishwasher.png"
3994
+ },
3995
+ "travel_electronic_stove": {
3996
+ "uri": "https://static.momocdn.net/app/img/kits/travel_electronic_stove.png"
3997
+ },
3998
+ "travel_friend_group": {
3999
+ "uri": "https://static.momocdn.net/app/img/kits/travel_friend_group.png"
4000
+ },
4001
+ "travel_gas_stove": {
4002
+ "uri": "https://static.momocdn.net/app/img/kits/travel_gas_stove.png"
4003
+ },
4004
+ "travel_kid_area": {
4005
+ "uri": "https://static.momocdn.net/app/img/kits/travel_kid_area.png"
4006
+ },
4007
+ "travel_led_Light": {
4008
+ "uri": "https://static.momocdn.net/app/img/kits/travel_led_Light.png"
4009
+ },
4010
+ "travel_light": {
4011
+ "uri": "https://static.momocdn.net/app/img/kits/travel_light.png"
4012
+ },
4013
+ "travel_music": {
4014
+ "uri": "https://static.momocdn.net/app/img/kits/travel_music.png"
4015
+ },
4016
+ "travel_outdoor_table": {
4017
+ "uri": "https://static.momocdn.net/app/img/kits/travel_outdoor_table.png"
4018
+ },
4019
+ "travel_private_room": {
4020
+ "uri": "https://static.momocdn.net/app/img/kits/travel_private_room.png"
4021
+ },
4022
+ "travel_romantic": {
4023
+ "uri": "https://static.momocdn.net/app/img/kits/travel_romantic.png"
4024
+ },
4025
+ "travel_smoking": {
4026
+ "uri": "https://static.momocdn.net/app/img/kits/travel_smoking.png"
4027
+ },
4028
+ "travel_suitcase": {
4029
+ "uri": "https://static.momocdn.net/app/img/kits/travel_suitcase.png"
3952
4030
  }
3953
4031
  }