文件
mynode/packages/app-mobile/utils/hooks/useKeyboardState.ts
chen 301194963b
一些检查失败了
automerge / automerge (push) Has been cancelled
react-native-android-build-apk / AssembleRelease (push) Has been cancelled
Build macOS M1 / Main (push) Has been cancelled
Joplin Continuous Integration / Main (macos-15-intel) (push) Has been cancelled
Joplin Continuous Integration / Main (ubuntu-22.04) (push) Has been cancelled
Joplin Continuous Integration / Main (ubuntu-22.04-arm) (push) Has been cancelled
Joplin Continuous Integration / Main (windows-11-vs2026-arm) (push) Has been cancelled
Joplin Continuous Integration / Main (windows-2025) (push) Has been cancelled
Joplin Continuous Integration / ServerDockerImage (ubuntu-22.04) (push) Has been cancelled
Joplin Continuous Integration / ServerDockerImage (ubuntu-22.04-arm) (push) Has been cancelled
Joplin UI tests / Main (ubuntu-22.04) (push) Has been cancelled
Joplin UI tests / Main (windows-2025) (push) Has been cancelled
Joplin UI tests / Mobile (push) Has been cancelled
Close stale issues / ProcessStaleIssues (push) Has been cancelled
feat: Initial clean release of CHM
2026-11-04 11:29:39 +08:00

48 行
1.9 KiB
TypeScript

import { useEffect, useMemo, useState } from 'react';
import { Dimensions, Keyboard } from 'react-native';
const useKeyboardState = () => {
const [keyboardVisible, setKeyboardVisible] = useState(false);
const [hasSoftwareKeyboard, setHasSoftwareKeyboard] = useState(false);
const [isFloatingKeyboard, setIsFloatingKeyboard] = useState(false);
const [keyboardHeight, setKeyboardHeight] = useState(0);
useEffect(() => {
const showListener = Keyboard.addListener('keyboardDidShow', (evt) => {
setKeyboardVisible(true);
setHasSoftwareKeyboard(true);
// Floating keyboards on Android result in a negative height being set when portrait
setKeyboardHeight(evt.endCoordinates.height > 0 ? evt.endCoordinates.height : 0);
});
const hideListener = Keyboard.addListener('keyboardDidHide', () => {
setKeyboardVisible(false);
setKeyboardHeight(0);
});
const floatingListener = Keyboard.addListener('keyboardWillChangeFrame', (evt) => {
// The keyboardWillChangeFrame event only applies to iOS as it does not exist on Android, in which case isFloatingKeyboard will always be false.
// But we only need to utilise isFloatingKeyboard to workaround a KeyboardAvoidingView issue on iOS
const windowWidth = Dimensions.get('window').width;
// If the keyboard isn't as wide as the window, the floating keyboard is disabled.
// See https://github.com/facebook/react-native/issues/29473#issuecomment-696658937
setIsFloatingKeyboard(evt.endCoordinates.width < windowWidth);
setKeyboardHeight(evt.endCoordinates.height);
});
return (() => {
showListener.remove();
hideListener.remove();
floatingListener.remove();
});
});
return useMemo(() => {
return {
keyboardVisible,
hasSoftwareKeyboard,
isFloatingKeyboard,
dockedKeyboardHeight: isFloatingKeyboard ? 0 : keyboardHeight,
};
}, [keyboardVisible, hasSoftwareKeyboard, isFloatingKeyboard, keyboardHeight]);
};
export default useKeyboardState;