# Notifikasi


OmniStream memiliki tiga lapisan notifikasi yang saling melengkapi: **pusat notifikasi dalam app** (bell icon), **notifikasi browser/push** (Web Push API), dan **suara notifikasi** yang dapat dikonfigurasi per jenis event.

## Pusat notifikasi dalam app

Halaman notifikasi lengkap dapat dibuka di `/notifications`. Notifikasi disimpan di `localStorage` browser (maks. 100 entri, tertua dihapus secara otomatis).

### Jenis notifikasi

| Tipe | Kategori UI | Kapan muncul |
|---|---|---|
| `assignment` | Assignments | Percakapan baru ditugaskan ke Anda |
| `transfer` | Assignments | Percakapan ditransfer ke Anda dari agent lain |
| `mention` | Mentions | Anda di-mention dalam catatan internal |
| `sla_breach` | SLA | SLA percakapan yang Anda tangani dilanggar |
| `new_message` | Messages | Pesan baru masuk di percakapan Anda |
| `system` | System | Pengumuman atau peringatan sistem |

### Filter kategori

Di bagian atas halaman terdapat tab filter:

- **All** — semua notifikasi
- **Assignments** — mencakup tipe `assignment` dan `transfer`
- **Mentions** — tipe `mention`
- **SLA** — tipe `sla_breach`
- **Messages** — tipe `new_message`
- **System** — tipe `system`

Setiap tab menampilkan badge jumlah notifikasi yang belum dibaca di kategori tersebut.

### Pengelompokan berdasarkan tanggal

Notifikasi dikelompokkan otomatis ke dalam: **Today**, **Yesterday**, **This Week**, dan **Older**. Halaman menampilkan 20 notifikasi pertama; klik **Load more** untuk memuat 20 berikutnya.

### Tindakan pada notifikasi

| Tindakan | Cara |
|---|---|
| Buka halaman terkait | Klik baris notifikasi (mengikuti `link` yang tersimpan, mis. `/inbox?id=…`) |
| Tandai satu notifikasi dibaca | Hover notifikasi → klik ikon centang |
| Tandai semua dibaca | Tombol **Mark all read** di sudut kanan atas (hanya muncul jika ada yang belum dibaca di filter aktif) |
| Hapus satu notifikasi | Hover notifikasi → klik ikon X |
| Hapus semua notifikasi | Tombol **Clear all** di sudut kanan atas |
| Buka pengaturan | Tombol **Settings** → mengarah ke `/profile#notification-preferences` |

:::tip
Tandai semua dibaca setelah memulai shift agar badge unread count kembali bersih. Tindakan ini hanya menandai notifikasi pada filter kategori yang sedang aktif, bukan seluruh kategori.
:::

### Endpoint API (Notifications Inbox)

| Aksi | Endpoint |
|---|---|
| Ambil daftar notifikasi | `GET /api/notifications/inbox` |
| Hitung notifikasi belum dibaca | `GET /api/notifications/inbox/unread-count` |
| Tandai satu notifikasi dibaca | `PATCH /api/notifications/inbox/{id}/read` |
| Tandai semua notifikasi dibaca | `POST /api/notifications/inbox/mark-all-read` |
| Hapus notifikasi | `DELETE /api/notifications/inbox/{id}` |

Parameter query `GET /api/notifications/inbox`: `is_read` (boolean opsional), `limit` (maks. 100, default 50), `offset`.

Skema lengkap di [API Reference](/api).

---

## Notifikasi browser (Web Push)

OmniStream mendukung **Web Push API** standar browser sehingga notifikasi muncul di luar jendela browser, bahkan ketika tab OmniStream sedang tidak aktif. Implementasi menggunakan enkripsi P-256 (VAPID).

:::note
Pengiriman push aktual membutuhkan variabel environment `VAPID_PUBLIC_KEY` yang dikonfigurasi di server. Jika variabel ini tidak diset, proses subscribe tetap berhasil tetapi notifikasi push belum terkirim ke browser.
:::

### Cara mengaktifkan notifikasi browser

1. Buka pengaturan profil Anda di `/profile`.
2. Temukan bagian **Notification Preferences**.
3. Klik tombol **Enable Browser Notifications**.
4. Browser akan menampilkan dialog izin — pilih **Allow**.
5. Setelah izin diberikan, browser mengirim data subscripsi (endpoint, kunci P-256, dan auth secret) ke server via `POST /api/notifications/subscribe`.

