diff --git a/lib/controllers/auth_state_controller.dart b/lib/controllers/auth_state_controller.dart index bea5770d..3eda8a24 100644 --- a/lib/controllers/auth_state_controller.dart +++ b/lib/controllers/auth_state_controller.dart @@ -39,19 +39,19 @@ class AuthStateController extends GetxController { account = account ?? AppwriteService.getAccount(), databases = databases ?? AppwriteService.getDatabases(), messaging = messaging ?? FirebaseMessaging.instance; - late String? uid; - late String? profileImageID; - late String? displayName; - late String? email; - late String? profileImageUrl; - late String? userName; - late bool? isUserProfileComplete; - late bool? isEmailVerified; - late double ratingTotal; - late int ratingCount; + String? uid; + String? profileImageID; + String? displayName; + String? email; + String? profileImageUrl; + String? userName; + bool? isUserProfileComplete; + bool? isEmailVerified; + double ratingTotal = 5.0; + int ratingCount = 1; late User appwriteUser; - late List followerDocuments; - late int reportsCount; + List followerDocuments = []; + int reportsCount = 0; FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); @@ -201,23 +201,25 @@ class AuthStateController extends GetxController { isEmailVerified = appwriteUser.emailVerification; uid = appwriteUser.$id; isUserProfileComplete = - appwriteUser.prefs.data["isUserProfileComplete"] ?? false; + appwriteUser.prefs?.data?['isUserProfileComplete'] ?? false; if (isUserProfileComplete == true) { Document userDataDoc = await databases.getDocument( databaseId: userDatabaseID, collectionId: usersCollectionID, documentId: appwriteUser.$id, ); - profileImageUrl = userDataDoc.data["profileImageUrl"]; - profileImageID = userDataDoc.data["profileImageID"]; - userName = userDataDoc.data["username"] ?? "unavailable"; - ratingTotal = userDataDoc.data["ratingTotal"].toDouble() ?? 5; - ratingCount = userDataDoc.data["ratingCount"] ?? 1; + profileImageUrl = userDataDoc.data['profileImageUrl']; + profileImageID = userDataDoc.data['profileImageID']; + userName = userDataDoc.data['username'] ?? 'unavailable'; + ratingTotal = userDataDoc.data['ratingTotal'] is num + ? (userDataDoc.data['ratingTotal'] as num).toDouble() + : 5.0; + ratingCount = userDataDoc.data['ratingCount'] ?? 1; followerDocuments = - (userDataDoc.data["followers"] as List?)?.map((e) { - return FollowerUserModel.fromJson(e); - }).toList() ?? - []; + (userDataDoc.data['followers'] as List?)?.map((e) { + return FollowerUserModel.fromJson(e); + }).toList() ?? + []; reportsCount = (userDataDoc.data['userReports'] as List?)?.length ?? 0; } @@ -266,11 +268,19 @@ class AuthStateController extends GetxController { Future login(String email, String password) async { await account.createEmailPasswordSession(email: email, password: password); await isUserLoggedIn(); - await addRegistrationTokentoSubscribedandCreatedUpcomingRooms(); + try { + await addRegistrationTokentoSubscribedandCreatedUpcomingRooms(); + } catch (e, stack) { + log('Failed to update FCM tokens after login: $e\n$stack'); + } } Future addRegistrationTokentoSubscribedandCreatedUpcomingRooms() async { final fcmToken = await messaging.getToken(); + if (fcmToken == null || fcmToken.isEmpty) { + log('FCM token unavailable. Skipping token registration updates.'); + return; + } //subscribed Upcoming Rooms List subscribedUpcomingRooms = await databases @@ -285,7 +295,7 @@ class AuthStateController extends GetxController { for (var subscription in subscribedUpcomingRooms) { List registrationTokens = subscription.data['registrationTokens']; - registrationTokens.add(fcmToken!); + registrationTokens.add(fcmToken); databases.updateDocument( databaseId: upcomingRoomsDatabaseId, collectionId: subscribedUserCollectionId, @@ -306,7 +316,7 @@ class AuthStateController extends GetxController { .then((value) => value.documents); for (var upcomingRoom in createdUpcomingRooms) { List creatorFcmTokens = upcomingRoom.data['creator_fcm_tokens']; - creatorFcmTokens.add(fcmToken!); + creatorFcmTokens.add(fcmToken); databases.updateDocument( databaseId: upcomingRoomsDatabaseId, collectionId: upcomingRoomsCollectionId, @@ -318,6 +328,10 @@ class AuthStateController extends GetxController { Future removeRegistrationTokenFromSubscribedUpcomingRooms() async { final fcmToken = await messaging.getToken(); + if (fcmToken == null || fcmToken.isEmpty) { + log('FCM token unavailable. Skipping token removal updates.'); + return; + } //subscribed Upcoming Rooms List subscribedUpcomingRooms = await databases @@ -332,7 +346,7 @@ class AuthStateController extends GetxController { for (var subscription in subscribedUpcomingRooms) { List registrationTokens = subscription.data['registrationTokens']; - registrationTokens.remove(fcmToken!); + registrationTokens.remove(fcmToken); databases.updateDocument( databaseId: upcomingRoomsDatabaseId, collectionId: subscribedUserCollectionId, @@ -353,7 +367,7 @@ class AuthStateController extends GetxController { .then((value) => value.documents); for (var upcomingRoom in createdUpcomingRooms) { List creatorFcmTokens = upcomingRoom.data['creator_fcm_tokens']; - creatorFcmTokens.remove(fcmToken!); + creatorFcmTokens.remove(fcmToken); databases.updateDocument( databaseId: upcomingRoomsDatabaseId, collectionId: upcomingRoomsCollectionId, diff --git a/lib/routes/app_pages.dart b/lib/routes/app_pages.dart index 1ec72175..1369f620 100644 --- a/lib/routes/app_pages.dart +++ b/lib/routes/app_pages.dart @@ -84,11 +84,6 @@ class AppPages { page: () => const ResetPasswordScreen(), binding: ProfileBinding(), ), - GetPage( - name: AppRoutes.resetPassword, - page: () => const ResetPasswordScreen(), - binding: ProfileBinding(), - ), GetPage( name: AppRoutes.tabview, page: () => TabViewScreen(), @@ -116,7 +111,6 @@ class AppPages { GetPage(name: AppRoutes.changeEmail, page: () => ChangeEmailScreen()), GetPage(name: AppRoutes.welcomeScreen, page: () => WelcomeScreen()), // New Screens - GetPage(name: AppRoutes.loginScreen, page: () => const LoginScreen()), GetPage(name: AppRoutes.homeScreen, page: () => const HomeScreen()), GetPage(name: AppRoutes.themeScreen, page: () => ThemeScreen()), GetPage( diff --git a/lib/services/appwrite_service.dart b/lib/services/appwrite_service.dart index a61be164..61cea358 100644 --- a/lib/services/appwrite_service.dart +++ b/lib/services/appwrite_service.dart @@ -21,6 +21,7 @@ class AppwriteService { } static Account getAccount() { + _client ??= getClient(); _account ??= Account(_client!); return _account!; } diff --git a/lib/views/screens/splash_screen.dart b/lib/views/screens/splash_screen.dart index 9c1731a3..cac255ab 100644 --- a/lib/views/screens/splash_screen.dart +++ b/lib/views/screens/splash_screen.dart @@ -55,26 +55,20 @@ class _SplashScreenState extends State Timer(const Duration(milliseconds: 3000), () async { final result = await Get.find().checkForUpdate( onIgnore: () { - authController.isUserLoggedIn(); - Get.offNamed(AppRoutes.landing); return true; }, onLater: () { - authController.isUserLoggedIn(); - Get.offNamed(AppRoutes.landing); return true; }, onUpdate: () { - authController.isUserLoggedIn(); - Get.offNamed(AppRoutes.landing); return true; }, isManualCheck: false, ); + await authController.isUserLoggedIn(); if (result == UpdateCheckResult.noUpdateAvailable || result == UpdateCheckResult.checkFailed) { - authController.isUserLoggedIn(); - Get.offNamed(AppRoutes.landing); + return; } }); }