# FE Single Session Handling Required

Tanggal: 2026-03-11

## Ringkasan

Behavior BE saat ini sudah sesuai single-session:

- `single_device_session = true` di `app_settings`
- Login di device B membuat token device A menjadi invalid
- Request protected dari device A akan return:
  - `401`
  - body: `{ "message": "session replaced" }`

Namun FE belum selalu auto-logout jika user A sedang idle (tidak ada request).

## Kenapa Terlihat "Masih Multi Device"

Jika user A sedang diam di halaman (tidak call API), FE belum tahu tokennya sudah diganti.
Logout baru terjadi saat FE menembakkan request berikutnya dan menerima `401 session replaced`.

Jadi ini bukan bug policy di BE, tapi gap handling di FE.

## Wajib Diupdate di FE

## 1) Global response interceptor untuk `401`

Di layer HTTP client FE (`axios/fetch wrapper`):

- Jika response `401` dan message salah satu:
  - `session replaced`
  - `invalid or revoked access token`
  - `invalid refresh token`
- Maka lakukan:
  - clear access token + refresh token
  - clear state auth/store
  - redirect ke halaman login
  - tampilkan toast: `Akun digunakan di device lain. Silakan login ulang.`

## 2) Heartbeat / silent check saat user idle

Tambahkan timer ringan (misal tiap 30-60 detik) saat user sudah login:

- `GET /api/v1/auth/me`
- Jika `401 session replaced` -> jalankan forced logout flow

Tujuan: user A logout otomatis walau tidak klik apa pun.

## 3) Cross-tab sync (dalam browser yang sama)

Gunakan salah satu:

- `storage` event (localStorage), atau
- `BroadcastChannel`

Saat satu tab logout karena session replaced:

- tab lain di browser yang sama ikut clear token + redirect login.

## 4) Login response handling

Login response sekarang punya field:

- `session_replaced` (boolean)

FE bisa pakai ini untuk memberi notifikasi opsional:

- `Sesi lama telah digantikan oleh login baru.`

## 5) Endpoint FE yang perlu tetap diproteksi

Semua route yang butuh auth harus memicu validasi token aktif, contoh:

- `/api/v1/auth/me`
- `/api/v1/products`
- `/api/v1/stocks/*`
- `/api/v1/settings/*`

## Acceptance Criteria FE

1. Login di A -> sukses.
2. Login di B -> sukses.
3. Tab A idle -> dalam <= 60 detik otomatis redirect login (tanpa klik apa pun).
4. Semua tab A (jika multi-tab) ikut logout.
5. Tab B tetap normal.

