From 4992d57fc46bccb8d928281b03a2b24150664a3f Mon Sep 17 00:00:00 2001 From: Justin Noel Date: Tue, 17 Nov 2020 06:57:58 -0600 Subject: [PATCH 1/4] feat: add useKeyboardRelease hook Allows user to easily dismiss the keyboard inside React Native views. https://justinnoel.dev/2020/11/17/react-native-dismiss-keyboard-custom-hook/ --- README.md | 10 ++++++++++ src/useKeyboardRelease.ts | 13 +++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 src/useKeyboardRelease.ts diff --git a/README.md b/README.md index 1b2ea981..03d7b817 100644 --- a/README.md +++ b/README.md @@ -173,6 +173,16 @@ console.log('layout: ', layout) ``` +### `useKeyboardRelease` + +```js +import { useKeyboardRelease } from '@react-native-community/hooks' + +const { onRelease, shouldSetResponse } = useKeyboardRelease() + + +``` + [version-badge]: https://img.shields.io/npm/v/@react-native-community/hooks.svg?style=flat-square [package]: https://www.npmjs.com/package/@react-native-community/hooks diff --git a/src/useKeyboardRelease.ts b/src/useKeyboardRelease.ts new file mode 100644 index 00000000..de266a70 --- /dev/null +++ b/src/useKeyboardRelease.ts @@ -0,0 +1,13 @@ +import { Keyboard } from 'react-native' + +export interface KeyboardReleaseReturns { + shouldSetResponse: () => boolean + onRelease: () => void +} + +export function useKeyboardRelease(): KeyboardReleaseReturns { + const shouldSetResponse = () => true + const onRelease = () => Keyboard.dismiss() + + return { onRelease, shouldSetResponse } +} From 3d7b84a8d422511e2965e607ad7db2703672cb85 Mon Sep 17 00:00:00 2001 From: Justin Noel Date: Tue, 17 Nov 2020 07:02:04 -0600 Subject: [PATCH 2/4] fix: add to index --- src/index.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/index.ts b/src/index.ts index dc4646ea..3e4ed519 100644 --- a/src/index.ts +++ b/src/index.ts @@ -9,6 +9,7 @@ import {useInteractionManager} from './useInteractionManager' import {useDeviceOrientation} from './useDeviceOrientation' import {useLayout} from './useLayout' import {useImageDimensions} from './useImageDimensions' +import {useKeyboardRelease} from './useKeyboardRelease' export { useDimensions, @@ -23,4 +24,5 @@ export { useDeviceOrientation, useLayout, useImageDimensions, + useKeyboardRelease, } From e160e2e4b3d9f6626641e62b5db9dd7cc6b5ac0c Mon Sep 17 00:00:00 2001 From: Justin Noel Date: Tue, 17 Nov 2020 07:06:10 -0600 Subject: [PATCH 3/4] chore: use prettier format changes --- README.md | 6 +++--- src/useKeyboardRelease.ts | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 03d7b817..b3ef87b6 100644 --- a/README.md +++ b/README.md @@ -176,11 +176,11 @@ console.log('layout: ', layout) ### `useKeyboardRelease` ```js -import { useKeyboardRelease } from '@react-native-community/hooks' +import {useKeyboardRelease} from '@react-native-community/hooks' -const { onRelease, shouldSetResponse } = useKeyboardRelease() +const {onRelease, shouldSetResponse} = useKeyboardRelease() - + ``` [version-badge]: https://img.shields.io/npm/v/@react-native-community/hooks.svg?style=flat-square diff --git a/src/useKeyboardRelease.ts b/src/useKeyboardRelease.ts index de266a70..201f2689 100644 --- a/src/useKeyboardRelease.ts +++ b/src/useKeyboardRelease.ts @@ -1,4 +1,4 @@ -import { Keyboard } from 'react-native' +import {Keyboard} from 'react-native' export interface KeyboardReleaseReturns { shouldSetResponse: () => boolean @@ -9,5 +9,5 @@ export function useKeyboardRelease(): KeyboardReleaseReturns { const shouldSetResponse = () => true const onRelease = () => Keyboard.dismiss() - return { onRelease, shouldSetResponse } + return {onRelease, shouldSetResponse} } From 73d563b13830e9ac367ffdf006211155c8e75e3f Mon Sep 17 00:00:00 2001 From: Justin Noel Date: Tue, 17 Nov 2020 07:25:19 -0600 Subject: [PATCH 4/4] fix: detect platform and do not use responder on web On the web, if `shouldSetResponse` is true, inputs will lose focus when tapped on. --- src/useKeyboardRelease.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/useKeyboardRelease.ts b/src/useKeyboardRelease.ts index 201f2689..6b59b67a 100644 --- a/src/useKeyboardRelease.ts +++ b/src/useKeyboardRelease.ts @@ -1,4 +1,4 @@ -import {Keyboard} from 'react-native' +import {Keyboard, Platform} from 'react-native' export interface KeyboardReleaseReturns { shouldSetResponse: () => boolean @@ -6,7 +6,7 @@ export interface KeyboardReleaseReturns { } export function useKeyboardRelease(): KeyboardReleaseReturns { - const shouldSetResponse = () => true + const shouldSetResponse = () => (Platform.OS === 'web' ? false : true) const onRelease = () => Keyboard.dismiss() return {onRelease, shouldSetResponse}