marco.pms.mobileapp/lib/controller/tenant/tenant_selection_controller.dart

106 lines
3.1 KiB
Dart

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';
class TenantSelectionController extends GetxController {
final TenantService _tenantService = TenantService();
var tenants = <Tenant>[].obs;
var isLoading = false.obs;
@override
void onInit() {
super.onInit();
_checkExistingTenant();
}
/// Check if a tenant was previously selected
Future<void> _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<void> loadTenants() async {
isLoading.value = true;
try {
final data = await _tenantService.getTenants();
if (data != null && data.isNotEmpty) {
tenants.value = data.map((e) => Tenant.fromJson(e)).toList();
// Auto-select if only one tenant
if (tenants.length == 1) {
await onTenantSelected(tenants.first.id);
}
} else {
tenants.clear();
logSafe("⚠️ No tenants found for the user.", level: LogLevel.warning);
}
} catch (e, st) {
logSafe("❌ Exception in loadTenants",
level: LogLevel.error, error: e, stackTrace: st);
tenants.clear();
} finally {
isLoading.value = false;
}
}
/// Handle tenant selection
Future<void> onTenantSelected(String tenantId) async {
isLoading.value = true;
try {
final success = await _tenantService.selectTenant(tenantId);
if (success) {
final tenant = 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
Get.offAllNamed('/dashboard');
showAppSnackbar(
title: "Success",
message: "Organization selected successfully.",
type: SnackbarType.success,
);
} else {
showAppSnackbar(
title: "Error",
message: "Unable to select organization. Please try again.",
type: SnackbarType.error,
);
}
} catch (e, st) {
logSafe("❌ Exception in onTenantSelected",
level: LogLevel.error, error: e, stackTrace: st);
showAppSnackbar(
title: "Error",
message: "An unexpected error occurred while selecting organization.",
type: SnackbarType.error,
);
} finally {
isLoading.value = false;
}
}
}