Giao diện
Câu hỏi thường gặp (FAQ) — In-App Message
Cài đặt
Plugin không hiển thị biểu tượng chuông?
Kiểm tra theo thứ tự:
- Plugin đã bật: Xác nhận
plugin-notification-in-app-messagetrong Plugin Manager - notification-manager đã bật: Plugin này là dependency bắt buộc
- Server đã restart: Khởi động lại sau khi bật plugin
- Refresh trang: Hard refresh (
Ctrl+Shift+R) để load lại components
Có cần cấu hình thêm gì sau khi bật?
Không. Plugin tự động đăng ký kênh in-app-message và hiển thị UI (bell icon, inbox). Không cần cấu hình SMTP hay credentials như kênh email.
Sử dụng
Thông báo có real-time không?
Có. Plugin sử dụng SSE (Server-Sent Events) để push thông báo ngay khi gửi. Người dùng không cần refresh trang — thông báo hiển thị tức thì với:
- Badge đếm tăng trên bell icon
- Popup/toast notification (tuỳ cấu hình)
User offline có nhận được thông báo không?
Có. Thông báo được lưu trong database. Khi user online lại (mở trình duyệt hoặc refresh trang):
- Client kết nối SSE
- Gọi API lấy danh sách thông báo chưa đọc
- Hiển thị badge đếm và danh sách đầy đủ
Có thể gửi thông báo cho nhóm user không?
Có. Truyền mảng userId trong trường to:
typescript
await api.resource('messages').send({
values: {
channelName: 'in-app-message',
to: [userId1, userId2, userId3],
title: 'Thông báo chung',
content: { text: 'Nội dung...' },
},
});Mỗi user nhận bản copy riêng của thông báo.
Thông báo cũ có tự động xoá không?
Hệ thống hỗ trợ cấu hình auto cleanup — thông báo cũ hơn X ngày sẽ bị xoá tự động. Kiểm tra cấu hình trong Settings → Notification hoặc cấu hình cleanup job riêng.
Lỗi thường gặp
Thông báo gửi thành công nhưng user không thấy?
Kiểm tra:
- User đang online: SSE chỉ push đến client đang kết nối. Nếu user chưa mở trang, thông báo vẫn lưu trong DB và hiển thị khi online lại
- userId đúng: Đảm bảo
tochứa đúnguserId(không phải username hay email) - Refresh trang: Thử hard refresh để kiểm tra
- Send log: Kiểm tra Settings → Notification → Send Logs xem trạng thái gửi
SSE bị ngắt kết nối liên tục?
Nguyên nhân thường gặp:
| Nguyên nhân | Giải pháp |
|---|---|
| Nginx buffering | Thêm proxy_buffering off cho endpoint SSE |
| Timeout | Tăng proxy_read_timeout (khuyến nghị 86400s) |
| Load balancer | Cấu hình sticky session hoặc tắt buffering |
| CloudFlare | CloudFlare có timeout 100s cho SSE — cân nhắc bypass |
Badge đếm không chính xác?
Badge đếm được cập nhật qua SSE event và API count. Nếu không chính xác:
- Refresh trang: Badge sẽ được recalculate từ database
- Race condition: Nếu nhiều thông báo đến cùng lúc, badge có thể chậm cập nhật vài giây
- Cache: Client state (immer) có thể chưa đồng bộ — refresh sẽ khắc phục
Thông báo hiển thị trên desktop nhưng không trên mobile?
Kiểm tra:
- Plugin mobile đã bật:
plugin-mobilecần được kích hoạt - Route mobile: Plugin tự đăng ký mobile route — kiểm tra danh sách route trong mobile settings
- antd-mobile: Component mobile dùng
antd-mobile— đảm bảo dependency đã cài đặt