Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
1c79169
feat: update security and configuration guidelines, enhance API servi…
Sep 13, 2025
142675e
feat(explore): include nearby cities and keep location stable on refresh
RaviSahu1520 Sep 15, 2025
1665382
some improvement
RaviSahu1520 Sep 15, 2025
0228c20
feat(search-results): modern grid card and toolbar
RaviSahu1520 Sep 15, 2025
5f8d7dc
style(property-card): white background, #ddd border, responsive height
RaviSahu1520 Sep 15, 2025
fc25ae2
refactor(property-grid-card): dynamic height, clean image
RaviSahu1520 Sep 15, 2025
6d037c0
refactor(property-grid-card): uniform image and dynamic info
RaviSahu1520 Sep 15, 2025
5cde1ef
fix(listing-layout): reduce whitespace and optimize cards
RaviSahu1520 Sep 15, 2025
401a7f5
style(property-grid-card): white background, black border, subtle shadow
RaviSahu1520 Sep 15, 2025
8a56855
style(search-results): set white page background
RaviSahu1520 Sep 15, 2025
2e2108b
virtual tour update
RaviSahu1520 Sep 16, 2025
ebc2239
add filter option at every page
RaviSahu1520 Sep 16, 2025
608138f
done with server side filtering with pagination
RaviSahu1520 Sep 17, 2025
b36764d
booking option working .
RaviSahu1520 Sep 17, 2025
2096ba4
booking page improvement ( still not working properly )
RaviSahu1520 Sep 17, 2025
4f2991d
booking page updated successfully
RaviSahu1520 Sep 18, 2025
846766d
feat: enhance localization and settings management
Sep 18, 2025
f9dc834
Merge branch 'feat/theme-localization' into explore_page_update
Sep 18, 2025
0c9a1a2
profile page fixed
RaviSahu1520 Sep 19, 2025
ac6911d
improvements in app states
RaviSahu1520 Sep 19, 2025
d8d5eed
virtual tour optimization
RaviSahu1520 Sep 21, 2025
be722a9
fix in edit profile section
RaviSahu1520 Sep 29, 2025
462339c
enhance listing details UI and features add
RaviSahu1520 Sep 29, 2025
160a451
improvements in explore and wishlist
RaviSahu1520 Sep 30, 2025
7f2382d
redesign property card
RaviSahu1520 Sep 30, 2025
0623f69
booking page error resolve
RaviSahu1520 Oct 2, 2025
b597c2f
booking page navigation problem fixed
RaviSahu1520 Oct 2, 2025
e77189e
make property card in the locate page.
RaviSahu1520 Oct 4, 2025
6acc0ba
improve booking and wishlist pages
RaviSahu1520 Oct 16, 2025
5769e6d
fix the profile page
RaviSahu1520 Oct 17, 2025
659f2ba
fix virtual tour
RaviSahu1520 Oct 17, 2025
45cba45
fixed virtual tour for tab window.
RaviSahu1520 Oct 18, 2025
1b4c88e
change bookings page into enquiry.
RaviSahu1520 Nov 3, 2025
4fe5b03
Revert "change bookings page into enquiry."
RaviSahu1520 Nov 4, 2025
4019416
change booking page into enquiry page
RaviSahu1520 Nov 5, 2025
18f0574
more improvement at enquiry page
RaviSahu1520 Nov 5, 2025
f9fb791
apply icon and color shade .
RaviSahu1520 Nov 5, 2025
bbfbf5a
need improvement
RaviSahu1520 Nov 5, 2025
1e20457
Bookings refactored to Inquiry and other fixes.
Nov 6, 2025
b826380
improve UI of locate page
RaviSahu1520 Nov 6, 2025
d265e1b
some changes in explore page.
RaviSahu1520 Nov 6, 2025
107b920
update wishlist and listing page.
RaviSahu1520 Nov 6, 2025
0d2125d
update profile page UI
RaviSahu1520 Nov 7, 2025
cf03e6f
inquiry page updated
RaviSahu1520 Nov 7, 2025
14ff922
finalize
RaviSahu1520 Nov 7, 2025
3694c39
refactor dependency injection and improve push notification service i…
Nov 7, 2025
034c0ef
refactor authentication flow and enhance error handling with centrali…
Nov 7, 2025
3a6b2a0
add devtools options, todo list, and enhance dependency injection for…
Nov 8, 2025
6a84f1d
refactor token management to centralize persistence via TokenService,…
Nov 9, 2025
9ecabce
implement device token registration with backend in PushNotificationS…
Nov 19, 2025
794fa52
refactor authentication and profile management by implementing new co…
Dec 30, 2025
e166f8d
feat(app): refresh explore UI and session flow
RaviSahu1520 Jan 22, 2026
a817a82
feat(app): refresh theme, animations, and connectivity handling
RaviSahu1520 Jan 25, 2026
2b9444a
merge main into explore_page_update
RaviSahu1520 Jan 25, 2026
5658853
fix(services): resolve lint issues
RaviSahu1520 Jan 25, 2026
8b994b1
fix(android): align MainActivity package, ignore .claude
RaviSahu1520 Jan 25, 2026
89e59ea
chore(android): update dev flavor and desugaring
RaviSahu1520 Jan 25, 2026
c8a86c2
refactor: standardize codebase patterns and reduce duplication
Jan 25, 2026
fdff7f3
fix(auth): ensure remember-me preference ready before access
Feb 6, 2026
e3d72d8
fix(pr): resolve all PR review comments and improve code quality
RaviSahu1520 May 20, 2026
a26d3a6
fix(ci): resolve all analyzer warnings to fix CI build
RaviSahu1520 May 20, 2026
b944eeb
fix(ci): resolve remaining analyzer warnings
RaviSahu1520 May 20, 2026
ab1a201
fix(ci): resolve null safety error in locate_view.dart
RaviSahu1520 May 20, 2026
03cbc92
fix(android): add all flavor package names to google-services.json
RaviSahu1520 May 20, 2026
3181111
fix(android): resolve R8 minification and formatting issues
RaviSahu1520 May 20, 2026
aab1cbb
fix(android): add Play Core dependency to resolve R8 missing classes
RaviSahu1520 May 20, 2026
deb9437
fix(ci): add continue-on-error to PR comment step
RaviSahu1520 May 20, 2026
03166c8
fix: resolve all remaining PR review comments
RaviSahu1520 May 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 0 additions & 75 deletions .claude/settings.local.json

