pd-android-app/lib/screens/authentication/controller/auth_controller.dart
2025-02-06 15:44:18 +05:30

238 lines
7.1 KiB
Dart

import 'dart:convert';
import 'package:cheminova/controller/home_controller.dart';
import 'package:cheminova/controller/home_service.dart';
import 'package:cheminova/screens/authentication/controller/auth_service.dart';
import 'package:cheminova/screens/authentication/login_screen.dart';
import 'package:cheminova/screens/home_screen.dart';
import 'package:cheminova/utils/show_snackbar.dart';
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../../../notification_service.dart';
import '../../../utils/api_urls.dart';
import '../../../utils/secure__storage_service.dart';
class AuthController extends GetxController {
final authService = AuthService();
final Dio _dio = Dio();
final _storageService = SecureStorageService();
TextEditingController emailController = TextEditingController();
TextEditingController passwordController = TextEditingController();
//TextEditingController phoneController = TextEditingController();
TextEditingController currentpassController = TextEditingController();
TextEditingController newpassController = TextEditingController();
TextEditingController confirmpassController = TextEditingController();
final HomeController _homeController = Get.put(HomeController());
RxBool isLoading = false.obs;
@override
void onInit(){
super.onInit();
// Request notification permissions on initialization
NotificationServices().requestNotificationPermission();
}
// Function to handle user login
// Future<void> login() async {
// isLoading.value = true;
// // Call the login service with email and password
// final response = await authService.login({
// 'email': emailController.text,
// 'password': passwordController.text,
// });
// isLoading.value = false;
// update();
// if (response != null) {
// _homeController.fcmToken();
// showSnackbar("Your Successfully logged In!");
//
// Get.offAll(() => const HomeScreen());
// }
// else if(response == null){
// showSnackbar("Please Enter Valid Email or Password");
// }
// }
Future<void> login() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
isLoading.value = true;
// Perform login API request
final response = await authService.login({
'email': emailController.text,
'password': passwordController.text,
});
isLoading.value = false;
update();
if (response != null && response['token'] != null) {
// Save the JWT token to SharedPreferences
String token = response['token'];
await prefs.setString('token', token);
// Fetch the FCM token and send it to the server
final fcmToken = await NotificationServices().getDeviceToken();
print('fcmToken: $fcmToken');
await HomeService().fcmToken({'fcmToken': fcmToken}, token);
showSnackbar("You successfully logged in!");
// Proceed to the HomeScreen after successful login
checkToken(); // Ensure the token is valid and the user is authenticated
Get.offAll(() => const HomeScreen());
} else {
showSnackbar("Please enter a valid email or password");
}
}
Future<void> checkToken() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
String? token = prefs.getString('token');
if (token != null) {
// Token exists, proceed with the flow (maybe fetch user data or navigate to the home screen)
print('Token found: $token');
// You can also fetch the FCM token if necessary
final fcmToken = await NotificationServices().getDeviceToken();
print('fcmToken: $fcmToken');
// Optionally send the FCM token to the server if needed
// This might be where you're getting the error
await _homeController.fcmToken();
// Navigate to HomeScreen or perform other operations
Get.offAll(() => const HomeScreen());
} else {
// No token found, redirect to login screen
Get.offAll(() => const LoginScreen());
}
}
// Function to validate the token
// Future<bool> isTokenValid(String token) async {
// try {
// final response = await authService.validateToken(token);
// return response['isValid'] ?? false; // Adjust based on your API response
// } catch (e) {
// print("Token validation failed: $e");
// return false;
// }
// }
// Future<(bool, String)> login() async {
// isLoading(true);
// try {
// Response response = (await _apiClient.post(
// ApiUrls.loginUrl,
// data: {
// 'email': emailController.text,
// 'password': passwordController.text
// },
// )) as Response;
//
// isLoading(false);
//
// // Check if the response status code is 200
// if (response.statusCode == 200) {
// // Access the data field from the response
// final responseData = jsonDecode(response.body) as Map<String, dynamic>;
// final token = responseData['token'];
// final message = responseData['message'];
//
// await _storageService.write(
// key: 'access_token',
// value: token,
// );
//
// final fcmToken = await NotificationServices().getDeviceToken();
// print('fcmToken: $fcmToken');
//
// await _apiClient.post(
// ApiUrls.fcmUrl,
// data: {'fcmToken': fcmToken},
// );
//
// return (true, message.toString());
// } else {
// // Handle the error based on status code
// final responseData = jsonDecode(response.body) as Map<String, dynamic>;
// return (false, responseData['message'].toString());
// }
// } catch (e) {
// isLoading(false);
// return (false, 'Something went wrong');
// }
// }
// Function to handle forgotten password
Future<void> forgotpass() async{
isLoading.value = true;
final response = await authService.forgotPassword(
{
'email': emailController.text,
}
);
isLoading.value = false;
update();
if(response != null){
showSnackbar("Email sent successfully");
}
}
// Function to handle password change
Future<void> changePassword() async {
isLoading.value = true;
SharedPreferences prefs = await SharedPreferences.getInstance();
String? token = prefs.getString('token');
if (token != null) {
final response = await authService.changePassword(
{
'oldPassword': currentpassController.text,
'newPassword': newpassController.text,
'confirmPassword': confirmpassController.text,
},
token: token, // Pass the token here
);
print("tokemn ,$token");
isLoading.value = false;
update();
if (response != null) {
Get.snackbar('Success', 'Password changed successfully');
} else {
Get.snackbar('Error', 'Failed to change password');
}
} else {
isLoading.value = false;
update();
Get.snackbar('Error', 'Token not found. Please login again.');
}
}
}