Bỏ qua, đến nội dung

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ự:

  1. Plugin đã bật: Xác nhận plugin-notification-in-app-message trong Plugin Manager
  2. notification-manager đã bật: Plugin này là dependency bắt buộc
  3. Server đã restart: Khởi động lại sau khi bật plugin
  4. 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):

  1. Client kết nối SSE
  2. Gọi API lấy danh sách thông báo chưa đọc
  3. 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:

  1. 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
  2. userId đúng: Đảm bảo to chứa đúng userId (không phải username hay email)
  3. Refresh trang: Thử hard refresh để kiểm tra
  4. 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ânGiải pháp
Nginx bufferingThêm proxy_buffering off cho endpoint SSE
TimeoutTăng proxy_read_timeout (khuyến nghị 86400s)
Load balancerCấu hình sticky session hoặc tắt buffering
CloudFlareCloudFlare 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:

  1. Refresh trang: Badge sẽ được recalculate từ database
  2. 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
  3. 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:

  1. Plugin mobile đã bật: plugin-mobile cần được kích hoạt
  2. Route mobile: Plugin tự đăng ký mobile route — kiểm tra danh sách route trong mobile settings
  3. antd-mobile: Component mobile dùng antd-mobile — đảm bảo dependency đã cài đặt