Skip to content

Commit e82eba4

Browse files
committed
feat: update login form to use the new keyboard component + more components for modal
1 parent 242663b commit e82eba4

File tree

2 files changed

+79
-30
lines changed

2 files changed

+79
-30
lines changed

src/components/login-form.tsx

Lines changed: 37 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { zodResolver } from '@hookform/resolvers/zod';
22
import React from 'react';
33
import type { SubmitHandler } from 'react-hook-form';
44
import { useForm } from 'react-hook-form';
5+
import { KeyboardAvoidingView } from 'react-native-keyboard-controller';
56
import * as z from 'zod';
67

78
import { Button, ControlledInput, Text, View } from '@/ui';
@@ -31,37 +32,43 @@ export const LoginForm = ({ onSubmit = () => {} }: LoginFormProps) => {
3132
resolver: zodResolver(schema),
3233
});
3334
return (
34-
<View className="flex-1 justify-center p-4">
35-
<Text testID="form-title" className="pb-6 text-center text-2xl">
36-
Sign In
37-
</Text>
35+
<KeyboardAvoidingView
36+
style={{ flex: 1 }}
37+
behavior="padding"
38+
keyboardVerticalOffset={10}
39+
>
40+
<View className="flex-1 justify-center p-4">
41+
<Text testID="form-title" className="pb-6 text-center text-2xl">
42+
Sign In
43+
</Text>
3844

39-
<ControlledInput
40-
testID="name"
41-
control={control}
42-
name="name"
43-
label="Name"
44-
/>
45+
<ControlledInput
46+
testID="name"
47+
control={control}
48+
name="name"
49+
label="Name"
50+
/>
4551

46-
<ControlledInput
47-
testID="email-input"
48-
control={control}
49-
name="email"
50-
label="Email"
51-
/>
52-
<ControlledInput
53-
testID="password-input"
54-
control={control}
55-
name="password"
56-
label="Password"
57-
placeholder="***"
58-
secureTextEntry={true}
59-
/>
60-
<Button
61-
testID="login-button"
62-
label="Login"
63-
onPress={handleSubmit(onSubmit)}
64-
/>
65-
</View>
52+
<ControlledInput
53+
testID="email-input"
54+
control={control}
55+
name="email"
56+
label="Email"
57+
/>
58+
<ControlledInput
59+
testID="password-input"
60+
control={control}
61+
name="password"
62+
label="Password"
63+
placeholder="***"
64+
secureTextEntry={true}
65+
/>
66+
<Button
67+
testID="login-button"
68+
label="Login"
69+
onPress={handleSubmit(onSubmit)}
70+
/>
71+
</View>
72+
</KeyboardAvoidingView>
6673
);
6774
};
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
// source https://kirillzyusko.github.io/react-native-keyboard-controller/docs/api/components/keyboard-aware-scroll-view
2+
/**
3+
* This component is used to handle the keyboard in a modal.
4+
* It is a wrapper around the `KeyboardAwareScrollView` component from `react-native-keyboard-controller`.
5+
* It is used to handle the keyboard in a modal.
6+
* example usage:
7+
export function Example() {
8+
return (
9+
<Modal>
10+
<BottomSheetKeyboardAwareScrollView>
11+
</BottomSheetKeyboardAwareScrollView>
12+
</Modal>
13+
);
14+
}
15+
*/
16+
import {
17+
type BottomSheetScrollViewMethods,
18+
createBottomSheetScrollableComponent,
19+
SCROLLABLE_TYPE,
20+
} from '@gorhom/bottom-sheet';
21+
import type { BottomSheetScrollViewProps } from '@gorhom/bottom-sheet/src/components/bottomSheetScrollable/types';
22+
import { memo } from 'react';
23+
import type { KeyboardAwareScrollViewProps } from 'react-native-keyboard-controller';
24+
import { KeyboardAwareScrollView } from 'react-native-keyboard-controller';
25+
import Reanimated from 'react-native-reanimated';
26+
27+
const AnimatedScrollView =
28+
Reanimated.createAnimatedComponent<KeyboardAwareScrollViewProps>(
29+
KeyboardAwareScrollView
30+
);
31+
const BottomSheetScrollViewComponent = createBottomSheetScrollableComponent<
32+
BottomSheetScrollViewMethods,
33+
BottomSheetScrollViewProps
34+
>(SCROLLABLE_TYPE.SCROLLVIEW, AnimatedScrollView);
35+
const BottomSheetKeyboardAwareScrollView = memo(BottomSheetScrollViewComponent);
36+
37+
BottomSheetKeyboardAwareScrollView.displayName =
38+
'BottomSheetKeyboardAwareScrollView';
39+
40+
export default BottomSheetKeyboardAwareScrollView as (
41+
props: BottomSheetScrollViewProps & KeyboardAwareScrollViewProps
42+
) => ReturnType<typeof BottomSheetKeyboardAwareScrollView>;

0 commit comments

Comments
 (0)