import React, { useRef } from 'react'; import { findNodeHandle } from 'react-native'; import { XRNKeyboard } from '@xrnjs/keyboard'; import { InputInstance } from '../../Input/interface'; import { useLocale } from '../../Locale/locale'; import { useDeepCompareEffect } from 'ahooks'; export enum CustomKeyboardType { SYSTEM = 'system', AMOUNT = 'amount', } export interface WithDecimalKeyboardProps { enableCusKeyboard?: boolean; customKeyboardType?: CustomKeyboardType; decimalType?: string; initFastDatas?: string[]; fastDatas?: string[]; inputRef?: React.RefObject; onReady?: () => void; } // 高阶组件函数 function withDecimalKeyboard

( WrappedComponent: React.ComponentType

) { return function WithDecimalKeyboard(props: P & WithDecimalKeyboardProps) { const { decimalType, initFastDatas = [], fastDatas = [], enableCusKeyboard = false, customKeyboardType = CustomKeyboardType.SYSTEM, inputRef, ...restProps } = props; const innerInputRef = useRef(null); const locale = useLocale(); const resolvedInputRef = inputRef || innerInputRef; const [isLayout, setIsLayout] = React.useState(false); const handleLayoutReady = React.useCallback(() => { setIsLayout(true); }, []); useDeepCompareEffect(() => { if (!enableCusKeyboard) return; if (!resolvedInputRef?.current) return; if (!isLayout) return; // 等待布局完成再设置键盘 const setKeyboardAsync = async () => { try { const textRef = resolvedInputRef.current?.getNativeTextRef?.(); if (!textRef) { return; } const nodeHandle = findNodeHandle(textRef); if (!nodeHandle) { console.warn('Could not find text input node handle'); return; } await XRNKeyboard.setKeyboard(nodeHandle, customKeyboardType as any, -1, { decimalType, initFastDataArray: initFastDatas, fastDataArray: fastDatas, doneDesc: locale.AmountInput.doneText, }); } catch (error) { console.error('Failed to setKeyboard:', error); } }; setKeyboardAsync(); }, [ decimalType, initFastDatas, fastDatas, enableCusKeyboard, customKeyboardType, isLayout, ]); return ( ); }; } export default withDecimalKeyboard;