@momo-kits/foundation 0.81.42 → 0.81.43-api.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.
@@ -3,29 +3,45 @@ import {Platform} from 'react-native';
3
3
  import {BottomTabProps, NavigationScreenProps} from './types';
4
4
  import {createBottomTabNavigator} from '@react-navigation/bottom-tabs';
5
5
  import {createStackNavigator} from '@react-navigation/stack';
6
+ import {useSafeAreaInsets} from 'react-native-safe-area-context';
7
+ import {NavigationContainer} from '@react-navigation/native';
6
8
  import {Icon} from '../Icon';
7
9
  import {Text} from '../Text';
8
10
  import {ApplicationContext} from './index';
9
11
  import {getStackOptions} from './utils';
10
12
  import StackScreen from './StackScreen';
11
- import {useSafeAreaInsets} from 'react-native-safe-area-context';
12
13
 
13
14
  const Tab = createBottomTabNavigator();
14
15
  const Stack = createStackNavigator();
15
16
 
16
17
  const TabScreen: React.FC<NavigationScreenProps> = ({route}) => {
18
+ if (route.params?.nested) {
19
+ return (
20
+ <Stack.Navigator>
21
+ <Stack.Screen
22
+ name="Stack"
23
+ component={StackScreen}
24
+ initialParams={{screen: route.params?.screen}}
25
+ options={{...getStackOptions(), ...route.params?.options}}
26
+ />
27
+ </Stack.Navigator>
28
+ );
29
+ }
17
30
  return (
18
- <Stack.Navigator>
19
- <Stack.Screen
20
- name="Stack"
21
- component={StackScreen}
22
- initialParams={{screen: route.params?.screen}}
23
- options={{...getStackOptions(), ...route.params?.options}}
24
- />
25
- </Stack.Navigator>
31
+ <NavigationContainer independent={true}>
32
+ <Stack.Navigator>
33
+ <Stack.Screen
34
+ name="Stack"
35
+ component={StackScreen}
36
+ initialParams={{screen: route.params?.screen}}
37
+ options={{...getStackOptions(), ...route.params?.options}}
38
+ />
39
+ </Stack.Navigator>
40
+ </NavigationContainer>
26
41
  );
27
42
  };
