TKK_E32230859/lib/app/modules/login/controllers/login_controller.dart

179 lines
5.2 KiB
Dart

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
class LoginController extends GetxController {
final usernameController = TextEditingController();
final passwordController = TextEditingController();
final isPasswordHidden = true.obs;
final isLoading = false.obs;
final FirebaseAuth _auth = FirebaseAuth.instance;
final FirebaseFirestore _firestore = FirebaseFirestore.instance;
void togglePasswordVisibility() {
isPasswordHidden.value = !isPasswordHidden.value;
}
void login() async {
if (usernameController.text.isEmpty || passwordController.text.isEmpty) {
Get.snackbar(
'Error',
'Email dan password harus diisi',
backgroundColor: Colors.red[100],
colorText: Colors.red[900],
snackPosition: SnackPosition.TOP,
);
return;
}
if (!GetUtils.isEmail(usernameController.text)) {
Get.snackbar(
'Error',
'Format email tidak valid',
backgroundColor: Colors.red[100],
colorText: Colors.red[900],
snackPosition: SnackPosition.TOP,
);
return;
}
try {
isLoading.value = true;
UserCredential userCredential = await _auth.signInWithEmailAndPassword(
email: usernameController.text.trim(),
password: passwordController.text.trim(),
);
if (userCredential.user != null) {
final userDoc = await _firestore
.collection('users')
.doc(userCredential.user!.uid)
.get();
if (userDoc.exists) {
final userData = userDoc.data()!;
final deviceId = userData['device_id'] as String?;
final userName = userData['name'] as String? ?? 'User';
if (deviceId != null && deviceId.isNotEmpty) {
Get.snackbar(
'Berhasil',
'Selamat datang, $userName!',
backgroundColor: Colors.green[100],
colorText: Colors.green[900],
snackPosition: SnackPosition.TOP,
);
Get.offAllNamed(
'/home-patient',
arguments: {
'deviceId': deviceId,
'userName': userName,
'userEmail': usernameController.text.trim(),
},
);
} else {
Get.snackbar(
'Error',
'Akun Anda belum terdaftar dengan device',
backgroundColor: Colors.orange[100],
colorText: Colors.orange[900],
snackPosition: SnackPosition.TOP,
);
await _auth.signOut();
}
} else {
Get.snackbar(
'Berhasil',
'Login berhasil! Selamat datang, Perawat',
backgroundColor: Colors.green[100],
colorText: Colors.green[900],
snackPosition: SnackPosition.TOP,
);
Get.offAllNamed('/navbar');
}
}
} on FirebaseAuthException catch (e) {
String errorMessage = '';
switch (e.code) {
case 'user-not-found':
errorMessage = 'Email tidak terdaftar';
break;
case 'wrong-password':
errorMessage = 'Password salah';
break;
case 'invalid-email':
errorMessage = 'Format email tidak valid';
break;
case 'user-disabled':
errorMessage = 'Akun telah dinonaktifkan';
break;
case 'too-many-requests':
errorMessage = 'Terlalu banyak percobaan login. Coba lagi nanti';
break;
case 'network-request-failed':
errorMessage = 'Tidak ada koneksi internet';
break;
default:
errorMessage = 'Terjadi kesalahan: ${e.message}';
}
Get.snackbar(
'Login Gagal',
errorMessage,
backgroundColor: Colors.red[100],
colorText: Colors.red[900],
snackPosition: SnackPosition.TOP,
duration: const Duration(seconds: 3),
);
} catch (e) {
Get.snackbar(
'Error',
'Terjadi kesalahan: $e',
backgroundColor: Colors.red[100],
colorText: Colors.red[900],
snackPosition: SnackPosition.TOP,
);
} finally {
isLoading.value = false;
}
}
void contactNurse() async {
const phoneNumber = '6281231901277';
final message = Uri.encodeComponent(
'Halo, saya wali pasien dari (Nama Pasien) '
'Saya ingin meminta akun untuk login ke aplikasi Smart Infus.',
);
// Construct the WhatsApp URL with the message
final url = Uri.parse('https://wa.me/$phoneNumber?text=$message');
// Attempt to launch WhatsApp
if (await canLaunchUrl(url)) {
await launchUrl(url, mode: LaunchMode.externalApplication);
} else {
// Show an error if WhatsApp can't be opened
Get.snackbar(
'Error',
'Tidak dapat membuka WhatsApp',
backgroundColor: Colors.red[100],
colorText: Colors.red[900],
);
}
}
@override
void onClose() {
usernameController.dispose();
passwordController.dispose();
super.onClose();
}
}