import type { FinanceRecord } from '@/types/finance/record' import Big from 'big.js' import { useEffect, useState } from 'react' import { Keyboard, Pressable, StyleSheet, Text, TouchableWithoutFeedback, View } from 'react-native' import { ADatePicker, AInput, LucideIcon } from '@/components/common/ao/index' import { useKeyboardHeight } from '@/hooks/useKeyboardHeight' import { getCurrentDate } from '@/utils/time' interface KeydownItem { key: string | number content: React.ReactNode } interface AmountKeyboardProps { show?: boolean record: FinanceRecord // 可选:点击完成按钮触发 onDone?: (record: FinanceRecord) => void } export default function AmountKeyboard({ show = false, record, onDone, }: AmountKeyboardProps) { // 自定义键盘计算过程 const [keydownInput, setKeydownInput] = useState('') // 日期选择 const [showDatePicker, setShowDatePicker] = useState(false) // 备注聚焦 const [remarkIsFocused, setRemarkIsFocused] = useState(false) // 键盘高度 const keyboardHeight = useKeyboardHeight() const [innerRecord, setInnerRecord] = useState({ id: 0, category_id: 0, amount: '', remark: '', record_time: '', member_id: 0, member_name: '', }) useEffect(() => { setInnerRecord(record) setKeydownInput(record.amount || '0.00') }, [record]) useEffect(() => { if (!keydownInput) { setInnerRecord({ ...innerRecord, amount: '0', }) return } try { setInnerRecord({ ...innerRecord, amount: calculateWithBig(keydownInput), }) } catch { setInnerRecord({ ...innerRecord, amount: '0', }) } }, [keydownInput]) return ( setShowDatePicker(true)} > {innerRecord.record_time} {innerRecord.amount} {keydownInput} { setInnerRecord({ ...innerRecord, remark: val, }) }} onFocus={() => setRemarkIsFocused(true)} onBlur={() => setRemarkIsFocused(false)} /> {keys.map((item, idx) => { const isFirstCol = idx % 4 === 0 const isFirstRow = idx < 4 const isLastCol = (idx + 1) % 4 === 0 const isLastRow = idx >= 12 return ( handlePress(item.key)} style={{ width: '25%', height: '25%', justifyContent: 'center', alignItems: 'center', borderTopWidth: isFirstRow ? 0.3 : 0, borderLeftWidth: isFirstCol ? 0.3 : 0, borderRightWidth: !isLastCol ? 0.3 : 0, borderBottomWidth: !isLastRow ? 0.3 : 0, borderColor: '#ddd', }} > {({ pressed }) => { const defaultBg = item.key === '/' ? '#e6d7b8' : '#fff' const pressedBg = item.key === '/' ? '#f5e9d4' : '#f2f2f2' return ( <> {item.content} ) }} ) })} {remarkIsFocused && keyboardHeight > 220 && ( )} { setShowDatePicker(false) }} onConfirm={(date) => { setShowDatePicker(false) setInnerRecord({ ...innerRecord, record_time: date, }) }} /> ) }