@momo-kits/foundation 0.81.1-optimize.18 → 0.81.1-optimize.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Application/BottomSheet.tsx +20 -3
- package/Application/StackScreen.tsx +3 -2
- package/Application/types.ts +1 -0
- package/Input/InputMoney.tsx +9 -0
- package/Input/index.tsx +12 -18
- package/Layout/Screen.tsx +11 -10
- package/Title/index.tsx +7 -2
- package/package.json +1 -1
|
@@ -28,6 +28,7 @@ const BottomSheet: React.FC<BottomSheetParams> = props => {
|
|
|
28
28
|
barrierDismissible = false,
|
|
29
29
|
draggable = true,
|
|
30
30
|
useBottomInset = true,
|
|
31
|
+
keyboardVerticalOffset,
|
|
31
32
|
}: BottomSheetParams = props.route.params;
|
|
32
33
|
const pan = useRef(
|
|
33
34
|
new Animated.ValueXY({
|
|
@@ -83,7 +84,7 @@ const BottomSheet: React.FC<BottomSheetParams> = props => {
|
|
|
83
84
|
/**
|
|
84
85
|
* handler dismiss
|
|
85
86
|
*/
|
|
86
|
-
const onDismiss = (force = false) => {
|
|
87
|
+
const onDismiss = (force = false, callback?: () => void) => {
|
|
87
88
|
if (barrierDismissible && !force) {
|
|
88
89
|
return;
|
|
89
90
|
}
|
|
@@ -93,9 +94,20 @@ const BottomSheet: React.FC<BottomSheetParams> = props => {
|
|
|
93
94
|
duration: 100,
|
|
94
95
|
}).start(() => {
|
|
95
96
|
navigator?.pop();
|
|
97
|
+
callback?.();
|
|
96
98
|
});
|
|
97
99
|
};
|
|
98
100
|
|
|
101
|
+
/**
|
|
102
|
+
* manual close
|
|
103
|
+
*/
|
|
104
|
+
const requestClose = useCallback((callback?: () => void) => {
|
|
105
|
+
onDismiss(true, callback);
|
|
106
|
+
}, []);
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* render header
|
|
110
|
+
*/
|
|
99
111
|
const renderHeader = useCallback(() => {
|
|
100
112
|
return (
|
|
101
113
|
<View
|
|
@@ -137,7 +149,7 @@ const BottomSheet: React.FC<BottomSheetParams> = props => {
|
|
|
137
149
|
<Modal transparent visible={true} onRequestClose={() => onDismiss()}>
|
|
138
150
|
<KeyboardAvoidingView
|
|
139
151
|
behavior={Platform.OS === 'ios' ? 'padding' : 'height'}
|
|
140
|
-
keyboardVerticalOffset={-20}
|
|
152
|
+
keyboardVerticalOffset={keyboardVerticalOffset ?? -20}
|
|
141
153
|
style={[Styles.flex, {justifyContent: 'flex-end'}]}>
|
|
142
154
|
<TouchableOpacity
|
|
143
155
|
style={Styles.flex}
|
|
@@ -147,7 +159,11 @@ const BottomSheet: React.FC<BottomSheetParams> = props => {
|
|
|
147
159
|
<Animated.View style={{transform: pan.getTranslateTransform()}}>
|
|
148
160
|
{renderHeader()}
|
|
149
161
|
<View style={{backgroundColor: backgroundColor}}>
|
|
150
|
-
<Screen
|
|
162
|
+
<Screen
|
|
163
|
+
{...props}
|
|
164
|
+
{...props.route.params}
|
|
165
|
+
requestClose={requestClose}
|
|
166
|
+
/>
|
|
151
167
|
{useBottomInset && (
|
|
152
168
|
<View style={{height: Math.min(insets.bottom, 21)}} />
|
|
153
169
|
)}
|
|
@@ -157,6 +173,7 @@ const BottomSheet: React.FC<BottomSheetParams> = props => {
|
|
|
157
173
|
</Modal>
|
|
158
174
|
);
|
|
159
175
|
};
|
|
176
|
+
|
|
160
177
|
export default BottomSheet;
|
|
161
178
|
|
|
162
179
|
const styles = StyleSheet.create({
|
|
@@ -50,10 +50,11 @@ const StackScreen: React.FC<ScreenParams> = props => {
|
|
|
50
50
|
* tracking for screen
|
|
51
51
|
*/
|
|
52
52
|
useEffect(() => {
|
|
53
|
-
|
|
53
|
+
if (__DEV__ && (!screenName || screenName == 'Invalid')) {
|
|
54
|
+
Alert.alert('Design system', `Unvalidated screen name "${screenName}" !`);
|
|
55
|
+
}
|
|
54
56
|
|
|
55
57
|
navigator?.maxApi?.of?.({screenName});
|
|
56
|
-
|
|
57
58
|
tracked.current.timeoutLoad = setTimeout(() => {
|
|
58
59
|
onScreenLoad();
|
|
59
60
|
}, 5000);
|
package/Application/types.ts
CHANGED
package/Input/InputMoney.tsx
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import React, {
|
|
2
2
|
forwardRef,
|
|
3
3
|
useContext,
|
|
4
|
+
useEffect,
|
|
4
5
|
useImperativeHandle,
|
|
5
6
|
useRef,
|
|
6
7
|
useState,
|
|
@@ -40,6 +41,7 @@ const InputMoney = forwardRef(
|
|
|
40
41
|
defaultValue = '',
|
|
41
42
|
accessibilityLabel,
|
|
42
43
|
hintText,
|
|
44
|
+
value: _value,
|
|
43
45
|
...props
|
|
44
46
|
}: InputMoneyProps,
|
|
45
47
|
ref,
|
|
@@ -48,6 +50,13 @@ const InputMoney = forwardRef(
|
|
|
48
50
|
const [focused, setFocused] = useState(false);
|
|
49
51
|
const inputRef = useRef<TextInput>(null);
|
|
50
52
|
|
|
53
|
+
useEffect(() => {
|
|
54
|
+
if (_value) {
|
|
55
|
+
setValue(validateText(_value));
|
|
56
|
+
onChangeText?.(formatMoneyToNumber(_value, 'đ').toString());
|
|
57
|
+
}
|
|
58
|
+
}, [_value]);
|
|
59
|
+
|
|
51
60
|
const validateText = (text: string) => {
|
|
52
61
|
const valueFormat = formatMoneyToNumber(text, 'đ');
|
|
53
62
|
return formatNumberToMoney(valueFormat, 'đ');
|
package/Input/index.tsx
CHANGED
|
@@ -6,13 +6,6 @@ import InputOTP from './InputOTP';
|
|
|
6
6
|
import InputSearch from './InputSearch';
|
|
7
7
|
import InputTextArea from './InputTextArea';
|
|
8
8
|
|
|
9
|
-
export interface InputRef {
|
|
10
|
-
focus: () => void;
|
|
11
|
-
blur: () => void;
|
|
12
|
-
clear: () => void;
|
|
13
|
-
setText: (text: string) => void;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
9
|
export interface InputProps extends TextInputProps {
|
|
17
10
|
/**
|
|
18
11
|
* Optional. Defines the size of the Input component.
|
|
@@ -105,14 +98,8 @@ export interface InputProps extends TextInputProps {
|
|
|
105
98
|
hintText?: string;
|
|
106
99
|
}
|
|
107
100
|
|
|
108
|
-
|
|
109
|
-
InputProps,
|
|
110
|
-
'size' | 'icon' | 'iconColor'
|
|
111
|
-
>;
|
|
112
|
-
|
|
113
|
-
type InputPropsWithoutPlaceholder = Omit<InputProps, 'placeholder'>;
|
|
114
|
-
|
|
115
|
-
export interface InputTextAreaProps extends InputPropsWithoutSizeAndIcon {
|
|
101
|
+
export interface InputTextAreaProps
|
|
102
|
+
extends Omit<InputProps, 'size' | 'icon' | 'iconColor'> {
|
|
116
103
|
/**
|
|
117
104
|
* Optional. Defines the height of the InputTextArea component.
|
|
118
105
|
* It can be used to set a specific height for the text area.
|
|
@@ -132,6 +119,9 @@ export interface InputSearchProps extends TextInputProps {
|
|
|
132
119
|
*/
|
|
133
120
|
showButtonText?: boolean;
|
|
134
121
|
|
|
122
|
+
/**
|
|
123
|
+
* Optional. Represents the value for the floating title in the InputSearch component.
|
|
124
|
+
*/
|
|
135
125
|
onPressButtonText?: () => void;
|
|
136
126
|
|
|
137
127
|
/**
|
|
@@ -145,18 +135,22 @@ export interface InputSearchProps extends TextInputProps {
|
|
|
145
135
|
icon?: string;
|
|
146
136
|
|
|
147
137
|
/**
|
|
148
|
-
*
|
|
138
|
+
* Optional. If `true`, the user won't be able to interact with the Input component.
|
|
149
139
|
*/
|
|
150
140
|
hasColorBG?: boolean;
|
|
151
141
|
|
|
142
|
+
/**
|
|
143
|
+
* Optional. Represents the style of the InputSearch component.
|
|
144
|
+
*/
|
|
152
145
|
params?: any;
|
|
153
146
|
}
|
|
154
147
|
|
|
155
|
-
export interface InputMoneyProps extends
|
|
148
|
+
export interface InputMoneyProps extends Omit<InputProps, 'placeholder'> {}
|
|
156
149
|
|
|
157
150
|
export type OTPInputLength = 2 | 4 | 6 | 8 | 10;
|
|
158
151
|
|
|
159
|
-
export interface InputOTPProps
|
|
152
|
+
export interface InputOTPProps
|
|
153
|
+
extends Omit<InputProps, 'size' | 'icon' | 'iconColor'> {
|
|
160
154
|
/**
|
|
161
155
|
* Optional. Defines the length of the OTP (One Time Password) input.
|
|
162
156
|
* Can be 2, 4, 6, 8, or 10.
|
package/Layout/Screen.tsx
CHANGED
|
@@ -33,6 +33,9 @@ import styles from './styles';
|
|
|
33
33
|
import {HeaderType} from './types';
|
|
34
34
|
|
|
35
35
|
export interface ScreenProps extends ViewProps {
|
|
36
|
+
/**
|
|
37
|
+
* ReactNode representing the content of the screen.
|
|
38
|
+
*/
|
|
36
39
|
children: React.ReactNode;
|
|
37
40
|
/**
|
|
38
41
|
* Optional. Navigation object for handling navigation actions.
|
|
@@ -90,9 +93,10 @@ export interface ScreenProps extends ViewProps {
|
|
|
90
93
|
floatingButtonProps?: Omit<FloatingButtonProps, 'animatedValue' | 'bottom'>;
|
|
91
94
|
|
|
92
95
|
/**
|
|
93
|
-
*
|
|
96
|
+
* Optional. Keyboard vertical offset.
|
|
94
97
|
*/
|
|
95
|
-
|
|
98
|
+
keyboardVerticalOffset?: number;
|
|
99
|
+
|
|
96
100
|
/**
|
|
97
101
|
* Optional. If `true`, the screen content is using grid layout by span.
|
|
98
102
|
*/
|
|
@@ -115,13 +119,11 @@ const Screen = forwardRef(
|
|
|
115
119
|
headerType = 'default',
|
|
116
120
|
floatingButtonProps,
|
|
117
121
|
useGridLayout = true,
|
|
118
|
-
|
|
122
|
+
keyboardVerticalOffset,
|
|
119
123
|
}: ScreenProps,
|
|
120
124
|
ref,
|
|
121
125
|
) => {
|
|
122
|
-
const animatedValue = useRef<Animated.Value>(
|
|
123
|
-
animated ?? new Animated.Value(0),
|
|
124
|
-
);
|
|
126
|
+
const animatedValue = useRef<Animated.Value>(new Animated.Value(0));
|
|
125
127
|
const {theme} = useContext(ApplicationContext);
|
|
126
128
|
const insets = useSafeAreaInsets();
|
|
127
129
|
const heightHeader = useHeaderHeight();
|
|
@@ -132,10 +134,9 @@ const Screen = forwardRef(
|
|
|
132
134
|
let handleScroll;
|
|
133
135
|
let headerBackground: string | undefined = undefined;
|
|
134
136
|
let Component: any = View;
|
|
135
|
-
let
|
|
136
|
-
|
|
137
|
+
let keyboardOffset = heightHeader - 20;
|
|
137
138
|
if (headerType == 'extended' || animatedHeader) {
|
|
138
|
-
|
|
139
|
+
keyboardOffset = -20;
|
|
139
140
|
}
|
|
140
141
|
|
|
141
142
|
if (headerType == 'extended') {
|
|
@@ -339,7 +340,7 @@ const Screen = forwardRef(
|
|
|
339
340
|
<KeyboardAvoidingView
|
|
340
341
|
style={Styles.flex}
|
|
341
342
|
enabled={enableKeyboardAvoidingView}
|
|
342
|
-
keyboardVerticalOffset={keyboardVerticalOffset}
|
|
343
|
+
keyboardVerticalOffset={keyboardVerticalOffset ?? keyboardOffset}
|
|
343
344
|
behavior={Platform.select({
|
|
344
345
|
ios: 'padding',
|
|
345
346
|
android: undefined,
|
package/Title/index.tsx
CHANGED
|
@@ -143,8 +143,14 @@ const Title: FC<TitleProps> = ({
|
|
|
143
143
|
const renderActionRight = () => {
|
|
144
144
|
if (!showRightAction || showTrailingAction) return false;
|
|
145
145
|
|
|
146
|
+
const lineHeight = styleSheet[typography].lineHeight;
|
|
147
|
+
|
|
146
148
|
return (
|
|
147
|
-
<View
|
|
149
|
+
<View
|
|
150
|
+
style={{
|
|
151
|
+
height: lineHeight,
|
|
152
|
+
justifyContent: 'center',
|
|
153
|
+
}}>
|
|
148
154
|
{!buttonTitle ? (
|
|
149
155
|
<TouchableOpacity
|
|
150
156
|
onPress={onPressRightAction}
|
|
@@ -174,7 +180,6 @@ const Title: FC<TitleProps> = ({
|
|
|
174
180
|
if (textOnly) {
|
|
175
181
|
return (
|
|
176
182
|
<View style={isSection && styles.margin}>
|
|
177
|
-
zZ
|
|
178
183
|
<RNText
|
|
179
184
|
numberOfLines={numberOfLines}
|
|
180
185
|
style={[styleSheet[typography], styles.title]}>
|