CAPS04-FE-REFACTOR / README.md
ABDAN HAFIDZ
Update README.md
40911ca unverified
|
Raw
History Blame
9.92 kB
---
title: CAPS04 FE REFACTOR
emoji: 🚀
colorFrom: blue
colorTo: indigo
sdk: docker
app_port: 7860
pinned: false
---
# CAPS04 FE REFACTOR
A Syududu
---
## Embed Widget — Integration Guide
RAG Hub menyediakan widget chat berbasis `<iframe>` yang dapat diintegrasikan ke situs web pihak ketiga manapun. Widget ini mendukung autentikasi berbasis API Key, kustomisasi tampilan penuh melalui query string, serta komunikasi dua arah dengan halaman induk melalui `postMessage`.
---
### Table of Contents
1. [Quick Start](#1-quick-start)
2. [Authentication](#2-authentication)
3. [URL Parameters Reference](#3-url-parameters-reference)
4. [Theming & Customization](#4-theming--customization)
5. [postMessage Events](#5-postmessage-events)
6. [Session Persistence](#6-session-persistence)
7. [Full Integration Examples](#7-full-integration-examples)
8. [Troubleshooting](#8-troubleshooting)
---
### 1. Quick Start
Tambahkan `<iframe>` berikut ke halaman HTML Anda:
```html
<iframe
src="https://your-raghub-domain.com/embed?api_key=YOUR_API_KEY"
width="420"
height="680"
style="border: none; border-radius: 16px;"
allow="clipboard-write"
></iframe>
```
Ganti `YOUR_API_KEY` dengan API Key yang digenerate dari halaman **Admin → API Keys**.
---
### 2. Authentication
Widget menggunakan API Key untuk autentikasi. Saat pertama kali dimuat, widget menukar API Key dengan bearer token melalui endpoint `/auth/login/api-key`, lalu menyimpan token tersebut ke cookie browser selama **7 hari**.
```
/embed?api_key=sk-xxxxxxxxxxxxxxxx
```
Selama cookie masih valid, widget tidak akan login ulang meski halaman di-refresh. Cookie otomatis dihapus setelah 7 hari atau jika browser cookie dibersihkan.
#### Token Resolution Priority
Widget menyelesaikan autentikasi dengan urutan berikut:
1. Cek cookie — jika token sudah tersimpan dan belum expired, langsung digunakan.
2. Cek parameter `?api_key` di URL, tukar dengan token via API, simpan ke cookie.
3. Jika tidak ada keduanya → widget menampilkan pesan error autentikasi.
---
### 3. URL Parameters Reference
Semua konfigurasi dilakukan melalui query string pada URL `src` iframe.
#### 3.1 Authentication
| Parameter | Tipe | Keterangan |
|-----------|----------|------------|
| `api_key` | `string` | API Key dari Admin Panel. Widget otomatis login dan menyimpan token ke cookie. |
#### 3.2 Behavior
| Parameter | Tipe | Default | Keterangan |
|--------------|----------|---------|------------|
| `course_id` | `string` | — | Pra-pilih mata kuliah tertentu. Widget langsung menggunakan course ini tanpa perlu user memilih. |
| `session_id` | `string` | — | Buka riwayat sesi chat tertentu langsung saat widget dimuat. |
| `user_name` | `string` | `User` | Nama yang ditampilkan di greeting ("Good Morning, ..."). Jika tidak diisi, diambil dari data user saat login via `api_key`. |
#### 3.3 Appearance
| Parameter | Tipe | Default | Keterangan |
|--------------|----------|---------|------------|
| `title` | `string` | `RAG Hub` | Judul widget (tab browser & empty state). |
| `subtitle` | `string` | *(default text)* | Teks deskripsi di bawah judul pada empty state. |
---
### 4. Theming & Customization
Semua warna dikustomisasi via query string. Format nilai warna: hex 3-digit (`#fff`) atau 6-digit (`#ffffff`), dengan atau tanpa `#` di depan.
Format radius: nilai numerik diikuti unit `px` atau `rem` (maks. 2 digit), contoh: `20px`, `1rem`.
| Parameter | Default | Keterangan |
|----------------------|-------------|------------|
| `primary` | `#2764eb` | Warna utama — tombol kirim, avatar asisten, border composer. |
| `primary_gradient` | `#ccdcff` | Warna lembut primary — background avatar user & aksen gradient. |
| `background` | `#ffffff` | Background utama widget. |
| `background_profile` | `#ffffff` | Background bubble chat asisten dan composer. |
| `text_primary` | `#0a0a0a` | Warna teks utama. |
| `text_secondary` | `#737373` | Warna teks sekunder / placeholder. |
| `border` | `#739af1` | Warna border composer dan bubble. |
| `danger` | `#ef4444` | Warna aksi destruktif (tombol hapus sesi). |
| `radius` | `20px` | Border radius bubble chat dan composer. |
**Contoh URL dengan tema gelap:**
```
/embed?api_key=YOUR_KEY
&background=1a1a2e
&background_profile=16213e
&text_primary=e0e0e0
&text_secondary=8892b0
&primary=4f8ef7
&primary_gradient=1e3a6e
&border=2a3f6f
&danger=ff6b6b
&radius=16px
```
---
### 5. postMessage Events
Widget berkomunikasi dengan halaman induk melalui `window.postMessage`. Dengarkan event ini di halaman yang meng-embed iframe untuk mendapat notifikasi dari widget.
#### 5.1 Events yang Dikirim Widget (Outbound)
| Event type | Kapan dikirim |
|-----------------------------|---------------|
| `sevima-raghub:close` | User menekan tombol **✕** di sudut kanan atas widget. |
**Contoh listener di halaman induk:**
```javascript
window.addEventListener('message', (event) => {
// Selalu validasi origin di produksi
if (event.origin !== 'https://your-raghub-domain.com') return;
if (event.data?.type === 'sevima-raghub:close') {
// Sembunyikan atau hancurkan iframe
document.getElementById('raghub-iframe').style.display = 'none';
}
});
```
---
### 6. Session Persistence
Widget menyimpan data sesi di **cookie browser** dengan masa berlaku 7 hari. Cookie diset pada domain RAG Hub (domain iframe), sehingga tidak dapat diakses oleh halaman induk.
| Cookie name | Isi | TTL |
|------------------------------|-----|-----|
| `sevima_raghub_embed_token` | Bearer token aktif. | 7 hari |
| `sevima_raghub_embed_user` | Objek user JSON (`id`, `name`, `email`, `role`). | 7 hari |
Selama cookie masih valid, widget tidak akan memanggil ulang `/auth/login/api-key` meski halaman di-refresh atau tab ditutup lalu dibuka kembali.
Untuk memaksa login ulang (reset sesi), reload iframe dengan mengganti `src` — cookie lama akan diabaikan saat API Key baru ditukar.
---
### 7. Full Integration Examples
#### 7.1 Embed Sederhana
```html
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8" />
<title>My App</title>
</head>
<body>
<iframe
id="raghub-widget"
src="https://your-raghub-domain.com/embed?api_key=sk-xxxx&user_name=Budi&title=Asisten+Akademik"
width="420"
height="680"
style="border: none; border-radius: 20px; box-shadow: 0 8px 32px rgba(0,0,0,0.15);"
allow="clipboard-write"
></iframe>
<script>
window.addEventListener('message', (event) => {
if (event.origin !== 'https://your-raghub-domain.com') return;
if (event.data?.type === 'sevima-raghub:close') {
document.getElementById('raghub-widget').style.display = 'none';
}
});
</script>
</body>
</html>
```
#### 7.2 Floating Chat Button
```html
<style>
#raghub-fab {
position: fixed;
bottom: 24px;
right: 24px;
width: 56px;
height: 56px;
border-radius: 50%;
background: #2764eb;
border: none;
cursor: pointer;
color: #fff;
font-size: 24px;
box-shadow: 0 4px 16px rgba(39,100,235,0.4);
z-index: 1000;
}
#raghub-container {
display: none;
position: fixed;
bottom: 96px;
right: 24px;
width: 420px;
height: 680px;
z-index: 1000;
border-radius: 20px;
overflow: hidden;
box-shadow: 0 12px 48px rgba(0,0,0,0.2);
}
#raghub-container iframe {
width: 100%;
height: 100%;
border: none;
}
</style>
<button id="raghub-fab" onclick="toggleWidget()">💬</button>
<div id="raghub-container">
<iframe
id="raghub-iframe"
src="https://your-raghub-domain.com/embed?api_key=sk-xxxx&primary=2764eb&radius=16px"
allow="clipboard-write"
></iframe>
</div>
<script>
function toggleWidget() {
const container = document.getElementById('raghub-container');
container.style.display = container.style.display === 'none' ? 'block' : 'none';
}
window.addEventListener('message', (event) => {
if (event.origin !== 'https://your-raghub-domain.com') return;
if (event.data?.type === 'sevima-raghub:close') {
document.getElementById('raghub-container').style.display = 'none';
}
});
</script>
```
#### 7.3 Pra-pilih Mata Kuliah & Langsung ke Sesi Tertentu
```html
<iframe
src="https://your-raghub-domain.com/embed
?api_key=sk-xxxx
&course_id=COURSE_UUID
&session_id=SESSION_UUID
&user_name=Mahasiswa+A"
width="420"
height="680"
style="border: none; border-radius: 20px;"
></iframe>
```
---
### 8. Troubleshooting
#### Widget menampilkan "Token iframe tidak tersedia"
Pastikan parameter `?api_key=` ada di URL `src` iframe dan API Key tersebut masih aktif serta belum direvoke di Admin Panel.
Jika cookie lama ada tapi sudah expired, hapus cookie `sevima_raghub_embed_token` dari browser lalu reload.
#### Mata kuliah tidak muncul di dropdown
Pastikan akun yang terkait dengan `api_key` memiliki akses ke setidaknya satu course. Periksa di Admin Panel bahwa course sudah berstatus **active**.
#### Widget tidak merespons tombol ✕ di halaman induk
Pastikan listener `message` event sudah terpasang sebelum iframe dimuat, dan validasi `event.origin` sesuai domain RAG Hub.
#### Token expired di tengah sesi
Widget tidak melakukan refresh token otomatis. Jika token expired, cukup reload iframe — widget akan menukar `api_key` yang sama dengan token baru dan menyimpannya ke cookie:
```javascript
const iframe = document.getElementById('raghub-iframe');
iframe.src = iframe.src; // trigger reload
```
#### Warna tidak berubah setelah mengubah query string
Pastikan nilai warna dalam format hex yang valid: 3 atau 6 digit, dengan atau tanpa `#`. Karakter selain `0-9` dan `a-f` akan diabaikan dan diganti nilai default.
---