You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Obx(() => ...) adalah sebuah widget yang disediakan oleh GetX. Fungsinya adalah untuk membangun ulang UI setiap kali ada perubahan state yang diobservasi.
ElevatedButton adalah widget tombol dengan elevasi (bayangan) yang disediakan oleh Flutter.
style: ElevatedButton.styleFrom(...) digunakan untuk mengatur gaya tombol. Dalam kode ini, diatur agar tombol memiliki lebar maksimum (double.infinity), tinggi 40, dan padding vertikal 15.
onPressed: controller.isLoading.value ? null : () => controller.login(), adalah callback yang dipanggil saat tombol ditekan. Jika controller.isLoading.value bernilai true (artinya sedang dalam proses loading), maka tombol tidak akan merespons apapun (null). Jika tidak, maka akan memanggil fungsi controller.login().
child: controller.isLoading.value ? const CircularProgressIndicator() : const Text('Masuk'), adalah isi dari tombol. Jika controller.isLoading.value bernilai true, maka tombol akan menampilkan indikator loading (CircularProgressIndicator). Jika tidak, maka tombol akan menampilkan teks "Masuk".
Dalam konteks kode ini, controller kemungkinan adalah sebuah instance dari sebuah kelas yang mengimplementasikan logika bisnis untuk proses login. Variabel isLoading digunakan untuk mengontrol tampilan tombol saat proses login sedang berlangsung atau tidak.
Berikut adalah penjelasan rinci tentang kode fungsi asynchronous yang menangani proses login pengguna:
Rincian Kode
Deklarasi Fungsi:
Fungsi login() dideklarasikan sebagai Future<void>, yang berarti fungsi ini mengembalikan objek Future tanpa nilai kembalian.
State Management:
Fungsi ini menggunakan state management dengan isLoading(true) untuk menampilkan indikator loading sebelum melakukan proses login.
Mengambil Nilai Input:
Nilai dari input field untuk nomor rekam medis dan password diambil menggunakan nomorRekamMedisController.text dan passwordController.text.
Pengecekan Input:
Pengecekan dilakukan untuk memastikan nomor rekam medis dan password tidak kosong. Jika salah satu atau keduanya kosong, maka akan menampilkan snackbar dengan pesan error.
Simulasi Loading:
Setelah pengecekan selesai, terdapat penundaan semu (Future.delayed) selama 1,2 detik untuk mensimulasikan proses loading.
Permintaan HTTP POST:
Kode melakukan permintaan HTTP POST ke endpoint API /pasien/auth/login dengan menggunakan package http. Request body berisi nomor rekam medis dan password dalam format JSON.
Handling Respons Sukses:
Jika respons dari API memiliki status code 200 (sukses), kode akan mengambil token akses (access_token) dari respons JSON.
Token akses tersebut disimpan dalam penyimpanan lokal menggunakan package get_storage dengan kunci 'token'.
Mendapatkan Detail Pengguna:
Fungsi fetchPatientDetails(token) dipanggil dengan meneruskan token akses untuk mendapatkan detail pengguna dari API.
Jika respons dari fetchPatientDetails memiliki status code 200, detail pengguna disimpan dalam penyimpanan lokal dengan kunci 'user'.
Navigasi ke Layar Utama:
Setelah proses login berhasil, navigasi dilakukan ke layar utama (/home) menggunakan Get.offNamed().
Handling Respons Gagal:
Jika respons dari API login memiliki status code selain 200, maka snackbar dengan pesan error "Nomor rekam medis atau password salah" akan ditampilkan.
Mengubah State Loading:
Terakhir, state loading diubah menjadi false dengan isLoading(false).
Kesimpulan
Secara keseluruhan, kode ini menangani proses login pengguna dengan:
Melakukan validasi input
Mengirimkan permintaan ke API untuk autentikasi
Menyimpan token akses dan detail pengguna dalam penyimpanan lokal
Melakukan navigasi ke layar utama setelah login berhasil
Kode ini juga menampilkan indikator loading dan snackbar untuk memberikan umpan balik kepada pengguna.