Skip to content

Commit 6589c3e

Browse files
authored
Merge pull request #72 from RonasIT/PRD-2490-fix-bottom-sheet-keyboard-input
fix: fix bottom sheet keyboard input
2 parents 54d6ab3 + f7307e0 commit 6589c3e

2 files changed

Lines changed: 75 additions & 38 deletions

File tree

libs/mobile/shared/ui/ui-kit/src/action-buttons-modal/component.tsx

Lines changed: 31 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,11 @@ import { BottomSheetModal } from '@gorhom/bottom-sheet';
22
import { useTranslation } from '@ronas-it/react-native-common-modules/i18n';
33
import { delay } from 'lodash-es';
44
import { ForwardedRef, ReactElement, useImperativeHandle, useRef, useState } from 'react';
5-
import { TextInput } from 'react-native';
6-
import { AppKeyboardAvoidingView } from '@open-webui-react-native/mobile/shared/ui/keyboard-avoiding-view';
75
import { ToastService } from '@open-webui-react-native/shared/utils/toast-service';
86
import { AppBottomSheet } from '../bottom-sheet';
97
import { AppButton } from '../button';
108
import { AppText } from '../text';
11-
import { AppTextInput } from '../text-input';
9+
import { AppBottomSheetTextInput, AppBottomSheetTextInputRef } from '../text-input';
1210
import { View } from '../view';
1311

1412
export type ActionButtonsModalMethods = {
@@ -39,7 +37,7 @@ export function ActionButtonsModal({
3937
}: ActionButtonsModalProps): ReactElement {
4038
const translate = useTranslation('SHARED.ACTION_BUTTONS_MODAL');
4139
const modalRef = useRef<BottomSheetModal>(null);
42-
const inputRef = useRef<TextInput>(null);
40+
const inputRef = useRef<AppBottomSheetTextInputRef>(null);
4341

4442
const [value, setValue] = useState('');
4543

@@ -74,40 +72,36 @@ export function ActionButtonsModal({
7472
onOpen={() => inputRef.current?.focus()}
7573
withoutKeyboardExtraPadding
7674
content={
77-
<AppKeyboardAvoidingView
78-
scrollEnabled={isScrollable}
79-
contentContainerStyleKeyboardShown={{ paddingBottom: 16 }}>
80-
<View className='gap-12 pt-20 pb-safe android:pb-24'>
81-
<AppText className='text-h3-sm sm:text-h3 font-medium mb-4' numberOfLines={1}>
82-
{title}
83-
</AppText>
84-
{description &&
85-
(typeof description === 'string' ? (
86-
<AppText className='text-text-secondary'>{description}</AppText>
87-
) : (
88-
description
89-
))}
90-
{withInput && <AppTextInput
91-
ref={inputRef}
92-
value={value}
93-
onChangeText={setValue} />}
94-
<View className='flex-row gap-8'>
95-
<AppButton
96-
variant='outline'
97-
text={translate('BUTTON_CANCEL')}
98-
onPress={closeModal}
99-
disabled={isConfirming}
100-
className='flex-1'
101-
/>
102-
<AppButton
103-
text={translate('BUTTON_CONFIRM')}
104-
onPress={handleConfirm}
105-
isLoading={isConfirming}
106-
className='flex-1'
107-
/>
108-
</View>
75+
<View className='gap-12 pt-20 pb-safe android:pb-24'>
76+
<AppText className='text-h3-sm sm:text-h3 font-medium mb-4' numberOfLines={1}>
77+
{title}
78+
</AppText>
79+
{description &&
80+
(typeof description === 'string' ? (
81+
<AppText className='text-text-secondary'>{description}</AppText>
82+
) : (
83+
description
84+
))}
85+
{withInput && <AppBottomSheetTextInput
86+
ref={inputRef}
87+
value={value}
88+
onChangeText={setValue} />}
89+
<View className='flex-row gap-8'>
90+
<AppButton
91+
variant='outline'
92+
text={translate('BUTTON_CANCEL')}
93+
onPress={closeModal}
94+
disabled={isConfirming}
95+
className='flex-1'
96+
/>
97+
<AppButton
98+
text={translate('BUTTON_CONFIRM')}
99+
onPress={handleConfirm}
100+
isLoading={isConfirming}
101+
className='flex-1'
102+
/>
109103
</View>
110-
</AppKeyboardAvoidingView>
104+
</View>
111105
}
112106
/>
113107
);

libs/mobile/shared/ui/ui-kit/src/text-input/component.tsx

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import { ReactElement, Ref } from 'react';
1+
import { BottomSheetTextInput } from '@gorhom/bottom-sheet';
2+
import { ComponentRef, ReactElement, Ref } from 'react';
23
import { Platform, TextInput, TextInputProps, View } from 'react-native';
34
import { cn, colors } from '@open-webui-react-native/mobile/shared/ui/styles';
45

@@ -53,3 +54,45 @@ export const AppTextInput = ({
5354
</View>
5455
);
5556
};
57+
58+
export type AppBottomSheetTextInputRef = ComponentRef<typeof BottomSheetTextInput>;
59+
60+
export type AppBottomSheetInputProps = Omit<AppInputProps, 'ref'> & {
61+
ref?: Ref<AppBottomSheetTextInputRef>;
62+
};
63+
64+
export const AppBottomSheetTextInput = ({
65+
onFocus,
66+
onBlur,
67+
label,
68+
accessoryLeft,
69+
accessoryBottom,
70+
accessoryTop,
71+
maxHeight = 0,
72+
className,
73+
textClassName,
74+
hitSlop,
75+
ref,
76+
...inputProps
77+
}: AppBottomSheetInputProps): ReactElement => {
78+
const isIos = Platform.OS === 'ios';
79+
80+
return (
81+
<View className={cn(baseClasses.containerClasses, className)}>
82+
{accessoryTop}
83+
<View className={`flex-row gap-12 items-center max-h-[${maxHeight}]`}>
84+
{accessoryLeft}
85+
<BottomSheetTextInput
86+
ref={ref}
87+
className={cn(baseClasses.textClasses, isIos && '!leading-[0]', textClassName)}
88+
placeholderTextColor={colors.textSecondary}
89+
onFocus={onFocus}
90+
onBlur={onBlur}
91+
hitSlop={typeof hitSlop === 'number' ? hitSlop : { top: 12, bottom: 12, ...hitSlop }}
92+
{...inputProps}
93+
/>
94+
</View>
95+
{accessoryBottom}
96+
</View>
97+
);
98+
};

0 commit comments

Comments
 (0)