diff --git a/src/components/business/PostMentionInput.tsx b/src/components/business/PostMentionInput.tsx index 1c72ccd..f443c59 100644 --- a/src/components/business/PostMentionInput.tsx +++ b/src/components/business/PostMentionInput.tsx @@ -47,6 +47,8 @@ interface PostMentionInputProps { minHeight?: number; autoExpand?: boolean; onPostRefPasted?: (postId: string, title: string) => void; + onSubmitEditing?: () => void; + returnKeyType?: 'default' | 'send' | 'done'; } const PostMentionInput: React.FC = ({ @@ -59,6 +61,8 @@ const PostMentionInput: React.FC = ({ minHeight = 100, autoExpand = false, onPostRefPasted, + onSubmitEditing, + returnKeyType = 'default', }) => { const colors = useAppColors(); const currentUser = useAuthStore(s => s.currentUser); @@ -281,6 +285,9 @@ const PostMentionInput: React.FC = ({ multiline textAlignVertical="top" scrollEnabled={!autoExpand} + returnKeyType={returnKeyType} + onSubmitEditing={onSubmitEditing} + blurOnSubmit={false} style={[ styles.input, autoExpand && styles.inputAutoExpand, diff --git a/src/screens/home/PostDetailScreen.tsx b/src/screens/home/PostDetailScreen.tsx index 6392664..5d16319 100644 --- a/src/screens/home/PostDetailScreen.tsx +++ b/src/screens/home/PostDetailScreen.tsx @@ -1401,7 +1401,7 @@ export const PostDetailScreen: React.FC = () => { { paddingHorizontal: responsivePadding, paddingVertical: responsiveGap, - paddingBottom: keyboardHeight + responsiveGap + insets.bottom, + paddingBottom: (Platform.OS === 'android' ? keyboardHeight : 0) + responsiveGap + insets.bottom, } ]}> {/* 回复提示 */} @@ -1486,6 +1486,8 @@ export const PostDetailScreen: React.FC = () => { minHeight={60} autoExpand style={styles.expandedTextInput} + returnKeyType="send" + onSubmitEditing={handleSendComment} /> {/* Image preview */} diff --git a/src/screens/message/ChatScreen.tsx b/src/screens/message/ChatScreen.tsx index bb88c08..a6b1cec 100644 --- a/src/screens/message/ChatScreen.tsx +++ b/src/screens/message/ChatScreen.tsx @@ -545,7 +545,8 @@ export const ChatScreen: React.FC = (props) => { {/* 底部区域:输入框 + 面板 */} - 0 ? keyboardHeight : 0 }}> + {/* iOS 由外层 KeyboardAvoidingView(behavior=padding) 处理键盘避让;Android 需要手动推起 */} + 0 ? keyboardHeight : 0 }}> {/* 输入框区域 */} 0 && { paddingBottom: insets.bottom }]} diff --git a/src/screens/trade/TradeDetailScreen.tsx b/src/screens/trade/TradeDetailScreen.tsx index 34b9d64..6181c46 100644 --- a/src/screens/trade/TradeDetailScreen.tsx +++ b/src/screens/trade/TradeDetailScreen.tsx @@ -1,4 +1,4 @@ -import React, { useState, useEffect, useCallback, useMemo } from 'react'; +import React, { useState, useEffect, useCallback, useMemo, useRef } from 'react'; import { View, ScrollView, @@ -519,6 +519,7 @@ export function TradeDetailScreen({ tradeId }: TradeDetailScreenProps) { const [item, setItem] = useState(null); const [loading, setLoading] = useState(true); const [manageModalVisible, setManageModalVisible] = useState(false); + const hasRecordedView = useRef(false); const [showImageModal, setShowImageModal] = useState(false); const [selectedImageIndex, setSelectedImageIndex] = useState(0); @@ -548,7 +549,8 @@ export function TradeDetailScreen({ tradeId }: TradeDetailScreenProps) { }, [fetchItem]); useEffect(() => { - if (tradeId) { + if (tradeId && !hasRecordedView.current) { + hasRecordedView.current = true; tradeService.recordView(tradeId).catch(() => {}); } }, [tradeId]);