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
minHeightcủ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ùngnumberOfLines={2}, tăng lênnumberOfLines={3}để hiển thị đủ 3 dòng text. - Tăng
minHeightcủa vùng text: ĐặtminHeightđủ để chứa tối thiểu 3 dòng text ở cỡ chữ hiện tại (thông thường khoảng60–72pxvớifontSize: 13vàlineHeight: 20). - Dùng
flexGrow/flexthay 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
minHeightcủ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ùngminHeightkết hợpflexShrink: 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ồn | Ví dụ nội dung | Số 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à
RecentGiftCardhoặc tương tự trongBigFanScreen.tsx). - Xóa/thay
heightcứng bằngminHeight: 220(hoặc giá trị test thực tế phù hợp). - Tăng
minHeightphần icon box lên ~90px. - Xóa
numberOfLineskhỏi Text mô tả (hoặc tăng lênnumberOfLines={3}). - Dùng
flex: 1cho 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).