diff --git a/.claude/settings.local.json b/.claude/settings.local.json
deleted file mode 100644
index 0d17aca..0000000
--- a/.claude/settings.local.json
+++ /dev/null
@@ -1,75 +0,0 @@
-{
- "permissions": {
- "allow": [
- "Bash(flutter analyze:*)",
- "Bash(find:*)",
- "Bash(flutter pub:*)",
- "Bash(flutter packages pub run build_runner build:*)",
- "Bash(flutter run:*)",
- "Bash(flutter build:*)",
- "Read(/C:\\Users\\ravi7\\OneDrive\\Documents\\GitHub\\stays-app\\lib\\app\\ui\\widgets\\cards/**)",
- "Read(/C:\\Users\\ravi7\\OneDrive\\Documents\\GitHub\\stays-app\\lib\\app\\ui\\views\\home/**)",
- "Read(/C:\\Users\\ravi7\\OneDrive\\Documents\\GitHub\\stays-app\\lib\\app\\ui\\views/**)",
- "Read(/C:\\Users\\ravi7\\OneDrive\\Documents\\GitHub\\stays-app\\lib\\app\\controllers/**)",
- "Read(/C:\\Users\\ravi7\\OneDrive\\Documents\\GitHub\\stays-app\\lib\\app\\ui\\views\\home/**)",
- "Read(/C:\\Users\\ravi7\\OneDrive\\Documents\\GitHub\\stays-app\\lib\\app\\ui\\views\\home/**)",
- "Read(/C:\\Users\\ravi7\\OneDrive\\Documents\\GitHub\\stays-app\\lib\\app\\bindings/**)",
- "Read(/C:\\Users\\ravi7\\OneDrive\\Documents\\GitHub\\stays-app\\android\\app\\src\\main/**)",
- "Read(/C:\\Users\\ravi7\\OneDrive\\Documents\\GitHub\\stays-app\\lib\\app\\bindings/**)",
- "Read(/C:\\Users\\ravi7\\OneDrive\\Documents\\GitHub\\stays-app\\lib\\app\\controllers/**)",
- "Read(/C:\\Users\\ravi7\\OneDrive\\Documents\\GitHub\\stays-app\\lib\\app\\routes/**)",
- "Read(/C:\\Users\\ravi7\\OneDrive\\Documents\\GitHub\\stays-app\\lib\\app\\middlewares/**)",
- "Read(/C:\\Users\\ravi7\\OneDrive\\Documents\\GitHub\\stays-app\\lib\\app\\ui\\views\\home/**)",
- "Read(/C:\\Users\\ravi7\\OneDrive\\Documents\\GitHub\\stays-app\\lib\\app\\ui\\views\\home/**)",
- "Read(/C:\\Users\\ravi7\\OneDrive\\Documents\\GitHub\\stays-app\\lib\\app\\ui\\views\\profile/**)",
- "Read(/C:\\Users\\ravi7\\OneDrive\\Documents\\GitHub\\stays-app\\lib\\app\\controllers\\auth/**)",
- "Read(/C:\\Users\\ravi7\\OneDrive\\Documents\\GitHub\\stays-app\\lib\\app\\bindings/**)",
- "Read(/C:\\Users\\ravi7\\OneDrive\\Documents\\GitHub\\stays-app\\lib\\app\\bindings/**)",
- "Read(/C:\\Users\\ravi7\\OneDrive\\Documents\\GitHub\\stays-app\\lib\\app\\ui\\views\\profile/**)",
- "Read(/C:\\Users\\ravi7\\OneDrive\\Documents\\GitHub\\stays-app\\lib\\app\\ui\\views\\home/**)",
- "Read(/C:\\Users\\ravi7\\OneDrive\\Documents\\GitHub\\stays-app\\lib\\app\\ui\\views/**)",
- "Read(/C:\\Users\\ravi7\\OneDrive\\Documents\\GitHub\\stays-app\\lib\\app\\ui\\views\\profile/**)",
- "Read(/C:\\Users\\ravi7\\OneDrive\\Documents\\GitHub\\stays-app\\lib\\app\\bindings/**)",
- "Read(/C:\\Users\\ravi7\\OneDrive\\Documents\\GitHub\\stays-app\\lib\\app\\controllers\\auth/**)",
- "Read(/C:\\Users\\ravi7\\OneDrive\\Documents\\GitHub\\stays-app\\lib\\app\\controllers\\auth/**)",
- "Read(/C:\\Users\\ravi7\\OneDrive\\Documents\\GitHub\\stays-app\\lib\\app\\bindings/**)",
- "Read(/C:\\Users\\ravi7\\OneDrive\\Documents\\GitHub\\stays-app\\lib\\app\\routes/**)",
- "Read(/C:\\Users\\ravi7\\OneDrive\\Documents\\GitHub\\stays-app\\lib\\app\\middlewares/**)",
- "Read(/C:\\Users\\ravi7\\OneDrive\\Documents\\GitHub\\stays-app\\lib\\app\\ui\\views\\home/**)",
- "Read(/C:\\Users\\ravi7\\OneDrive\\Documents\\GitHub\\stays-app\\lib\\app\\controllers/**)",
- "Read(/C:\\Users\\ravi7\\OneDrive\\Documents\\GitHub\\stays-app\\lib\\app\\ui\\views\\home/**)",
- "Read(/C:\\Users\\ravi7\\OneDrive\\Documents\\GitHub\\stays-app\\lib\\app\\ui\\views\\home/**)",
- "Read(/C:\\Users\\ravi7\\OneDrive\\Documents\\GitHub\\stays-app\\lib\\app\\ui\\views\\home/**)",
- "Read(/C:\\Users\\ravi7\\OneDrive\\Documents\\GitHub\\stays-app\\lib\\app\\routes/**)",
- "Read(/C:\\Users\\ravi7\\OneDrive\\Documents\\GitHub\\stays-app\\lib\\app\\routes/**)",
- "Read(/C:\\Users\\ravi7\\OneDrive\\Documents\\GitHub\\stays-app\\lib\\app\\ui\\views\\home/**)",
- "Read(/C:\\Users\\ravi7\\OneDrive\\Documents\\GitHub\\stays-app\\lib\\app\\ui\\views\\home/**)",
- "Read(/C:\\Users\\ravi7\\OneDrive\\Documents\\GitHub\\stays-app\\lib\\app\\ui\\views\\home/**)",
- "Read(/C:\\Users\\ravi7\\OneDrive\\Documents\\GitHub\\stays-app\\lib\\app\\bindings/**)",
- "Read(/C:\\Users\\ravi7\\OneDrive\\Documents\\GitHub\\stays-app\\lib\\app\\ui\\views\\home/**)",
- "Read(/C:\\Users\\ravi7\\OneDrive\\Documents\\GitHub\\stays-app\\lib\\app\\ui\\views\\home/**)",
- "Read(/C:\\Users\\ravi7\\OneDrive\\Documents\\GitHub\\stays-app\\lib\\app\\ui\\views\\home/**)",
- "Read(/C:\\Users\\ravi7\\OneDrive\\Documents\\GitHub\\stays-app\\lib\\app\\ui\\views\\home/**)",
- "Bash(flutter clean:*)",
- "Bash(curl:*)",
- "Bash(printf \"R\")",
- "Bash(flutter test:*)"
- ],
- "deny": [],
- "ask": []
- },
- "hooks": {
- "PreToolUse": [
- {
- "matcher": "WebSearch",
- "hooks": [
- {
- "type": "command",
- "command": "python3 -c \"import json, sys, re; from datetime import datetime; input_data = json.load(sys.stdin); tool_name = input_data.get('tool_name', ''); tool_input = input_data.get('tool_input', {}); query = tool_input.get('query', ''); current_year = datetime.now().year; year_pattern = r'\\\\b(20\\\\d{2})\\\\b'; years_found = re.findall(year_pattern, query); outdated_years = [year for year in years_found if int(year) < current_year]; output = {'hookSpecificOutput': {'hookEventName': 'PreToolUse', 'additionalContext': f'Current date: {datetime.now().strftime(\\\"%Y-%m-%d\\\")}. The current year is {current_year}. If searching for recent information, consider using {current_year} instead of older years.'}} if outdated_years else None; print(json.dumps(output) if output else ''); sys.exit(0)\"",
- "timeout": 5
- }
- ]
- }
- ]
- }
-}
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index d10a772..34d8af3 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -189,6 +189,7 @@ jobs:
- name: Comment on PR with build status
if: github.event_name == 'pull_request'
uses: actions/github-script@v7
+ continue-on-error: true
with:
script: |
const artifactName = '${{ steps.artifact-name.outputs.name }}';
diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts
index f5e2db3..ac55b77 100644
--- a/android/app/build.gradle.kts
+++ b/android/app/build.gradle.kts
@@ -1,17 +1,17 @@
+import java.io.FileInputStream
+import java.util.Properties
+
plugins {
id("com.android.application")
id("kotlin-android")
// The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
id("dev.flutter.flutter-gradle-plugin")
- // Apply Google Services plugin here (only once, not at bottom)
+ // Google Services plugin
id("com.google.gms.google-services")
// Firebase Crashlytics
id("com.google.firebase.crashlytics")
}
-import java.util.Properties
-import java.io.FileInputStream
-
// Load key.properties for release signing
val keystorePropertiesFile = rootProject.file("key.properties")
val keystoreProperties = Properties()
@@ -22,11 +22,12 @@ if (keystorePropertiesFile.exists()) {
android {
namespace = "com.a360ghar.stays"
compileSdk = flutter.compileSdkVersion
- ndkVersion = flutter.ndkVersion
+ ndkVersion = "28.2.13676358"
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
+ isCoreLibraryDesugaringEnabled = true
}
kotlinOptions {
@@ -52,13 +53,13 @@ android {
versionName = flutter.versionName
}
- // 🔹 Flavor setup
+ // Flavor setup
flavorDimensions += listOf("env")
productFlavors {
create("dev") {
dimension = "env"
- applicationIdSuffix = ".dev"
+ applicationId = "com.example.stays_app.dev"
resValue("string", "app_name", "360ghar stays (Dev)")
}
create("staging") {
@@ -93,7 +94,7 @@ android {
}
}
- // 🔹 Automatically pick correct google-services.json based on flavor
+ // Automatically pick correct google-services.json based on flavor
sourceSets {
getByName("dev") {
res.srcDirs("src/dev/res")
@@ -113,6 +114,11 @@ android {
}
}
+dependencies {
+ coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.5")
+ implementation("com.google.android.play:core:1.10.3")
+}
+
flutter {
source = "../.."
}
diff --git a/android/app/google-services.json b/android/app/google-services.json
index f2319c9..a6bc9bc 100644
--- a/android/app/google-services.json
+++ b/android/app/google-services.json
@@ -5,6 +5,25 @@
"storage_bucket": "stays-app-52ca6.firebasestorage.app"
},
"client": [
+ {
+ "client_info": {
+ "mobilesdk_app_id": "1:866676409773:android:e7434edd703cfea8e14d24",
+ "android_client_info": {
+ "package_name": "com.a360ghar.stays"
+ }
+ },
+ "oauth_client": [],
+ "api_key": [
+ {
+ "current_key": "AIzaSyBcOC2oanpFWvLmIqlsKxNm81LSnyKieeQ"
+ }
+ ],
+ "services": {
+ "appinvite_service": {
+ "other_platform_oauth_client": []
+ }
+ }
+ },
{
"client_info": {
"mobilesdk_app_id": "1:866676409773:android:e7434edd703cfea8e14d24",
@@ -23,6 +42,44 @@
"other_platform_oauth_client": []
}
}
+ },
+ {
+ "client_info": {
+ "mobilesdk_app_id": "1:866676409773:android:e7434edd703cfea8e14d24",
+ "android_client_info": {
+ "package_name": "com.example.stays_app.dev"
+ }
+ },
+ "oauth_client": [],
+ "api_key": [
+ {
+ "current_key": "AIzaSyBcOC2oanpFWvLmIqlsKxNm81LSnyKieeQ"
+ }
+ ],
+ "services": {
+ "appinvite_service": {
+ "other_platform_oauth_client": []
+ }
+ }
+ },
+ {
+ "client_info": {
+ "mobilesdk_app_id": "1:866676409773:android:e7434edd703cfea8e14d24",
+ "android_client_info": {
+ "package_name": "com.a360ghar.stays.staging"
+ }
+ },
+ "oauth_client": [],
+ "api_key": [
+ {
+ "current_key": "AIzaSyBcOC2oanpFWvLmIqlsKxNm81LSnyKieeQ"
+ }
+ ],
+ "services": {
+ "appinvite_service": {
+ "other_platform_oauth_client": []
+ }
+ }
}
],
"configuration_version": "1"
diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro
index 494875f..b3bbfed 100644
--- a/android/app/proguard-rules.pro
+++ b/android/app/proguard-rules.pro
@@ -58,3 +58,9 @@
# Keep secure storage
-keep class com.it_nomads.fluttersecurestorage.** { *; }
+
+# Play Core / SplitCompat (not always included but referenced by Flutter embedding)
+-dontwarn com.google.android.play.core.splitcompat.SplitCompatApplication
+-dontwarn com.google.android.play.core.tasks.OnFailureListener
+-dontwarn com.google.android.play.core.splitinstall.SplitInstallStateUpdatedListener
+-dontwarn com.google.android.play.core.listener.StateUpdatedListener
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 0d2cfad..96e841d 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -2,6 +2,7 @@
+
(PlacesService());
Get.put(
AnalyticsService(enabled: AppConfig.I.enableAnalytics),
+ permanent: true,
);
// Property cache service for offline support
diff --git a/lib/app/controllers/favorites_controller.dart b/lib/app/controllers/favorites_controller.dart
index 92f747e..6ca6e58 100644
--- a/lib/app/controllers/favorites_controller.dart
+++ b/lib/app/controllers/favorites_controller.dart
@@ -1,8 +1,6 @@
import 'package:get/get.dart';
-import 'package:stays_app/app/controllers/base/base_controller.dart';
-
-class FavoritesController extends BaseController {
+class FavoritesController extends GetxController {
FavoritesController();
final RxSet favoriteIds = {}.obs;
diff --git a/lib/app/controllers/filter_controller.dart b/lib/app/controllers/filter_controller.dart
index 8959238..4af7bd0 100644
--- a/lib/app/controllers/filter_controller.dart
+++ b/lib/app/controllers/filter_controller.dart
@@ -1,13 +1,12 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
-import 'package:stays_app/app/controllers/base/base_controller.dart';
import '../data/models/unified_filter_model.dart';
import '../ui/widgets/filters/property_filter_sheet.dart';
enum FilterScope { explore, wishlist, booking, locate }
-class FilterController extends BaseController {
+class FilterController extends GetxController {
FilterController();
final Map> _filters = {
diff --git a/lib/app/data/models/api_response_models.dart b/lib/app/data/models/api_response_models.dart
index 43f9f03..d1945bd 100644
--- a/lib/app/data/models/api_response_models.dart
+++ b/lib/app/data/models/api_response_models.dart
@@ -1,25 +1,13 @@
-import 'package:json_annotation/json_annotation.dart';
-
-part 'api_response_models.g.dart';
-
-@JsonSerializable()
class NotificationSettings {
- @JsonKey(defaultValue: true)
final bool pushEnabled;
- @JsonKey(defaultValue: true)
final bool emailEnabled;
- @JsonKey(defaultValue: false)
final bool smsEnabled;
- @JsonKey(defaultValue: true)
final bool bookingUpdates;
- @JsonKey(defaultValue: false)
final bool promotions;
- @JsonKey(defaultValue: true)
final bool messages;
- @JsonKey(defaultValue: true)
final bool reminders;
- const NotificationSettings({
+ NotificationSettings({
this.pushEnabled = true,
this.emailEnabled = true,
this.smsEnabled = false,
@@ -29,28 +17,38 @@ class NotificationSettings {
this.reminders = true,
});
- factory NotificationSettings.fromJson(Map json) =>
- _$NotificationSettingsFromJson(json);
+ factory NotificationSettings.fromJson(Map json) {
+ return NotificationSettings(
+ pushEnabled: json['pushEnabled'] ?? true,
+ emailEnabled: json['emailEnabled'] ?? true,
+ smsEnabled: json['smsEnabled'] ?? false,
+ bookingUpdates: json['bookingUpdates'] ?? true,
+ promotions: json['promotions'] ?? false,
+ messages: json['messages'] ?? true,
+ reminders: json['reminders'] ?? true,
+ );
+ }
- Map toJson() => _$NotificationSettingsToJson(this);
+ Map toJson() => {
+ 'pushEnabled': pushEnabled,
+ 'emailEnabled': emailEnabled,
+ 'smsEnabled': smsEnabled,
+ 'bookingUpdates': bookingUpdates,
+ 'promotions': promotions,
+ 'messages': messages,
+ 'reminders': reminders,
+ };
}
-@JsonSerializable()
class PrivacySettings {
- @JsonKey(defaultValue: true)
final bool profilePublic;
- @JsonKey(defaultValue: false)
final bool showEmail;
- @JsonKey(defaultValue: false)
final bool showPhone;
- @JsonKey(defaultValue: true)
final bool showListings;
- @JsonKey(defaultValue: true)
final bool showReviews;
- @JsonKey(defaultValue: true)
final bool allowMessages;
- const PrivacySettings({
+ PrivacySettings({
this.profilePublic = true,
this.showEmail = false,
this.showPhone = false,
@@ -59,8 +57,23 @@ class PrivacySettings {
this.allowMessages = true,
});
- factory PrivacySettings.fromJson(Map json) =>
- _$PrivacySettingsFromJson(json);
+ factory PrivacySettings.fromJson(Map json) {
+ return PrivacySettings(
+ profilePublic: json['profilePublic'] ?? true,
+ showEmail: json['showEmail'] ?? false,
+ showPhone: json['showPhone'] ?? false,
+ showListings: json['showListings'] ?? true,
+ showReviews: json['showReviews'] ?? true,
+ allowMessages: json['allowMessages'] ?? true,
+ );
+ }
- Map toJson() => _$PrivacySettingsToJson(this);
+ Map toJson() => {
+ 'profilePublic': profilePublic,
+ 'showEmail': showEmail,
+ 'showPhone': showPhone,
+ 'showListings': showListings,
+ 'showReviews': showReviews,
+ 'allowMessages': allowMessages,
+ };
}
diff --git a/lib/app/data/models/api_response_models.g.dart b/lib/app/data/models/api_response_models.g.dart
deleted file mode 100644
index fffcd8b..0000000
--- a/lib/app/data/models/api_response_models.g.dart
+++ /dev/null
@@ -1,51 +0,0 @@
-// GENERATED CODE - DO NOT MODIFY BY HAND
-
-part of 'api_response_models.dart';
-
-// **************************************************************************
-// JsonSerializableGenerator
-// **************************************************************************
-
-NotificationSettings _$NotificationSettingsFromJson(
- Map json,
-) => NotificationSettings(
- pushEnabled: json['pushEnabled'] as bool? ?? true,
- emailEnabled: json['emailEnabled'] as bool? ?? true,
- smsEnabled: json['smsEnabled'] as bool? ?? false,
- bookingUpdates: json['bookingUpdates'] as bool? ?? true,
- promotions: json['promotions'] as bool? ?? false,
- messages: json['messages'] as bool? ?? true,
- reminders: json['reminders'] as bool? ?? true,
-);
-
-Map _$NotificationSettingsToJson(
- NotificationSettings instance,
-) => {
- 'pushEnabled': instance.pushEnabled,
- 'emailEnabled': instance.emailEnabled,
- 'smsEnabled': instance.smsEnabled,
- 'bookingUpdates': instance.bookingUpdates,
- 'promotions': instance.promotions,
- 'messages': instance.messages,
- 'reminders': instance.reminders,
-};
-
-PrivacySettings _$PrivacySettingsFromJson(Map json) =>
- PrivacySettings(
- profilePublic: json['profilePublic'] as bool? ?? true,
- showEmail: json['showEmail'] as bool? ?? false,
- showPhone: json['showPhone'] as bool? ?? false,
- showListings: json['showListings'] as bool? ?? true,
- showReviews: json['showReviews'] as bool? ?? true,
- allowMessages: json['allowMessages'] as bool? ?? true,
- );
-
-Map _$PrivacySettingsToJson(PrivacySettings instance) =>
- {
- 'profilePublic': instance.profilePublic,
- 'showEmail': instance.showEmail,
- 'showPhone': instance.showPhone,
- 'showListings': instance.showListings,
- 'showReviews': instance.showReviews,
- 'allowMessages': instance.allowMessages,
- };
diff --git a/lib/app/data/models/booking_model.dart b/lib/app/data/models/booking_model.dart
index fb28b58..1cc0def 100644
--- a/lib/app/data/models/booking_model.dart
+++ b/lib/app/data/models/booking_model.dart
@@ -1,43 +1,25 @@
-import 'package:json_annotation/json_annotation.dart';
import 'package:stays_app/app/data/models/property_model.dart';
-part 'booking_model.g.dart';
-
-@JsonSerializable(createFactory: false)
class Booking {
final int id;
- @JsonKey(name: 'property_id')
final int propertyId;
- @JsonKey(name: 'user_id')
final int userId;
- @JsonKey(name: 'booking_reference')
final String bookingReference;
- @JsonKey(name: 'check_in_date')
final DateTime checkInDate;
- @JsonKey(name: 'check_out_date')
final DateTime checkOutDate;
final int guests;
final int nights;
- @JsonKey(name: 'total_amount')
final double totalAmount;
- @JsonKey(name: 'booking_status')
final String bookingStatus;
- @JsonKey(name: 'payment_status')
final String paymentStatus;
- @JsonKey(name: 'created_at')
final DateTime createdAt;
- @JsonKey(includeToJson: false)
final Property? property;
- @JsonKey(name: 'property_title')
final String? propertyTitle;
- @JsonKey(name: 'property_city')
final String? propertyCity;
- @JsonKey(name: 'property_country')
final String? propertyCountry;
- @JsonKey(name: 'property_image_url')
final String? propertyImageUrl;
- const Booking({
+ Booking({
required this.id,
required this.propertyId,
required this.userId,
@@ -57,7 +39,6 @@ class Booking {
this.propertyImageUrl,
});
- // Custom fromJson to handle complex API response variations
factory Booking.fromJson(Map json) {
final checkIn = json['check_in_date'] != null
? DateTime.parse(json['check_in_date'] as String)
@@ -140,17 +121,28 @@ class Booking {
return (city ?? country) ?? '';
}
- Map toJson() {
- final result = _$BookingToJson(this);
- if (property != null) {
- result['property'] = property!.toJson();
- }
- return result;
+ Map toMap() {
+ return {
+ 'id': id,
+ 'property_id': propertyId,
+ 'user_id': userId,
+ 'booking_reference': bookingReference,
+ 'check_in_date': checkInDate.toIso8601String(),
+ 'check_out_date': checkOutDate.toIso8601String(),
+ 'guests': guests,
+ 'nights': nights,
+ 'total_amount': totalAmount,
+ 'booking_status': bookingStatus,
+ 'payment_status': paymentStatus,
+ 'created_at': createdAt.toIso8601String(),
+ 'property_title': propertyTitle,
+ 'property_city': propertyCity,
+ 'property_country': propertyCountry,
+ 'property_image_url': propertyImageUrl,
+ if (property != null) 'property': property!.toJson(),
+ };
}
- // Backwards compatibility
- Map toMap() => toJson();
-
static Property? _safePropertyFromJson(Map value) {
try {
final mapped = value.map((key, val) => MapEntry(key.toString(), val));
diff --git a/lib/app/data/models/booking_model.g.dart b/lib/app/data/models/booking_model.g.dart
deleted file mode 100644
index a0db074..0000000
--- a/lib/app/data/models/booking_model.g.dart
+++ /dev/null
@@ -1,29 +0,0 @@
-// GENERATED CODE - DO NOT MODIFY BY HAND
-
-part of 'booking_model.dart';
-
-// **************************************************************************
-// JsonSerializableGenerator
-// **************************************************************************
-
-Map _$BookingToJson(Booking instance) => {
- 'id': instance.id,
- 'property_id': instance.propertyId,
- 'user_id': instance.userId,
- 'booking_reference': instance.bookingReference,
- 'check_in_date': instance.checkInDate.toIso8601String(),
- 'check_out_date': instance.checkOutDate.toIso8601String(),
- 'guests': instance.guests,
- 'nights': instance.nights,
- 'total_amount': instance.totalAmount,
- 'booking_status': instance.bookingStatus,
- 'payment_status': instance.paymentStatus,
- 'created_at': instance.createdAt.toIso8601String(),
- 'property_title': instance.propertyTitle,
- 'property_city': instance.propertyCity,
- 'property_country': instance.propertyCountry,
- 'property_image_url': instance.propertyImageUrl,
- 'displayTitle': instance.displayTitle,
- 'displayImage': instance.displayImage,
- 'displayLocation': instance.displayLocation,
-};
diff --git a/lib/app/data/models/booking_pricing_model.dart b/lib/app/data/models/booking_pricing_model.dart
index 98b87ee..82c5b61 100644
--- a/lib/app/data/models/booking_pricing_model.dart
+++ b/lib/app/data/models/booking_pricing_model.dart
@@ -1,18 +1,8 @@
-import 'package:json_annotation/json_annotation.dart';
-
-part 'booking_pricing_model.g.dart';
-
-@JsonSerializable()
class BookingPricingModel {
- @JsonKey(name: 'base_amount', fromJson: _numToDouble)
final double baseAmount;
- @JsonKey(name: 'taxes_amount', fromJson: _numToDouble)
final double taxesAmount;
- @JsonKey(name: 'service_charges', fromJson: _numToDouble)
final double serviceCharges;
- @JsonKey(name: 'discount_amount', fromJson: _optionalDouble)
final double? discountAmount;
- @JsonKey(name: 'total_amount', fromJson: _numToDouble)
final double totalAmount;
final int? nights;
@@ -25,14 +15,16 @@ class BookingPricingModel {
this.nights,
});
- factory BookingPricingModel.fromJson(Map json) =>
- _$BookingPricingModelFromJson(json);
-
- Map toJson() => _$BookingPricingModelToJson(this);
-
- // Backwards compatibility
- factory BookingPricingModel.fromMap(Map map) =>
- BookingPricingModel.fromJson(map);
+ factory BookingPricingModel.fromMap(Map map) {
+ return BookingPricingModel(
+ baseAmount: _numToDouble(map['base_amount']),
+ taxesAmount: _numToDouble(map['taxes_amount']),
+ serviceCharges: _numToDouble(map['service_charges']),
+ discountAmount: _optionalDouble(map['discount_amount']),
+ totalAmount: _numToDouble(map['total_amount']),
+ nights: _optionalInt(map['nights']),
+ );
+ }
static double _numToDouble(dynamic value) {
if (value is num) return value.toDouble();
@@ -49,4 +41,12 @@ class BookingPricingModel {
if (value is String) return double.tryParse(value);
return null;
}
+
+ static int? _optionalInt(dynamic value) {
+ if (value == null) return null;
+ if (value is int) return value;
+ if (value is num) return value.toInt();
+ if (value is String) return int.tryParse(value);
+ return null;
+ }
}
diff --git a/lib/app/data/models/booking_pricing_model.g.dart b/lib/app/data/models/booking_pricing_model.g.dart
deleted file mode 100644
index 0978143..0000000
--- a/lib/app/data/models/booking_pricing_model.g.dart
+++ /dev/null
@@ -1,30 +0,0 @@
-// GENERATED CODE - DO NOT MODIFY BY HAND
-
-part of 'booking_pricing_model.dart';
-
-// **************************************************************************
-// JsonSerializableGenerator
-// **************************************************************************
-
-BookingPricingModel _$BookingPricingModelFromJson(Map json) =>
- BookingPricingModel(
- baseAmount: BookingPricingModel._numToDouble(json['base_amount']),
- taxesAmount: BookingPricingModel._numToDouble(json['taxes_amount']),
- serviceCharges: BookingPricingModel._numToDouble(json['service_charges']),
- totalAmount: BookingPricingModel._numToDouble(json['total_amount']),
- discountAmount: BookingPricingModel._optionalDouble(
- json['discount_amount'],
- ),
- nights: (json['nights'] as num?)?.toInt(),
- );
-
-Map _$BookingPricingModelToJson(
- BookingPricingModel instance,
-) => {
- 'base_amount': instance.baseAmount,
- 'taxes_amount': instance.taxesAmount,
- 'service_charges': instance.serviceCharges,
- 'discount_amount': instance.discountAmount,
- 'total_amount': instance.totalAmount,
- 'nights': instance.nights,
-};
diff --git a/lib/app/data/models/location_model.dart b/lib/app/data/models/location_model.dart
index 975bebc..4d1d7f8 100644
--- a/lib/app/data/models/location_model.dart
+++ b/lib/app/data/models/location_model.dart
@@ -1,14 +1,7 @@
-import 'package:json_annotation/json_annotation.dart';
-
-part 'location_model.g.dart';
-
-@JsonSerializable()
class LocationModel {
final String city;
final String country;
- @JsonKey(defaultValue: 0.0)
final double lat;
- @JsonKey(defaultValue: 0.0)
final double lng;
const LocationModel({
@@ -18,14 +11,17 @@ class LocationModel {
required this.lng,
});
- factory LocationModel.fromJson(Map json) =>
- _$LocationModelFromJson(json);
-
- Map toJson() => _$LocationModelToJson(this);
-
- // Backwards compatibility
- factory LocationModel.fromMap(Map map) =>
- LocationModel.fromJson(map);
+ factory LocationModel.fromMap(Map map) => LocationModel(
+ city: map['city'] as String? ?? '',
+ country: map['country'] as String? ?? '',
+ lat: (map['lat'] as num?)?.toDouble() ?? 0,
+ lng: (map['lng'] as num?)?.toDouble() ?? 0,
+ );
- Map toMap() => toJson();
+ Map toMap() => {
+ 'city': city,
+ 'country': country,
+ 'lat': lat,
+ 'lng': lng,
+ };
}
diff --git a/lib/app/data/models/location_model.g.dart b/lib/app/data/models/location_model.g.dart
deleted file mode 100644
index 4b98f39..0000000
--- a/lib/app/data/models/location_model.g.dart
+++ /dev/null
@@ -1,23 +0,0 @@
-// GENERATED CODE - DO NOT MODIFY BY HAND
-
-part of 'location_model.dart';
-
-// **************************************************************************
-// JsonSerializableGenerator
-// **************************************************************************
-
-LocationModel _$LocationModelFromJson(Map json) =>
- LocationModel(
- city: json['city'] as String,
- country: json['country'] as String,
- lat: (json['lat'] as num?)?.toDouble() ?? 0.0,
- lng: (json['lng'] as num?)?.toDouble() ?? 0.0,
- );
-
-Map _$LocationModelToJson(LocationModel instance) =>
- {
- 'city': instance.city,
- 'country': instance.country,
- 'lat': instance.lat,
- 'lng': instance.lng,
- };
diff --git a/lib/app/data/models/message_model.dart b/lib/app/data/models/message_model.dart
index a9e2b48..ea81500 100644
--- a/lib/app/data/models/message_model.dart
+++ b/lib/app/data/models/message_model.dart
@@ -1,8 +1,5 @@
-import 'package:json_annotation/json_annotation.dart';
+import '../../utils/logger/app_logger.dart';
-part 'message_model.g.dart';
-
-@JsonSerializable()
class MessageModel {
final String id;
final String conversationId;
@@ -18,14 +15,30 @@ class MessageModel {
required this.createdAt,
});
- factory MessageModel.fromJson(Map json) =>
- _$MessageModelFromJson(json);
-
- Map toJson() => _$MessageModelToJson(this);
+ factory MessageModel.fromMap(Map map) => MessageModel(
+ id: map['id']?.toString() ?? '',
+ conversationId: map['conversationId']?.toString() ?? '',
+ senderId: map['senderId']?.toString() ?? '',
+ content: map['content'] as String? ?? '',
+ createdAt: _parseCreatedAt(map['createdAt'] as String?),
+ );
- // Backwards compatibility
- factory MessageModel.fromMap(Map map) =>
- MessageModel.fromJson(map);
+ Map toMap() => {
+ 'id': id,
+ 'conversationId': conversationId,
+ 'senderId': senderId,
+ 'content': content,
+ 'createdAt': createdAt.toIso8601String(),
+ };
- Map toMap() => toJson();
+ static DateTime _parseCreatedAt(String? raw) {
+ if (raw != null && raw.isNotEmpty) {
+ final parsed = DateTime.tryParse(raw);
+ if (parsed != null) return parsed;
+ }
+ AppLogger.warning(
+ 'MessageModel: invalid or missing createdAt, falling back to DateTime.now()',
+ );
+ return DateTime.now();
+ }
}
diff --git a/lib/app/data/models/message_model.g.dart b/lib/app/data/models/message_model.g.dart
deleted file mode 100644
index 9962be9..0000000
--- a/lib/app/data/models/message_model.g.dart
+++ /dev/null
@@ -1,24 +0,0 @@
-// GENERATED CODE - DO NOT MODIFY BY HAND
-
-part of 'message_model.dart';
-
-// **************************************************************************
-// JsonSerializableGenerator
-// **************************************************************************
-
-MessageModel _$MessageModelFromJson(Map json) => MessageModel(
- id: json['id'] as String,
- conversationId: json['conversationId'] as String,
- senderId: json['senderId'] as String,
- content: json['content'] as String,
- createdAt: DateTime.parse(json['createdAt'] as String),
-);
-
-Map _$MessageModelToJson(MessageModel instance) =>
- {
- 'id': instance.id,
- 'conversationId': instance.conversationId,
- 'senderId': instance.senderId,
- 'content': instance.content,
- 'createdAt': instance.createdAt.toIso8601String(),
- };
diff --git a/lib/app/data/models/notification_model.dart b/lib/app/data/models/notification_model.dart
index d3cabb1..87377d0 100644
--- a/lib/app/data/models/notification_model.dart
+++ b/lib/app/data/models/notification_model.dart
@@ -1,8 +1,3 @@
-import 'package:json_annotation/json_annotation.dart';
-
-part 'notification_model.g.dart';
-
-@JsonSerializable()
class NotificationModel {
final String id;
final String title;
@@ -16,14 +11,20 @@ class NotificationModel {
required this.createdAt,
});
- factory NotificationModel.fromJson(Map json) =>
- _$NotificationModelFromJson(json);
-
- Map toJson() => _$NotificationModelToJson(this);
-
- // Backwards compatibility
factory NotificationModel.fromMap(Map map) =>
- NotificationModel.fromJson(map);
+ NotificationModel(
+ id: map['id']?.toString() ?? '',
+ title: map['title'] as String? ?? '',
+ body: map['body'] as String? ?? '',
+ createdAt:
+ DateTime.tryParse(map['createdAt'] as String? ?? '') ??
+ DateTime.now(),
+ );
- Map toMap() => toJson();
+ Map toMap() => {
+ 'id': id,
+ 'title': title,
+ 'body': body,
+ 'createdAt': createdAt.toIso8601String(),
+ };
}
diff --git a/lib/app/data/models/notification_model.g.dart b/lib/app/data/models/notification_model.g.dart
deleted file mode 100644
index 50be3aa..0000000
--- a/lib/app/data/models/notification_model.g.dart
+++ /dev/null
@@ -1,23 +0,0 @@
-// GENERATED CODE - DO NOT MODIFY BY HAND
-
-part of 'notification_model.dart';
-
-// **************************************************************************
-// JsonSerializableGenerator
-// **************************************************************************
-
-NotificationModel _$NotificationModelFromJson(Map json) =>
- NotificationModel(
- id: json['id'] as String,
- title: json['title'] as String,
- body: json['body'] as String,
- createdAt: DateTime.parse(json['createdAt'] as String),
- );
-
-Map _$NotificationModelToJson(NotificationModel instance) =>
- {
- 'id': instance.id,
- 'title': instance.title,
- 'body': instance.body,
- 'createdAt': instance.createdAt.toIso8601String(),
- };
diff --git a/lib/app/data/models/payment_model.dart b/lib/app/data/models/payment_model.dart
index 1d8704d..63fe0c5 100644
--- a/lib/app/data/models/payment_model.dart
+++ b/lib/app/data/models/payment_model.dart
@@ -1,14 +1,7 @@
-import 'package:json_annotation/json_annotation.dart';
-
-part 'payment_model.g.dart';
-
-@JsonSerializable()
class PaymentModel {
final String id;
final num amount;
- @JsonKey(defaultValue: 'USD')
final String currency;
- @JsonKey(defaultValue: 'pending')
final String status;
const PaymentModel({
@@ -18,14 +11,17 @@ class PaymentModel {
this.status = 'pending',
});
- factory PaymentModel.fromJson(Map json) =>
- _$PaymentModelFromJson(json);
-
- Map toJson() => _$PaymentModelToJson(this);
-
- // Backwards compatibility
- factory PaymentModel.fromMap(Map map) =>
- PaymentModel.fromJson(map);
+ factory PaymentModel.fromMap(Map map) => PaymentModel(
+ id: map['id']?.toString() ?? '',
+ amount: map['amount'] as num? ?? 0,
+ currency: map['currency'] as String? ?? 'USD',
+ status: map['status'] as String? ?? 'pending',
+ );
- Map toMap() => toJson();
+ Map toMap() => {
+ 'id': id,
+ 'amount': amount,
+ 'currency': currency,
+ 'status': status,
+ };
}
diff --git a/lib/app/data/models/payment_model.g.dart b/lib/app/data/models/payment_model.g.dart
deleted file mode 100644
index 5f82170..0000000
--- a/lib/app/data/models/payment_model.g.dart
+++ /dev/null
@@ -1,22 +0,0 @@
-// GENERATED CODE - DO NOT MODIFY BY HAND
-
-part of 'payment_model.dart';
-
-// **************************************************************************
-// JsonSerializableGenerator
-// **************************************************************************
-
-PaymentModel _$PaymentModelFromJson(Map json) => PaymentModel(
- id: json['id'] as String,
- amount: json['amount'] as num,
- currency: json['currency'] as String? ?? 'USD',
- status: json['status'] as String? ?? 'pending',
-);
-
-Map _$PaymentModelToJson(PaymentModel instance) =>
- {
- 'id': instance.id,
- 'amount': instance.amount,
- 'currency': instance.currency,
- 'status': instance.status,
- };
diff --git a/lib/app/data/models/review_model.dart b/lib/app/data/models/review_model.dart
index ccabb3c..96332c8 100644
--- a/lib/app/data/models/review_model.dart
+++ b/lib/app/data/models/review_model.dart
@@ -1,14 +1,7 @@
-import 'package:json_annotation/json_annotation.dart';
-
-part 'review_model.g.dart';
-
-@JsonSerializable()
class ReviewModel {
final String id;
final String bookingId;
- @JsonKey(defaultValue: 5)
final int rating;
- @JsonKey(defaultValue: '')
final String comment;
const ReviewModel({
@@ -18,14 +11,17 @@ class ReviewModel {
required this.comment,
});
- factory ReviewModel.fromJson(Map json) =>
- _$ReviewModelFromJson(json);
-
- Map toJson() => _$ReviewModelToJson(this);
-
- // Backwards compatibility
- factory ReviewModel.fromMap(Map map) =>
- ReviewModel.fromJson(map);
+ factory ReviewModel.fromMap(Map map) => ReviewModel(
+ id: map['id']?.toString() ?? '',
+ bookingId: map['bookingId']?.toString() ?? '',
+ rating: map['rating'] as int? ?? 5,
+ comment: map['comment'] as String? ?? '',
+ );
- Map toMap() => toJson();
+ Map toMap() => {
+ 'id': id,
+ 'bookingId': bookingId,
+ 'rating': rating,
+ 'comment': comment,
+ };
}
diff --git a/lib/app/data/models/review_model.g.dart b/lib/app/data/models/review_model.g.dart
deleted file mode 100644
index 87d3c56..0000000
--- a/lib/app/data/models/review_model.g.dart
+++ /dev/null
@@ -1,22 +0,0 @@
-// GENERATED CODE - DO NOT MODIFY BY HAND
-
-part of 'review_model.dart';
-
-// **************************************************************************
-// JsonSerializableGenerator
-// **************************************************************************
-
-ReviewModel _$ReviewModelFromJson(Map json) => ReviewModel(
- id: json['id'] as String,
- bookingId: json['bookingId'] as String,
- rating: (json['rating'] as num?)?.toInt() ?? 5,
- comment: json['comment'] as String? ?? '',
-);
-
-Map _$ReviewModelToJson(ReviewModel instance) =>
- {
- 'id': instance.id,
- 'bookingId': instance.bookingId,
- 'rating': instance.rating,
- 'comment': instance.comment,
- };
diff --git a/lib/app/data/models/trip_model.dart b/lib/app/data/models/trip_model.dart
index 8eef291..7ec78b5 100644
--- a/lib/app/data/models/trip_model.dart
+++ b/lib/app/data/models/trip_model.dart
@@ -1,20 +1,14 @@
-import 'package:json_annotation/json_annotation.dart';
-
-part 'trip_model.g.dart';
-
-@JsonSerializable()
class TripModel {
final String id;
final String propertyName;
final DateTime checkIn;
final DateTime checkOut;
- @JsonKey(defaultValue: 'pending')
final String status;
final String? propertyImage;
final double? totalCost;
final String? hostName;
- const TripModel({
+ TripModel({
required this.id,
required this.propertyName,
required this.checkIn,
@@ -25,14 +19,25 @@ class TripModel {
this.hostName,
});
- factory TripModel.fromJson(Map json) =>
- _$TripModelFromJson(json);
-
- Map toJson() => _$TripModelToJson(this);
-
- // Backwards compatibility
- factory TripModel.fromMap(Map map) =>
- TripModel.fromJson(map);
+ factory TripModel.fromMap(Map map) => TripModel(
+ id: map['id']?.toString() ?? '',
+ propertyName: map['propertyName'] as String? ?? '',
+ checkIn: DateTime.parse(map['checkIn'] as String),
+ checkOut: DateTime.parse(map['checkOut'] as String),
+ status: map['status'] as String? ?? 'pending',
+ propertyImage: map['propertyImage'] as String?,
+ totalCost: (map['totalCost'] as num?)?.toDouble(),
+ hostName: map['hostName'] as String?,
+ );
- Map toMap() => toJson();
+ Map toMap() => {
+ 'id': id,
+ 'propertyName': propertyName,
+ 'checkIn': checkIn.toIso8601String(),
+ 'checkOut': checkOut.toIso8601String(),
+ 'status': status,
+ 'propertyImage': propertyImage,
+ 'totalCost': totalCost,
+ 'hostName': hostName,
+ };
}
diff --git a/lib/app/data/models/trip_model.g.dart b/lib/app/data/models/trip_model.g.dart
deleted file mode 100644
index a64154e..0000000
--- a/lib/app/data/models/trip_model.g.dart
+++ /dev/null
@@ -1,29 +0,0 @@
-// GENERATED CODE - DO NOT MODIFY BY HAND
-
-part of 'trip_model.dart';
-
-// **************************************************************************
-// JsonSerializableGenerator
-// **************************************************************************
-
-TripModel _$TripModelFromJson(Map json) => TripModel(
- id: json['id'] as String,
- propertyName: json['propertyName'] as String,
- checkIn: DateTime.parse(json['checkIn'] as String),
- checkOut: DateTime.parse(json['checkOut'] as String),
- status: json['status'] as String? ?? 'pending',
- propertyImage: json['propertyImage'] as String?,
- totalCost: (json['totalCost'] as num?)?.toDouble(),
- hostName: json['hostName'] as String?,
-);
-
-Map _$TripModelToJson(TripModel instance) => {
- 'id': instance.id,
- 'propertyName': instance.propertyName,
- 'checkIn': instance.checkIn.toIso8601String(),
- 'checkOut': instance.checkOut.toIso8601String(),
- 'status': instance.status,
- 'propertyImage': instance.propertyImage,
- 'totalCost': instance.totalCost,
- 'hostName': instance.hostName,
-};
diff --git a/lib/app/data/models/unified_property_response.dart b/lib/app/data/models/unified_property_response.dart
index 70d9ade..c9518e0 100644
--- a/lib/app/data/models/unified_property_response.dart
+++ b/lib/app/data/models/unified_property_response.dart
@@ -1,26 +1,17 @@
-import 'package:json_annotation/json_annotation.dart';
import 'property_model.dart';
-part 'unified_property_response.g.dart';
-
-@JsonSerializable(createToJson: true)
class UnifiedPropertyResponse {
- @JsonKey(fromJson: _propertiesFromJson)
final List properties;
- @JsonKey(readValue: _readTotalCount)
final int totalCount;
- @JsonKey(readValue: _readCurrentPage)
final int currentPage;
- @JsonKey(readValue: _readTotalPages)
final int totalPages;
- @JsonKey(readValue: _readPageSize)
final int pageSize;
final Map? filters;
bool get hasNextPage => currentPage < totalPages;
bool get hasPreviousPage => currentPage > 1;
- const UnifiedPropertyResponse({
+ UnifiedPropertyResponse({
required this.properties,
required this.totalCount,
required this.currentPage,
@@ -29,30 +20,33 @@ class UnifiedPropertyResponse {
this.filters,
});
- factory UnifiedPropertyResponse.fromJson(Map json) =>
- _$UnifiedPropertyResponseFromJson(json);
-
- Map toJson() => _$UnifiedPropertyResponseToJson(this);
-
- static List _propertiesFromJson(dynamic value) {
- if (value is List) {
- return value
- .whereType