Trước đây: Thông báo hiển thị ngay cả khi người dùng đang xem chat, gây khó chịu và không có ý nghĩa.
Bây giờ: Thông báo chỉ hiển thị khi người dùng KHÔNG đang xem chat (tab bị ẩn hoặc cửa sổ không focus).
- Tin nhắn từ người khác (không phải tin nhắn của mình)
- Tin nhắn mới (trong vòng 30 giây)
- Người dùng đã bật thông báo
document.hidden = true: Tab không được xem → HIỂN THỊ thông báodocument.hidden = false: Tab đang được xem → KHÔNG HIỂN THỊ thông báo
- Chỉ phát âm thanh khi tab không được focus (
document.hidden = true) - Tránh phát âm thanh khi người dùng đang xem chat
User A đang xem chat với User B
User B gửi tin nhắn mới
→ KHÔNG hiển thị notification (vì đang xem rồi)
→ KHÔNG phát âm thanh
User A chuyển sang tab Facebook
User B gửi tin nhắn mới cho User A
→ HIỂN THỊ notification
→ PHÁT âm thanh
User A minimize cửa sổ browser
User B gửi tin nhắn mới
→ HIỂN THỊ notification
→ PHÁT âm thanh
// Chỉ kiểm tra điều kiện cơ bản, không kiểm tra document.hidden
if (latestMessage.senderId !== user.uid && notificationsEnabled && isRecentMessage) {
showMessageNotification(/* ... */);
}// Hook tự kiểm tra document.hidden để quyết định hiển thị
const showMessageNotification = useCallback((senderName, message, avatar) => {
// Chỉ hiển thị notification và phát âm thanh khi tab không focus
if (document.hidden) {
// Show notification & play sound
} else {
// Skip notification - user is actively viewing
}
}, []);- UX tốt hơn: Không spam notification khi đang xem
- Tiết kiệm tài nguyên: Không tạo notification không cần thiết
- Logic rõ ràng: Separation of concerns - ChatInterface kiểm tra message, useNotifications kiểm tra focus
- Dễ test: Có thể test focus/blur behavior riêng biệt