179 lines
5.2 KiB
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();
|
|
}
|
|
}
|