28
43
  const BottomTab: React.FC<BottomTabProps> = ({
44
+ nested,
29
45
  tabs,
30
46
  listeners,
31
47
  navigation,
@@ -61,7 +77,7 @@ const BottomTab: React.FC<BottomTabProps> = ({
61
77
  key={item.name}
62
78
  name={item.name}
63
79
  component={TabScreen}
64
- initialParams={item}
80
+ initialParams={{...item, nested}}
65
81
  listeners={listeners}
66
82
  options={{
67
83
  tabBarLabel: ({color, focused}) => {
@@ -95,7 +95,7 @@ const styles = StyleSheet.create({
95
95
  badge: {
96
96
  position: 'absolute',
97
97
  top: -8,
98
- right: -8,
98
+ right: -6,
99
99
  },
100
100
  });
101
101
 
@@ -127,17 +127,19 @@ const NavigationButton: React.FC<NavigationButtonProps> = ({
127
127
  }, [badgeType, badgeValue]);
128
128
 
129
129
  return (
130
- <TouchableOpacity
131
- accessibilityLabel={`NavigationButton/${accessibilityLabel}`}
132
- style={[styles.navigationButton, buttonStyle]}
133
- onPress={onPress}>
134
- <Icon
135
- source={icon}
136
- color={tintColor ?? theme.colors.text.default}
137
- size={20}
138
- />
130
+ <View style={{width: scaleSize(28)}}>
131
+ <TouchableOpacity
132
+ accessibilityLabel={`NavigationButton/${accessibilityLabel}`}
133
+ style={[styles.navigationButton, buttonStyle]}
134
+ onPress={onPress}>
135
+ <Icon
136
+ source={icon}
137
+ color={tintColor ?? theme.colors.text.default}
138
+ size={20}
139
+ />
140
+ </TouchableOpacity>
139
141
  {renderBadge()}
140
- </TouchableOpacity>
142
+ </View>
141
143
  );
142
144
  };
143
145
 
@@ -347,10 +349,14 @@ const HeaderRightAction: React.FC<any> = ({children, ...restProps}) => {
347
349
  return <View style={styles.headerRightButton}>{renderAction()}</View>;
348
350
  };
349
351
 
350
- const HeaderToolkitAction: React.FC<any> = ({tintColor}) => {
352
+ const HeaderToolkitAction: React.FC<any> = ({
353
+ tintColor,
354
+ pinnedTool,
355
+ preventBack,
356
+ }) => {
351
357
  const {theme, navigator} = useContext(ApplicationContext);
352
- const [toolConfig, setToolConfig] = useState<HeaderToolkitProps>();
353
- const {appCode, hidden, type, onAction} = toolConfig ?? {};
358
+ const [toolConfig, setToolConfig] = useState<any>();
359
+ const {appCode, onAction} = toolConfig ?? {};
354
360
 
355
361
  let backgroundColor;
356
362
  if (tintColor != Colors.black_01) {
@@ -361,20 +367,21 @@ const HeaderToolkitAction: React.FC<any> = ({tintColor}) => {
361
367
  if (navigator?.toolkitConfig) {
362
368
  setToolConfig(navigator?.toolkitConfig);
363
369
  } else {
364
- navigator?.requestApi('getToolkit', [undefined], (result: boolean) => {
365
- if (result) {
366
- navigator?.requestApi(
367
- 'getToolkitConfig',
368
- [undefined],
369
- (config: any) => {
370
- navigator.toolkitConfig = {
371
- ...config?.utilityToolConfig,
372
- appCode: config?.appCode,
373
- };
374
- setToolConfig(navigator?.toolkitConfig);
375
- },
376
- );
377
- }
370
+ navigator?.requestApi('getToolkitConfig', [undefined], (config: any) => {
371
+ navigator.toolkitConfig = {
372
+ configs: [
373
+ ...config?.miniappTools?.customTools,
374
+ ...config?.defaultTools,
375
+ ],
376
+ appCode: config?.appCode,
377
+ };
378
+ setToolConfig({
379
+ configs: [
380
+ ...config?.miniappTools?.customTools,
381
+ ...config?.defaultTools,
382
+ ],
383
+ appCode: config?.appCode,
384
+ });
378
385
  });
379
386
  }
380
387
  }, []);
@@ -417,39 +424,64 @@ const HeaderToolkitAction: React.FC<any> = ({tintColor}) => {
417
424
  };
418
425
  }, [appCode]);
419
426
 
420
- const onUtilityTool = () => {
421
- onAction?.('onUtilityTool');
422
- navigator?.requestApi(type, undefined, undefined);
423
- };
424
-
425
427
  const onMore = () => {
426
428
  onAction?.('onMore');
427
- navigator?.requestApi('showToolkit', [toolConfig], undefined);
429
+ navigator?.requestApi(
430
+ 'showTools',
431
+ [toolConfig],
432
+ (res: {item: {action?: string; key: string}}) => {
433
+ const {item} = res;
434
+ navigator?.toolkitCallback?.(item);
435
+ },
436
+ );
428
437
  };
429
438
 
430
439
  const onClose = () => {
431
- onAction?.('onClose');
432
- navigator?.requestApi('dismiss', undefined, undefined);
440
+ if (preventBack) {
441
+ navigator?.showModal({
442
+ screen: () => (
443
+ <PopupNotify
444
+ {...preventBack}
445
+ primary={{
446
+ title: preventBack.primary.title,
447
+ onPress: () => {
448
+ preventBack?.primary.onPress();
449
+ navigator?.requestApi('dismiss', undefined, undefined);
450
+ },
451
+ }}
452
+ />
453
+ ),
454
+ });
455
+ } else {
456
+ navigator?.requestApi('dismiss', undefined, undefined);
457
+ }
433
458
  };
434
459
 
435
- const renderUtilityTool = () => {
436
- if (hidden === false) {
460
+ const renderPinnedTool = () => {
461
+ const pinTool = toolConfig?.configs?.find(
462
+ (i: any) => i.key === pinnedTool?.key,
463
+ );
464
+ const {badgeValue, badgeType} = pinnedTool ?? {};
465
+
466
+ if (pinTool)
437
467
  return (
438
468
  <NavigationButton
439
469
  accessibilityLabel={'UtilityTool'}
440
- icon={type as string}
470
+ icon={pinTool.icon as string}
441
471
  tintColor={tintColor}
442
- onPress={onUtilityTool}
472
+ badgeValue={badgeValue}
473
+ badgeType={badgeType}
474
+ onPress={() => {
475
+ navigator?.toolkitCallback?.(pinnedTool?.key);
476
+ }}
443
477
  />
444
478
  );
445
- }
446
- return null;
447
479
  };
448
480
 
449
481
  if (toolConfig) {
450
482
  return (
451
483
  <View style={styles.headerRightButton}>
452
- {renderUtilityTool()}
484
+ {renderPinnedTool()}
453
485
  <View
454
486
  style={[
455
487
  styles.toolkitContainer,
@@ -13,6 +13,7 @@ class Navigator {
13
13
  maxApi?: any;
14
14
  trackingInfo?: TrackingInfo;
15
15
  dismissData?: any;
16
+ toolkitCallback?: (item: any) => void;
16
17
 
17
18
  constructor(navigation: any) {
18
19
  this.ref = navigation;
@@ -121,6 +122,12 @@ class Navigator {
121
122
  this.maxApi[func]?.(...args, callback);
122
123
  }
123
124
  };
125
+
126
+ setToolkitCallback = (
127
+ callback: (item: {key: string; action: string}) => void,
128
+ ) => {
129
+ this.toolkitCallback = callback;
130
+ };
124
131
  }
125
132
 
126
133
  export default Navigator;
@@ -128,8 +128,14 @@ export type NavigationButtonProps = {
128
128
  useBorder?: boolean;
129
129
  onPress: () => void;
130
130
  accessibilityLabel?: string;
131
- badgeType?: 'dot' | 'number' | 'string';
132
- badgeValue?: number | string;
131
+ badgeType?: 'dot' | 'number';
132
+ badgeValue?: number;
133
+ };
134
+
135
+ export type PinnedToolType = {
136
+ key: string;
137
+ badgeValue?: number;
138
+ badgeType?: 'number' | 'dot';
133
139
  };
134
140
 
135
141
  export interface NavigationOptions extends StackNavigationOptions {
@@ -138,6 +144,7 @@ export interface NavigationOptions extends StackNavigationOptions {
138
144
  surface?: boolean;
139
145
  hiddenBack?: boolean;
140
146
  customTitle?: TitleCustomProps;
147
+ pinnedTool?: PinnedToolType;
141
148
  }
142
149
 
143
150
  export interface HeaderBackProps extends NavigationButtonProps {
@@ -166,9 +173,7 @@ export type TitleCustomProps = {
166
173
  export type HeaderToolkitProps = {
167
174
  [key: string]: any;
168
175
  appCode: string;
169
- hidden: boolean;
170
- type: string;
171
- onAction?: (action: string) => void;
176
+ configs: any[];
172
177
  };
173
178
 
174
179
  export type HeaderAnimatedProps = {
@@ -188,6 +193,7 @@ export type BottomTabItemProps = {
188
193
  };
189
194
 
190
195
  export type BottomTabProps = {
196
+ nested?: boolean;
191
197
  tabs: BottomTabItemProps[];
192
198
  initialRouteName?: string;
193
199
  navigation: Navigation;
@@ -126,6 +126,21 @@ const getOptions = (params: NavigationOptions, theme: Theme) => {
126
126
  };
127
127
  }
128
128
 
129
+ if (params.pinnedTool) {
130
+ options = {
131
+ ...options,
132
+ headerRight: (props: any) => {
133
+ return (
134
+ <HeaderToolkitAction
135
+ preventBack={params.preventBack}
136
+ pinnedTool={params.pinnedTool}
137
+ {...props}
138
+ />
139
+ );
140
+ },
141
+ };
142
+ }
143
+
129
144
  return {
130
145
  ...params,
131
146
  ...options,
package/Badge/styles.ts CHANGED
@@ -4,13 +4,16 @@ import {scaleSize} from '../Text';
4
4
 
5
5
  export default StyleSheet.create({
6
6
  badge: {
7
+ paddingHorizontal: Spacing.XS,
7
8
  borderRadius: Radius.M,
8
9
  justifyContent: 'center',
10
+ alignItems: 'center',
9
11
  height: scaleSize(16),
12
+ minWidth: scaleSize(16),
10
13
  flexDirection: 'row',
14
+ borderWidth: 1,
11
15
  borderColor: Colors.black_01,
12
- paddingHorizontal: Spacing.XS,
13
- alignItems: 'center',
16
+ alignSelf: 'baseline',
14
17
  },
15
18
  dot: {
16
19
  width: 16,
package/Layout/Card.tsx CHANGED
@@ -29,7 +29,7 @@ const Card: React.FC<CardProps> = ({
29
29
  useShadow = false,
30
30
  ...props
31
31
  }) => {
32
- const {showGrid} = useContext(ApplicationContext);
32
+ const {showGrid, theme} = useContext(ApplicationContext);
33
33
  const {numberOfColumns} = useGridSystem();
34
34
 
35
35
  const gutterSize = 8;
@@ -47,6 +47,7 @@ const Card: React.FC<CardProps> = ({
47
47
  return span * sizePerSpan + (span - 1) * gutterSize;
48
48
  },
49
49
  };
50
+
50
51
  /**
51
52
  * render overlay only dev mode
52
53
  */
@@ -107,8 +108,9 @@ const Card: React.FC<CardProps> = ({
107
108
  if (Array.isArray(children)) {
108
109
  let cursor = 0;
109
110
  let rows: any[] = [];
110
- for (let i = 0; i < children.length; ++i) {
111
- const item = children[i];
111
+ const arrayChild = children.filter(item => !!item);
112
+ for (let i = 0; i < arrayChild.length; ++i) {
113
+ const item = arrayChild[i];
112
114
  const totalSpan = rows
113
115
  .concat([item])
114
116
  .map(i => i.props?.widthSpan)
@@ -124,7 +126,7 @@ const Card: React.FC<CardProps> = ({
124
126
  rows = [item];
125
127
  }
126
128
 
127
- if (i == children.length - 1) {
129
+ if (i == arrayChild.length - 1) {
128
130
  cursor += 1;
129
131
  element.push(addRowView(rows, cursor, true));
130
132
  }
@@ -138,23 +140,21 @@ const Card: React.FC<CardProps> = ({
138
140
  return element;
139
141
  };
140
142
 
141
- const {theme} = useContext(ApplicationContext);
142
143
  return (
143
144
  <GridContext.Provider value={gridContext}>
144
145
  <View
145
146
  {...props}
146
147
  accessibilityLabel={`Card`}
147
148
  style={[
149
+ {backgroundColor: theme.colors.background.surface},
148
150
  style,
149
151
  styles.protectedStyle,
150
152
  styles.card,
151
153
  {
152
154
  width: widthSection,
153
155
  marginHorizontal: margin,
154
- backgroundColor: backgroundImage
155
- ? undefined
156
- : theme.colors.background.surface,
157
156
  },
157
+ !!backgroundImage && {backgroundColor: undefined},
158
158
  useShadow && Shadow.Light,
159
159
  ]}>
160
160
  {!!backgroundImage && (
@@ -1,4 +1,4 @@
1
- import React, {FC, useContext} from 'react';
1
+ import React, {forwardRef, useContext} from 'react';
2
2
  import {FlatList, FlatListProps, View} from 'react-native';
3
3
  import Item, {SpanNumber} from './Item';
4
4
  import {GridContext} from './index';
@@ -11,39 +11,45 @@ export interface ItemListProps extends FlatListProps<any> {
11
11
  widthSpan?: SpanNumber;
12
12
  }
13
13
 
14
- const ItemList: FC<ItemListProps> = ({
15
- renderItem,
16
- widthSpan,
17
- style,
18
- contentContainerStyle,
19
- ...props
20
- }) => {
21
- const {gutterSize, numberOfColumns} = useContext(GridContext);
22
- const widthItem = (widthSpan ?? numberOfColumns) as SpanNumber;
23
- const numColumns = Math.floor(numberOfColumns / widthItem);
24
- const indexBegin = props?.data?.map((_i, index) => index * numColumns);
25
- const _renderItem = (item: any) => {
26
- if (indexBegin?.includes(item?.index)) {
27
- return <Item widthSpan={widthItem}>{renderItem?.(item)}</Item>;
28
- }
14
+ const ItemList = forwardRef(
15
+ (
16
+ {
17
+ renderItem,
18
+ widthSpan,
19
+ style,
20
+ contentContainerStyle,
21
+ ...props
22
+ }: ItemListProps,
23
+ ref,
24
+ ) => {
25
+ const {gutterSize, numberOfColumns} = useContext(GridContext);
26
+ const widthItem = (widthSpan ?? numberOfColumns) as SpanNumber;
27
+ const numColumns = Math.floor(numberOfColumns / widthItem);
28
+ const indexBegin = props?.data?.map((_i, index) => index * numColumns);
29
+ const _renderItem = (item: any) => {
30
+ if (indexBegin?.includes(item?.index)) {
31
+ return <Item widthSpan={widthItem}>{renderItem?.(item)}</Item>;
32
+ }
33
+ return (
34
+ <View style={{paddingLeft: gutterSize}}>
35
+ <Item widthSpan={widthItem}>{renderItem?.(item)}</Item>
36
+ </View>
37
+ );
38
+ };
39
+
29
40
  return (
30
- <View style={{paddingLeft: gutterSize}}>
31
- <Item widthSpan={widthItem}>{renderItem?.(item)}</Item>
32
- </View>
41
+ <FlatList
42
+ ref={ref as React.RefObject<FlatList>}
43
+ {...props}
44
+ numColumns={numColumns}
45
+ renderItem={_renderItem}
46
+ horizontal={false}
47
+ ItemSeparatorComponent={() => <View style={{height: gutterSize}} />}
48
+ style={[style, styles.protectedStyle]}
49
+ contentContainerStyle={[contentContainerStyle, styles.protectedStyle]}
50
+ />
33
51
  );
34
- };
35
-
36
- return (
37
- <FlatList
38
- {...props}
39
- numColumns={numColumns}
40
- renderItem={_renderItem}
41
- horizontal={false}
42
- ItemSeparatorComponent={() => <View style={{height: gutterSize}} />}
43
- style={[style, styles.protectedStyle]}
44
- contentContainerStyle={[contentContainerStyle, styles.protectedStyle]}
45
- />
46
- );
47
- };
52
+ },
53
+ );
48
54
 
49
55
  export default ItemList;
@@ -107,8 +107,9 @@ const Section: React.FC<SectionProps> = ({
107
107
  if (Array.isArray(children)) {
108
108
  let cursor = 0;
109
109
  let rows: any[] = [];
110
- for (let i = 0; i < children.length; ++i) {
111
- const item = children[i];
110
+ const arrayChild = children.filter(item => !!item);
111
+ for (let i = 0; i < arrayChild.length; ++i) {
112
+ const item = arrayChild[i];
112
113
  const totalSpan = rows
113
114
  .concat([item])
114
115
  .map(i => i.props?.widthSpan)
@@ -124,7 +125,7 @@ const Section: React.FC<SectionProps> = ({
124
125
  rows = [item];
125
126
  }
126
127
 
127
- if (i == children.length - 1) {
128
+ if (i == arrayChild.length - 1) {
128
129
  cursor += 1;
129
130
  element.push(addRowView(rows, cursor, true));
130
131
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@momo-kits/foundation",
3
- "version": "0.81.42",
3
+ "version": "0.81.43-api.2",
4
4
  "description": "React Native Component Kits",
5
5
  "main": "index.ts",
6
6
  "scripts": {
package/verify.js CHANGED
@@ -27,8 +27,9 @@ try {
27
27
  }
28
28
 
29
29
  if (
30
- miniInfo?.name !== '@momo-platform/momo-core' &&
31
- miniInfo?.resolutions?.['@momo-platform/momo-core'] !== packageInfo?.version
30
+ miniInfo?.dependencies?.['@momo-platform/momo-core'] &&
31
+ miniInfo?.dependencies?.['@momo-platform/momo-core'] !==
32
+ packageInfo?.version
32
33
  ) {
33
34
  console.error(
34
35
  `Package ${packageInfo.name} version: ${packageInfo.version} require install resolutions @momo-platform/momo-core ${packageInfo.version}`,