diff --git a/lib/controller/tenant/tenant_selection_controller.dart b/lib/controller/tenant/tenant_selection_controller.dart index aa44fa8..99f180a 100644 --- a/lib/controller/tenant/tenant_selection_controller.dart +++ b/lib/controller/tenant/tenant_selection_controller.dart @@ -1,6 +1,8 @@ +import 'dart:convert'; import 'package:get/get.dart'; import 'package:marco/helpers/services/app_logger.dart'; import 'package:marco/helpers/services/tenant_service.dart'; +import 'package:marco/helpers/services/storage/local_storage.dart'; import 'package:marco/model/tenant/tenant_list_model.dart'; import 'package:marco/helpers/widgets/my_snackbar.dart'; @@ -13,18 +15,36 @@ class TenantSelectionController extends GetxController { @override void onInit() { super.onInit(); - loadTenants(); + _checkExistingTenant(); + } + + /// Check if a tenant was previously selected + Future _checkExistingTenant() async { + try { + final savedTenant = await TenantService.loadSavedTenant(); + if (savedTenant != null) { + // Tenant already selected → go to dashboard + Get.offAllNamed('/dashboard'); + } else { + // No tenant saved → load from API + await loadTenants(); + } + } catch (e, st) { + logSafe("❌ Error checking saved tenant", + level: LogLevel.error, error: e, stackTrace: st); + await loadTenants(); + } } /// Load tenants from API Future loadTenants() async { + isLoading.value = true; try { - isLoading.value = true; final data = await _tenantService.getTenants(); - if (data != null) { + if (data != null && data.isNotEmpty) { tenants.value = data.map((e) => Tenant.fromJson(e)).toList(); - // ✅ Automatically select if only one tenant + // Auto-select if only one tenant if (tenants.length == 1) { await onTenantSelected(tenants.first.id); } @@ -35,37 +55,34 @@ class TenantSelectionController extends GetxController { } catch (e, st) { logSafe("❌ Exception in loadTenants", level: LogLevel.error, error: e, stackTrace: st); + tenants.clear(); } finally { isLoading.value = false; } } - /// Select tenant + /// Handle tenant selection Future onTenantSelected(String tenantId) async { + isLoading.value = true; try { - isLoading.value = true; final success = await _tenantService.selectTenant(tenantId); if (success) { - logSafe("✅ Tenant selection successful: $tenantId"); + final tenant = tenants.firstWhere((t) => t.id == tenantId); - // Store selected tenant in memory - TenantService.setSelectedTenant( - tenants.firstWhere((t) => t.id == tenantId)); + // Save selected tenant in TenantService and LocalStorage + TenantService.setSelectedTenant(tenant); + await LocalStorage.saveString( + 'selectedTenant', jsonEncode(tenant.toJson())); - // Navigate to dashboard/home + // Navigate to dashboard Get.offAllNamed('/dashboard'); - // Optional: show success snackbar showAppSnackbar( title: "Success", message: "Organization selected successfully.", type: SnackbarType.success, ); } else { - logSafe("❌ Tenant selection failed for: $tenantId", - level: LogLevel.warning); - - // Show error snackbar showAppSnackbar( title: "Error", message: "Unable to select organization. Please try again.", @@ -76,7 +93,6 @@ class TenantSelectionController extends GetxController { logSafe("❌ Exception in onTenantSelected", level: LogLevel.error, error: e, stackTrace: st); - // Show error snackbar for exception showAppSnackbar( title: "Error", message: "An unexpected error occurred while selecting organization.", diff --git a/lib/helpers/services/tenant_service.dart b/lib/helpers/services/tenant_service.dart index 83acfc6..2a49a58 100644 --- a/lib/helpers/services/tenant_service.dart +++ b/lib/helpers/services/tenant_service.dart @@ -97,6 +97,22 @@ class TenantService implements ITenantService { } } + /// Load previously selected tenant from local storage + static Future loadSavedTenant() async { + final jsonString = LocalStorage.getString('selectedTenant'); + if (jsonString == null) return null; + + try { + final tenantMap = jsonDecode(jsonString) as Map; + final tenant = Tenant.fromJson(tenantMap); + currentTenant = tenant; + return tenant; + } catch (e) { + logSafe("❌ Failed to load saved tenant: $e", level: LogLevel.warning); + return null; + } + } + @override Future selectTenant(String tenantId, {bool hasRetried = false}) async { try { diff --git a/lib/model/tenant/tenant_list_model.dart b/lib/model/tenant/tenant_list_model.dart index 90f0967..34de63b 100644 --- a/lib/model/tenant/tenant_list_model.dart +++ b/lib/model/tenant/tenant_list_model.dart @@ -32,8 +32,9 @@ class Tenant { contactName: json['contactName'] ?? '', contactNumber: json['contactNumber'] ?? '', logoImage: json['logoImage'] is String ? json['logoImage'] : null, - organizationSize: - json['organizationSize'] is String ? json['organizationSize'] : null, + organizationSize: json['organizationSize'] is String + ? json['organizationSize'] + : null, industry: json['industry'] != null ? Industry.fromJson(json['industry']) : null, @@ -42,6 +43,21 @@ class Tenant { : null, ); } + + Map toJson() { + return { + 'id': id, + 'name': name, + 'email': email, + 'domainName': domainName, + 'contactName': contactName, + 'contactNumber': contactNumber, + 'logoImage': logoImage, + 'organizationSize': organizationSize, + 'industry': industry?.toJson(), + 'tenantStatus': tenantStatus?.toJson(), + }; + } } class Industry { @@ -59,6 +75,13 @@ class Industry { name: json['name'] ?? '', ); } + + Map toJson() { + return { + 'id': id, + 'name': name, + }; + } } class TenantStatus { @@ -76,4 +99,11 @@ class TenantStatus { name: json['name'] ?? '', ); } + + Map toJson() { + return { + 'id': id, + 'name': name, + }; + } } diff --git a/lib/view/tenant/tenant_selection_screen.dart b/lib/view/tenant/tenant_selection_screen.dart index c5ac01c..540b1d1 100644 --- a/lib/view/tenant/tenant_selection_screen.dart +++ b/lib/view/tenant/tenant_selection_screen.dart @@ -165,7 +165,7 @@ class _BetaBadge extends StatelessWidget { padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 4), decoration: BoxDecoration( color: Colors.orangeAccent, - borderRadius: BorderRadius.circular(6), + borderRadius: BorderRadius.circular(5), ), child: MyText( 'BETA', @@ -246,59 +246,56 @@ class _TenantCard extends StatelessWidget { @override Widget build(BuildContext context) { - return Card( - elevation: 3, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12), - ), - margin: const EdgeInsets.only(bottom: 20), - child: Padding( - padding: const EdgeInsets.all(16), - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ClipRRect( - borderRadius: BorderRadius.circular(8), - child: Container( - width: 60, - height: 60, - color: Colors.grey.shade200, - child: TenantLogo(logoImage: tenant.logoImage), - ), - ), - const SizedBox(width: 16), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - MyText( - tenant.name, - fontSize: 18, - fontWeight: 700, - color: Colors.black87, - ), - const SizedBox(height: 6), - MyText( - "Industry: ${tenant.industry?.name ?? "-"}", - fontSize: 13, - color: Colors.black54, - ), - ], - ), - ), - InkWell( - onTap: onTap, - child: Container( - height: 60, - alignment: Alignment.center, - child: Icon( - Icons.arrow_forward_ios, - size: 24, - color: Colors.red, + return InkWell( + onTap: onTap, + borderRadius: BorderRadius.circular(5), + child: Card( + elevation: 3, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5), + ), + margin: const EdgeInsets.only(bottom: 20), + child: Padding( + padding: const EdgeInsets.all(16), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ClipRRect( + borderRadius: BorderRadius.circular(5), + child: Container( + width: 60, + height: 60, + color: Colors.grey.shade200, + child: TenantLogo(logoImage: tenant.logoImage), ), ), - ), - ], + const SizedBox(width: 16), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + MyText( + tenant.name, + fontSize: 18, + fontWeight: 700, + color: Colors.black87, + ), + const SizedBox(height: 6), + MyText( + "Industry: ${tenant.industry?.name ?? "-"}", + fontSize: 13, + color: Colors.black54, + ), + ], + ), + ), + Icon( + Icons.arrow_forward_ios, + size: 24, + color: Colors.red, + ), + ], + ), ), ), );