This file was deleted.

1 change: 1 addition & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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 }}';
Expand Down
22 changes: 14 additions & 8 deletions android/app/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -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()
Expand All @@ -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 {
Expand All @@ -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") {
Expand Down Expand Up @@ -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")
Expand All @@ -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")
}
Comment thread
coderabbitai[bot] marked this conversation as resolved.

flutter {
source = "../.."
}
57 changes: 57 additions & 0 deletions android/app/google-services.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand All @@ -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"
Expand Down
6 changes: 6 additions & 0 deletions android/app/proguard-rules.pro
Original file line number Diff line number Diff line change
Expand Up @@ -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
1 change: 1 addition & 0 deletions android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<application
android:label="360 Stays"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.example.stays_app
package com.a360ghar.stays

import io.flutter.embedding.android.FlutterActivity

Expand Down
1 change: 1 addition & 0 deletions lib/app/bindings/initial_binding.dart
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ class InitialBinding extends Bindings {
Get.put<PlacesService>(PlacesService());
Get.put<AnalyticsService>(
AnalyticsService(enabled: AppConfig.I.enableAnalytics),
permanent: true,
);

// Property cache service for offline support
Expand Down
4 changes: 1 addition & 3 deletions lib/app/controllers/favorites_controller.dart
Original file line number Diff line number Diff line change
@@ -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<int> favoriteIds = <int>{}.obs;
Expand Down
3 changes: 1 addition & 2 deletions lib/app/controllers/filter_controller.dart
Original file line number Diff line number Diff line change
@@ -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<FilterScope, Rx<UnifiedFilterModel>> _filters = {
Expand Down
67 changes: 40 additions & 27 deletions lib/app/data/models/api_response_models.dart
Original file line number Diff line number Diff line change
@@ -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,
Expand All @@ -29,28 +17,38 @@ class NotificationSettings {
this.reminders = true,
});

factory NotificationSettings.fromJson(Map<String, dynamic> json) =>
_$NotificationSettingsFromJson(json);
factory NotificationSettings.fromJson(Map<String, dynamic> 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<String, dynamic> toJson() => _$NotificationSettingsToJson(this);
Map<String, dynamic> 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,
Expand All @@ -59,8 +57,23 @@ class PrivacySettings {
this.allowMessages = true,
});

factory PrivacySettings.fromJson(Map<String, dynamic> json) =>
_$PrivacySettingsFromJson(json);
factory PrivacySettings.fromJson(Map<String, dynamic> 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<String, dynamic> toJson() => _$PrivacySettingsToJson(this);
Map<String, dynamic> toJson() => {
'profilePublic': profilePublic,
'showEmail': showEmail,
'showPhone': showPhone,
'showListings': showListings,
'showReviews': showReviews,
'allowMessages': allowMessages,
};
}
Loading
Loading