Panduan Pengembangan
Pendahuluan
Panduan ini menjelaskan cara menambahkan atau memodifikasi fitur di frontend Ravenxcope secara aman.
Sebelum Mengubah Kode
- Identifikasi rute dan folder fitur yang terlibat.
- Periksa apakah alur kerja tersebut sudah memiliki metode API di
src/lib/api.ts. - Periksa apakah tipe bersama sudah ada di
src/types/index.ts. - Periksa apakah tindakan UI memerlukan pembatasan izin (permission gating).
- Periksa apakah teks harus dilokalisasi di
src/locales/en.jsondansrc/locales/id.json. - Periksa apakah fitur tersebut memerlukan konfigurasi runtime.
Menambahkan Titik Akhir (Endpoint) API
- Tambahkan atau perbarui tipe TypeScript di
src/types/index.ts. - Tambahkan metode titik akhir ke grup yang relevan di
src/lib/api.ts. - Gunakan
apiClientbersama kecuali jika titik akhir tersebut secara khusus memerlukan streamingfetch. - Jaga jalur backend tetap relatif terhadap
API_BASE. - Kembalikan
Promise<AxiosResponse<ApiResponse<T>>>yang bertipe jika memungkinkan. - Gunakan
buildRepeatedQueryParams()untuk parameter kueri array yang diharapkan backend sebagai kunci yang berulang.
Hindari membuat instans Axios baru di dalam komponen fitur.
Menambahkan Rute
- Buat komponen tingkat rute di
src/modules/<domain>/pages. - Letakkan bagian khusus fitur di
src/modules/<domain>/partials. - Letakkan alur modal di
src/modules/<domain>/dialogs. - Impor halaman di
src/app/routes.tsx. - Tambahkan rute publik atau definisi rute dasbor bersarang.
- Jika rute tersebut termasuk dalam sidebar, atur
showInNav,navLabelKey, daniconpada rute dasbor. - Jika modul lain memerlukan jalur tersebut, tambahkan/perbarui
ROUTESdisrc/lib/constants.ts.
Menambahkan Layar Fitur
Ikuti pola layar fitur yang sudah ada:
- Gunakan primitif UI bersama dari
src/components/ui. - Bungkus konten rute dasbor dalam
RoutePage. - Gunakan
DataTableCarduntuk halaman daftar/tabel manajemen. - Gunakan
Card,Table,Dialog,Badge,Skeleton, danButtonsecara konsisten. - Jaga formulir buat/edit tetap di dalam dialog saat menyesuaikan alur pengguna, peran, dan sensor.
- Gunakan bendera state lokal untuk memicu pengambilan data ulang (refetch) saat mengikuti hook saat ini.
- Tampilkan umpan balik pengguna melalui pembantu alert/toast yang sudah ada.
Menambahkan Pengambilan Data (Data Fetching)
Untuk pembacaan sumber daya umum, tambahkan atau perluas hook di src/hooks/useApi.ts.
Konvensi hook saat ini:
- Gunakan
useStateuntukdata,loading, danerror. - Gunakan
useEffectuntuk siklus hidup permintaan. - Periksa
auth.isAuthenticated()ketika data bersifat privat. - Gunakan
AbortControlleruntuk menghindari pengaturan state setelah komponen di-unmount. - Kembalikan array fallback kosong untuk hook bergaya daftar.
- Ekspos
refetchhanya jika pemanggil memerlukannya.
Untuk permintaan satu kali (one-off) khusus fitur, memanggil api secara langsung di dalam komponen dapat diterima jika sesuai dengan kode di sekitarnya.
Menambahkan Tindakan dengan Batasan Izin
- Tambahkan slug izin ke
PERMISSIONSdisrc/lib/constants.tsjika belum ada. - Gunakan
useUserPermissions()di dalam layar. - Sembunyikan tindakan ketika
hasPermission(slug)bernilai false. - Jaga tindakan destruktif tetap di balik konfirmasi.
- Jangan mengandalkan pemeriksaan frontend untuk keamanan; otorisasi backend tetap harus menegakkan aturan tersebut.
Menambahkan Formulir
Formulir saat ini menggunakan state terkontrol dan penangan pengiriman (submit) manual.
Pola yang direkomendasikan:
- Inisialisasi state formulir dengan semua field yang diperlukan.
- Muat opsi pilihan di
useEffectjika diperlukan. - Validasi aturan wajib/lintas-field sederhana sebelum memanggil API.
- Nonaktifkan kontrol formulir saat pengiriman sedang berlangsung.
- Konversi nama field UI ke nama payload backend di satu tempat.
- Gunakan
showSuccess,showError, atautoastuntuk umpan balik. - Tutup dialog atau navigasi hanya setelah respons berhasil.
Menambahkan Teks yang Dilokalisasi
- Tambahkan kunci Bahasa Inggris ke
src/locales/en.json. - Tambahkan kunci Bahasa Indonesia ke
src/locales/id.json. - Gunakan
const { t } = useTranslation()di dalam komponen. - Hindari memperkenalkan string baru yang menghadap pengguna secara hard-coded di layar yang sudah menggunakan i18n.
Jika sebuah layar saat ini masih hard-coded, lokalisasikan teks yang disentuh jika memungkinkan, tetapi hindari penulisan ulang luas yang tidak terkait.
Memperbarui Konfigurasi Runtime
Saat menambahkan bendera runtime baru:
- Perluas
AppRuntimeConfigdanAppConfigdisrc/config/appConfig.ts. - Urai dan validasi nilai di
getRuntimeConfig(). - Tambahkan ke
.env.example. - Tambahkan ke
docker-entrypoint.sh. - Dokumentasikan di Runbook Konfigurasi dan Penyebaran.
- Pastikan nilai yang tidak valid gagal dengan aman (fail closed atau fall back safely).
Daftar Periksa Verifikasi Manual
Untuk perubahan UI:
- Jalankan TypeScript/build jika perilaku berubah:
yarn build
- Jalankan lint jika kode berubah:
yarn lint
- Tes login dan perlindungan rute
/dashboard. - Tes rute yang diubah secara langsung dan setelah penyegaran browser.
- Tes jalur sukses dan gagal untuk mutasi API.
- Tes status tindakan yang tersembunyi karena izin jika relevan.
- Tes tata letak seluler untuk sidebar, tabel, dialog, atau sheet.
Untuk perubahan yang hanya bersifat dokumentasi, verifikasi nama file dan referensi jalur. Build frontend tidak diperlukan.
Pembaruan Dokumentasi
Perbarui dokumentasi ketika:
- Rute ditambahkan, dihapus, atau diubah namanya.
- Kunci konfigurasi runtime berubah.
- Grup titik akhir API atau kontrak payload berubah.
- Perilaku auth/sesi berubah.
- Perilaku fitur berubah pada sensor, analitik, pengguna, peran, atau organisasi.
- Perilaku penyebaran berubah pada Docker, Nginx, atau injeksi konfigurasi.