:::warning
Notifikasi browser hanya berfungsi di browser yang mendukung Web Push API (Chrome, Edge, Firefox). Safari memerlukan izin tambahan di pengaturan sistem macOS. Jika Anda menolak izin, buka pengaturan browser → Site Settings → Notifications untuk memberikan izin ulang.
:::

### Menonaktifkan notifikasi browser

Klik **Disable** di bagian yang sama, atau cabut izin notifikasi dari pengaturan browser. Pencabutan lewat tombol Disable mengirim `DELETE /api/notifications/subscribe` dengan endpoint yang tersimpan.

### Preferensi per jenis event (push & suara)

Setiap agent dapat mengatur apakah push notification dan suara diaktifkan untuk setiap dari enam jenis event berikut:

| Event type | Keterangan |
|---|---|
| `new_message` | Pesan baru masuk |
| `conversation_assigned` | Percakapan ditugaskan ke Anda |
| `conversation_transferred` | Percakapan ditransfer ke Anda |
| `sla_breach` | Pelanggaran SLA |
| `mention` | Mention dalam catatan internal |
| `system_alert` | Peringatan sistem |

Nilai default (jika belum pernah disimpan): `push_enabled: true`, `sound_enabled: true` untuk semua event type.

### Endpoint API (Push Notifications)

| Aksi | Endpoint |
|---|---|
| Ambil VAPID public key | `GET /api/notifications/vapid-key` |
| Daftarkan subscripsi browser | `POST /api/notifications/subscribe` |
| Hapus subscripsi browser | `DELETE /api/notifications/subscribe` |
| Kirim push uji coba | `POST /api/notifications/test` |
| Ambil preferensi notifikasi | `GET /api/notifications/preferences` |
| Simpan preferensi notifikasi | `PUT /api/notifications/preferences` |

Contoh menyimpan preferensi push:

```json
[
  { "event_type": "new_message", "push_enabled": true, "sound_enabled": false },
  { "event_type": "sla_breach", "push_enabled": true, "sound_enabled": true }
]
```

Tipe event yang tidak dikenal akan ditolak dengan error `422 Unprocessable Entity`.

---

## Pengaturan suara notifikasi

Buka `/settings/notification-sounds` untuk mengonfigurasi suara yang berbeda untuk setiap jenis event.

### Event yang didukung

| Event | Label di UI |
|---|---|
| `new_message` | New Message |
| `new_conversation` | New Conversation |
| `mention` | Mention |
| `transfer` | Transfer |
| `sla_warning` | SLA Warning |

### Pilihan suara

Setiap event dapat dikonfigurasi dengan salah satu dari enam opsi suara:

`Default` · `Chime` · `Bell` · `Ping` · `Pop` · `None`

Pilih **None** untuk menonaktifkan suara pada event tersebut tanpa menonaktifkan push notifikasinya.

### Cara mengubah pengaturan suara

1. Buka **Settings → Notification Sounds** (`/settings/notification-sounds`).
2. Gunakan toggle di setiap baris untuk mengaktifkan atau menonaktifkan suara event tersebut.
3. Pilih jenis suara dari dropdown di sebelah kanan (dropdown dinonaktifkan otomatis jika toggle mati).
4. Klik ikon speaker untuk **preview suara** sebelum menyimpan.
5. Klik **Save Preferences**.

:::tip
Preview suara tersedia selama suara yang dipilih bukan **None**. Tombol preview dinonaktifkan otomatis jika nilai suara adalah `none`.
:::

### Endpoint API (Notification Sounds)

| Aksi | Endpoint |
|---|---|
| Ambil preferensi suara | `GET /api/notifications/sounds` |
| Simpan preferensi suara | `PUT /api/notifications/sounds` |

`PUT /api/notifications/sounds` mendukung **partial update** — hanya field yang dikirim yang akan diubah; field yang tidak disertakan tetap menggunakan nilai sebelumnya.

Contoh memperbarui hanya suara untuk pesan baru:

```json
{ "new_message_sound": "chime", "new_message_enabled": true }
```

Skema lengkap di [API Reference](/api).

---

## Rute terkait

- [Inbox Agent](/panduan/agent/inbox) — daftar percakapan real-time
- [Catatan Internal](/panduan/agent/catatan-internal) — mention agent dalam catatan
- [Kebijakan SLA](/panduan/admin/kebijakan-sla) — konfigurasi trigger SLA breach
