Skip to main content

Yêu Cầu Chỉnh Sửa: Tăng Chiều Cao Card Quà Tặng Trên Màn Hình BigFan

Ngày cập nhật: 08/07/2026
Loại: UI/UX Layout Fix — Card Height & Text Truncation

Ảnh feedback:


1. Vấn Đề Hiện Tại

Các card trong khu vực "Người nhận quà mới nhất" trên màn hình BigFan gồm 2 phần:

  • Phần trên (Box quà): Hiển thị icon quà và tên phần thưởng (VD: "500 Point", "Quà may mắn").
  • Phần dưới (Box text): Hiển thị câu mô tả người nhận và thời gian.

Vấn đề: Dòng text mô tả ở phần dưới đang bị cắt giữa chừng:

❌ Hiện tại: "Member Đăng *** Nguyễn vừa trúng Quà may mắn quà tặng từ vòng quay m..."
✅ Yêu cầu: "Member Đăng *** Nguyễn vừa trúng Quà may mắn quà tặng từ vòng quay may mắn"

Phần cuối câu "quay may mắn" bị cắt mất, ảnh hưởng đến trải nghiệm đọc và hiểu thông tin của người dùng.


2. Nguyên Nhân

Card đang có chiều cao cố định (height hoặc minHeight cứng) không đủ để chứa toàn bộ nội dung text trong trường hợp câu dài. Điều này dẫn đến numberOfLines bị giới hạn hoặc overflow: hidden cắt nội dung hiển thị.


3. Yêu Cầu Chỉnh Sửa

3.1 Tăng chiều cao box quà (phần trên — icon + tên phần thưởng)

  • Tăng minHeight của phần box quà (vùng màu cam/xanh chứa icon và tên) thêm khoảng 8–12px so với hiện tại để cân đối tổng thể khi box text bên dưới được nới.

3.2 Tăng chiều cao box text (phần dưới — mô tả người nhận)

  • Xóa bỏ hoặc tăng numberOfLines: Nếu đang dùng numberOfLines={2}, tăng lên numberOfLines={3} để hiển thị đủ 3 dòng text.
  • Tăng minHeight của vùng text: Đặt minHeight đủ để chứa tối thiểu 3 dòng text ở cỡ chữ hiện tại (thông thường khoảng 60–72px với fontSize: 13lineHeight: 20).
  • Dùng flexGrow/flex thay cho chiều cao cố định: Để card tự co giãn theo nội dung trong phạm vi cho phép.

3.3 Chiều cao card tổng thể

  • Tăng minHeight của toàn bộ card (wrapper) để phù hợp với phần box quà và box text sau khi nới.
  • KHÔNG dùng chiều cao cứng tuyệt đối (height: X) cho card — nên dùng minHeight kết hợp flexShrink: 0 để card không bị ép nhỏ hơn ngưỡng tối thiểu nhưng vẫn có thể cao hơn nếu cần.

4. Quy Tắc Độ Dài Text Theo Nguồn Nội Dung

Câu mô tả trong card có thể đến từ 2 nguồn với độ dài khác nhau:

NguồnVí dụ nội dungSố dòng ước tính
Vòng quay may mắn (dài hơn)"Member Đăng *** Nguyễn vừa trúng Quà may mắn quà tặng từ vòng quay may mắn"~3 dòng
Marketing gửi quà (ngắn hơn)"Member Nguyễn *** Tín vừa nhận được Voucher chúc mừng sinh nhật"~2 dòng

Quy tắc: Card phải hiển thị đủ nội dung cho trường hợp dài nhất (vòng quay — ~3 dòng) mà không bị cắt. Trường hợp ngắn hơn (marketing) hiển thị bình thường, phần còn lại để trống.


5. Gợi Ý Cấu Trúc Code (React Native)

// Card container — dùng minHeight thay cho height cứng
const RecentGiftCard = ({ iconColor, giftName, description, timeAgo, tag }) => (
<View style={styles.cardWrapper}>

{/* Phần trên: Box icon + tên quà */}
<View style={[styles.giftIconBox, { backgroundColor: iconColor }]}>
<GiftIcon />
<Text style={styles.giftName}>{giftName}</Text>
</View>

{/* Phần dưới: Box mô tả */}
<View style={styles.descriptionBox}>
{/* Text KHÔNG giới hạn numberOfLines — để tự xuống dòng */}
<Text style={styles.descriptionText}>{description}</Text>

{/* Footer: Thời gian + Tag */}
<View style={styles.cardFooter}>
<Text style={styles.timeText}>{timeAgo}</Text>
<View style={styles.tagBadge}>
<Text style={styles.tagText}>{tag}</Text>
</View>
</View>
</View>

</View>
);

const styles = StyleSheet.create({
cardWrapper: {
width: 160, // Chiều rộng cố định (card nằm trong horizontal scroll)
minHeight: 220, // Tăng minHeight tổng thể — đủ cho 3 dòng text
borderRadius: 12,
borderWidth: 1,
borderColor: '#E8E8E8',
overflow: 'hidden',
backgroundColor: '#FFFFFF',
marginRight: 12,
},

giftIconBox: {
minHeight: 90, // Tăng nhẹ so với trước để cân đối
alignItems: 'center',
justifyContent: 'center',
paddingVertical: 12,
},

giftName: {
fontSize: 14,
fontWeight: '700',
marginTop: 6,
textAlign: 'center',
paddingHorizontal: 8,
},

descriptionBox: {
flex: 1, // Cho phép phần này chiếm hết không gian còn lại
padding: 10,
justifyContent: 'space-between',
},

descriptionText: {
fontSize: 13,
color: '#333333',
lineHeight: 19,
// KHÔNG đặt numberOfLines — để text tự xuống dòng đủ nội dung
flexShrink: 1,
},

cardFooter: {
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
marginTop: 8,
},

timeText: {
fontSize: 11,
color: '#999999',
},

tagBadge: {
backgroundColor: '#EAF6FF',
borderRadius: 20,
paddingHorizontal: 8,
paddingVertical: 2,
},

tagText: {
fontSize: 11,
color: '#2BA89A',
fontWeight: '500',
},
});

Checklist Kỹ Thuật

  • Tìm component card trong màn hình BigFan (thường là RecentGiftCard hoặc tương tự trong BigFanScreen.tsx).
  • Xóa/thay height cứng bằng minHeight: 220 (hoặc giá trị test thực tế phù hợp).
  • Tăng minHeight phần icon box lên ~90px.
  • Xóa numberOfLines khỏi Text mô tả (hoặc tăng lên numberOfLines={3}).
  • Dùng flex: 1 cho phần box text dưới để tự co giãn theo nội dung.
  • Test với cả 2 trường hợp nội dung: câu dài (vòng quay) và câu ngắn (marketing) để đảm bảo card hiển thị đúng trong cả 2 tình huống.
  • Kiểm tra horizontal scroll list có bị ảnh hưởng chiều cao hay không (đảm bảo các card trong cùng row đều cao bằng nhau — dùng alignItems: 'stretch' trên FlatList nếu cần).