diff --git a/README.md b/README.md
index 071a587..f50d993 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# On Field Work
+# OnFieldWork.com
A new Flutter project.
diff --git a/android/app/build.gradle b/android/app/build.gradle
index 23b8b74..5242a55 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -39,7 +39,7 @@ android {
// Specify your unique Application ID. This identifies your app on Google Play.
applicationId = "com.marcoonfieldwork.aiot"
// Set minimum and target SDK versions based on Flutter's configuration
- minSdk = 23
+ minSdkVersion = flutter.minSdkVersion
targetSdk = flutter.targetSdkVersion
// Set version code and name based on Flutter's configuration (from pubspec.yaml)
versionCode = flutter.versionCode
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 4a7cbdf..1ef4b05 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -8,7 +8,7 @@
CFBundleDevelopmentRegion
$(DEVELOPMENT_LANGUAGE)
CFBundleDisplayName
- On Field Work
+ OnFieldWork.com
CFBundleExecutable
$(EXECUTABLE_NAME)
CFBundleIdentifier
diff --git a/lib/app_constant.dart b/lib/app_constant.dart
index 55c95b9..0d360da 100644
--- a/lib/app_constant.dart
+++ b/lib/app_constant.dart
@@ -8,5 +8,5 @@ class AppConstant {
static int iOSAppVersion = 1;
static String version = "1.0.0";
- static String get appName => 'On Field Work';
+ static String get appName => 'OnFieldWork.com';
}
diff --git a/lib/controller/tenant/tenant_selection_controller.dart b/lib/controller/tenant/tenant_selection_controller.dart
index 3dd88a3..3ac8f84 100644
--- a/lib/controller/tenant/tenant_selection_controller.dart
+++ b/lib/controller/tenant/tenant_selection_controller.dart
@@ -7,7 +7,6 @@ import 'package:on_field_work/helpers/services/storage/local_storage.dart';
import 'package:on_field_work/controller/permission_controller.dart';
class TenantSelectionController extends GetxController {
-
// Tenant list
final tenants = [].obs;
@@ -35,6 +34,7 @@ class TenantSelectionController extends GetxController {
if (data == null || data.isEmpty) {
tenants.clear();
logSafe("⚠️ No tenants found for the user.", level: LogLevel.warning);
+ await LocalStorage.logout();
return;
}
diff --git a/lib/helpers/services/auth_service.dart b/lib/helpers/services/auth_service.dart
index 36777b9..2378032 100644
--- a/lib/helpers/services/auth_service.dart
+++ b/lib/helpers/services/auth_service.dart
@@ -124,7 +124,7 @@ class AuthService {
method: _HttpMethod.post,
body: body,
);
-
+
if (data != null && data['success'] == true && data['data'] != null) {
await LocalStorage.setJwtToken(data['data']['token']);
await LocalStorage.setRefreshToken(data['data']['refreshToken']);
@@ -181,9 +181,10 @@ class AuthService {
_wrapErrorHandling(
() async {
final employeeInfo = await LocalStorage.getEmployeeInfo();
- if (employeeInfo == null) return null; // Fails immediately if info is missing
+ if (employeeInfo == null)
+ return null; // Fails immediately if info is missing
final token = await LocalStorage.getJwtToken();
-
+
final responseData = await _networkRequest(
path: "/auth/login-mpin",
method: _HttpMethod.post,
@@ -196,7 +197,7 @@ class AuthService {
authToken: token,
);
- // Handle token updates from MPIN login success if necessary,
+ // Handle token updates from MPIN login success if necessary,
// though typically refresh or a separate login handles this.
if (responseData?['data'] != null) {
await _handleLoginSuccess(responseData!['data']);
@@ -299,11 +300,10 @@ class AuthService {
final refreshed = await refreshToken();
if (refreshed) return getTenants(hasRetried: true);
}
-
+
// Fallback on all other failures
if (data != null && data['statusCode'] != 401) {
- _handleApiError(
- data['statusCode'], data, "Fetching tenants");
+ _handleApiError(data['statusCode'], data, "Fetching tenants");
} else if (data?['statusCode'] == 401 && hasRetried) {
await _handleUnauthorized();
}
@@ -354,7 +354,7 @@ class AuthService {
if (refreshed) return selectTenant(tenantId, hasRetried: true);
await _handleUnauthorized();
}
-
+
// Fallback on all other failures
if (data != null) {
_handleApiError(data['statusCode'], data, "Selecting tenant");
@@ -385,33 +385,37 @@ class AuthService {
authToken: token,
);
- if (data != null && data['success'] == true && data['data'] is Map) {
- final responseData = data['data'] as Map;
-
- final result = {
- 'permissions': _parsePermissions(responseData['featurePermissions']),
- 'employeeInfo': await _parseEmployeeInfo(responseData['employeeInfo']),
- 'projects': _parseProjectsInfo(responseData['projects']),
- };
+ if (data != null &&
+ data['success'] == true &&
+ data['data'] is Map) {
+ final responseData = data['data'] as Map;
- _userDataCache[token] = result;
- logSafe("User data fetched and decrypted successfully.");
- return result;
+ final result = {
+ 'permissions': _parsePermissions(responseData['featurePermissions']),
+ 'employeeInfo': await _parseEmployeeInfo(responseData['employeeInfo']),
+ 'projects': _parseProjectsInfo(responseData['projects']),
+ };
+
+ _userDataCache[token] = result;
+ logSafe("User data fetched and decrypted successfully.");
+ return result;
}
-
+
// Handle 401 Unauthorized via refreshToken/retry logic
if (data?['statusCode'] == 401 && !hasRetried) {
- final refreshed = await refreshToken();
- final newToken = await LocalStorage.getJwtToken();
- if (refreshed && newToken != null) {
- return fetchAllUserData(newToken, hasRetried: true);
- }
+ final refreshed = await refreshToken();
+ final newToken = await LocalStorage.getJwtToken();
+ if (refreshed && newToken != null) {
+ return fetchAllUserData(newToken, hasRetried: true);
+ }
}
// Handle failure and unauthorized
- if (data?['statusCode'] == 401 || data?['statusCode'] == 403 || data == null) {
- await _handleUnauthorized();
- throw Exception('Unauthorized or Network Error. Token refresh failed.');
+ if (data?['statusCode'] == 401 ||
+ data?['statusCode'] == 403 ||
+ data == null) {
+ await _handleUnauthorized();
+ throw Exception('Unauthorized or Network Error. Token refresh failed.');
}
final errorMsg = data['message'] ?? 'Unknown error';
@@ -469,7 +473,6 @@ class AuthService {
logSafe("❌ $context failed: $message [Status: $statusCode]", level: level);
}
-
/// General network request handler for both GET and POST.
static Future