From 52afefc17e4ad5ef970e7e179d051af5a258ed3f Mon Sep 17 00:00:00 2001 From: Trey t Date: Mon, 17 Nov 2025 09:38:31 -0800 Subject: [PATCH] Fix residence list not refreshing after add/edit on iOS and Android MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixed issue where adding or editing a residence didn't update the residence list, requiring manual refresh to see changes. iOS Changes: - ResidencesListView: Added onResidenceCreated callback to AddResidenceView sheet that triggers loadMyResidences(forceRefresh: true) - AddResidenceView: Added onResidenceCreated callback parameter - ResidenceFormView: Added onSuccess callback that fires before dismissing in both create and update modes Android Changes: - ResidencesScreen: Added shouldRefresh parameter with LaunchedEffect that watches for changes and reloads residences when flag is true - App.kt (ResidencesRoute): Read "refresh" flag from saved state handle - App.kt (AddResidenceRoute): Set "refresh" flag in previous back stack entry before navigating back on residence created - App.kt (EditResidenceRoute): Set "refresh" flag before navigating back on residence updated Both platforms now properly refresh the residence list when: - A new residence is added - An existing residence is edited - User joins a residence with code (already working) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../src/commonMain/kotlin/com/example/mycrib/App.kt | 10 +++++++++- .../com/example/mycrib/ui/screens/ResidencesScreen.kt | 8 ++++++++ iosApp/iosApp/AddResidenceView.swift | 7 ++++++- iosApp/iosApp/Residence/ResidencesListView.swift | 7 ++++++- iosApp/iosApp/ResidenceFormView.swift | 3 +++ 5 files changed, 32 insertions(+), 3 deletions(-) diff --git a/composeApp/src/commonMain/kotlin/com/example/mycrib/App.kt b/composeApp/src/commonMain/kotlin/com/example/mycrib/App.kt index 01bd58c..97c46ab 100644 --- a/composeApp/src/commonMain/kotlin/com/example/mycrib/App.kt +++ b/composeApp/src/commonMain/kotlin/com/example/mycrib/App.kt @@ -353,7 +353,10 @@ fun App( ) } - composable { + composable { backStackEntry -> + // Get refresh flag from saved state (set when returning from add/edit) + val shouldRefresh = backStackEntry.savedStateHandle.get("refresh") ?: false + ResidencesScreen( onResidenceClick = { residenceId -> navController.navigate(ResidenceDetailRoute(residenceId)) @@ -364,6 +367,7 @@ fun App( onNavigateToProfile = { navController.navigate(ProfileRoute) }, + shouldRefresh = shouldRefresh, onLogout = { // Clear token and lookups on logout TokenStorage.clearToken() @@ -383,6 +387,8 @@ fun App( navController.popBackStack() }, onResidenceCreated = { + // Set refresh flag before navigating back + navController.previousBackStackEntry?.savedStateHandle?.set("refresh", true) navController.popBackStack() } ) @@ -419,6 +425,8 @@ fun App( navController.popBackStack() }, onResidenceUpdated = { + // Set refresh flag before navigating back + navController.previousBackStackEntry?.savedStateHandle?.set("refresh", true) navController.popBackStack() } ) diff --git a/composeApp/src/commonMain/kotlin/com/example/mycrib/ui/screens/ResidencesScreen.kt b/composeApp/src/commonMain/kotlin/com/example/mycrib/ui/screens/ResidencesScreen.kt index 87ce7ff..f79a435 100644 --- a/composeApp/src/commonMain/kotlin/com/example/mycrib/ui/screens/ResidencesScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/example/mycrib/ui/screens/ResidencesScreen.kt @@ -34,6 +34,7 @@ fun ResidencesScreen( onAddResidence: () -> Unit, onLogout: () -> Unit, onNavigateToProfile: () -> Unit = {}, + shouldRefresh: Boolean = false, viewModel: ResidenceViewModel = viewModel { ResidenceViewModel() } ) { val myResidencesState by viewModel.myResidencesState.collectAsState() @@ -44,6 +45,13 @@ fun ResidencesScreen( viewModel.loadMyResidences() } + // Refresh when shouldRefresh flag changes + LaunchedEffect(shouldRefresh) { + if (shouldRefresh) { + viewModel.loadMyResidences(forceRefresh = true) + } + } + // Handle refresh state LaunchedEffect(myResidencesState) { if (myResidencesState !is ApiResult.Loading) { diff --git a/iosApp/iosApp/AddResidenceView.swift b/iosApp/iosApp/AddResidenceView.swift index ee09cf4..5fd642f 100644 --- a/iosApp/iosApp/AddResidenceView.swift +++ b/iosApp/iosApp/AddResidenceView.swift @@ -3,9 +3,14 @@ import ComposeApp struct AddResidenceView: View { @Binding var isPresented: Bool + var onResidenceCreated: (() -> Void)? var body: some View { - ResidenceFormView(existingResidence: nil, isPresented: $isPresented) + ResidenceFormView( + existingResidence: nil, + isPresented: $isPresented, + onSuccess: onResidenceCreated + ) } } diff --git a/iosApp/iosApp/Residence/ResidencesListView.swift b/iosApp/iosApp/Residence/ResidencesListView.swift index dad6a7b..d980e60 100644 --- a/iosApp/iosApp/Residence/ResidencesListView.swift +++ b/iosApp/iosApp/Residence/ResidencesListView.swift @@ -86,7 +86,12 @@ struct ResidencesListView: View { } } .sheet(isPresented: $showingAddResidence) { - AddResidenceView(isPresented: $showingAddResidence) + AddResidenceView( + isPresented: $showingAddResidence, + onResidenceCreated: { + viewModel.loadMyResidences(forceRefresh: true) + } + ) } .sheet(isPresented: $showingJoinResidence) { JoinResidenceView(onJoined: { diff --git a/iosApp/iosApp/ResidenceFormView.swift b/iosApp/iosApp/ResidenceFormView.swift index fa67465..1dd614f 100644 --- a/iosApp/iosApp/ResidenceFormView.swift +++ b/iosApp/iosApp/ResidenceFormView.swift @@ -4,6 +4,7 @@ import ComposeApp struct ResidenceFormView: View { let existingResidence: Residence? @Binding var isPresented: Bool + var onSuccess: (() -> Void)? @StateObject private var viewModel = ResidenceViewModel() @FocusState private var focusedField: Field? @@ -301,6 +302,7 @@ struct ResidenceFormView: View { // Edit mode viewModel.updateResidence(id: residence.id, request: request) { success in if success { + onSuccess?() isPresented = false } } @@ -308,6 +310,7 @@ struct ResidenceFormView: View { // Add mode viewModel.createResidence(request: request) { success in if success { + onSuccess?() isPresented = false } }