Fix residence list not refreshing after add/edit on iOS and Android
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 <noreply@anthropic.com>
This commit is contained in:
@@ -353,7 +353,10 @@ fun App(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
composable<ResidencesRoute> {
|
composable<ResidencesRoute> { backStackEntry ->
|
||||||
|
// Get refresh flag from saved state (set when returning from add/edit)
|
||||||
|
val shouldRefresh = backStackEntry.savedStateHandle.get<Boolean>("refresh") ?: false
|
||||||
|
|
||||||
ResidencesScreen(
|
ResidencesScreen(
|
||||||
onResidenceClick = { residenceId ->
|
onResidenceClick = { residenceId ->
|
||||||
navController.navigate(ResidenceDetailRoute(residenceId))
|
navController.navigate(ResidenceDetailRoute(residenceId))
|
||||||
@@ -364,6 +367,7 @@ fun App(
|
|||||||
onNavigateToProfile = {
|
onNavigateToProfile = {
|
||||||
navController.navigate(ProfileRoute)
|
navController.navigate(ProfileRoute)
|
||||||
},
|
},
|
||||||
|
shouldRefresh = shouldRefresh,
|
||||||
onLogout = {
|
onLogout = {
|
||||||
// Clear token and lookups on logout
|
// Clear token and lookups on logout
|
||||||
TokenStorage.clearToken()
|
TokenStorage.clearToken()
|
||||||
@@ -383,6 +387,8 @@ fun App(
|
|||||||
navController.popBackStack()
|
navController.popBackStack()
|
||||||
},
|
},
|
||||||
onResidenceCreated = {
|
onResidenceCreated = {
|
||||||
|
// Set refresh flag before navigating back
|
||||||
|
navController.previousBackStackEntry?.savedStateHandle?.set("refresh", true)
|
||||||
navController.popBackStack()
|
navController.popBackStack()
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@@ -419,6 +425,8 @@ fun App(
|
|||||||
navController.popBackStack()
|
navController.popBackStack()
|
||||||
},
|
},
|
||||||
onResidenceUpdated = {
|
onResidenceUpdated = {
|
||||||
|
// Set refresh flag before navigating back
|
||||||
|
navController.previousBackStackEntry?.savedStateHandle?.set("refresh", true)
|
||||||
navController.popBackStack()
|
navController.popBackStack()
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ fun ResidencesScreen(
|
|||||||
onAddResidence: () -> Unit,
|
onAddResidence: () -> Unit,
|
||||||
onLogout: () -> Unit,
|
onLogout: () -> Unit,
|
||||||
onNavigateToProfile: () -> Unit = {},
|
onNavigateToProfile: () -> Unit = {},
|
||||||
|
shouldRefresh: Boolean = false,
|
||||||
viewModel: ResidenceViewModel = viewModel { ResidenceViewModel() }
|
viewModel: ResidenceViewModel = viewModel { ResidenceViewModel() }
|
||||||
) {
|
) {
|
||||||
val myResidencesState by viewModel.myResidencesState.collectAsState()
|
val myResidencesState by viewModel.myResidencesState.collectAsState()
|
||||||
@@ -44,6 +45,13 @@ fun ResidencesScreen(
|
|||||||
viewModel.loadMyResidences()
|
viewModel.loadMyResidences()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Refresh when shouldRefresh flag changes
|
||||||
|
LaunchedEffect(shouldRefresh) {
|
||||||
|
if (shouldRefresh) {
|
||||||
|
viewModel.loadMyResidences(forceRefresh = true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Handle refresh state
|
// Handle refresh state
|
||||||
LaunchedEffect(myResidencesState) {
|
LaunchedEffect(myResidencesState) {
|
||||||
if (myResidencesState !is ApiResult.Loading) {
|
if (myResidencesState !is ApiResult.Loading) {
|
||||||
|
|||||||
@@ -3,9 +3,14 @@ import ComposeApp
|
|||||||
|
|
||||||
struct AddResidenceView: View {
|
struct AddResidenceView: View {
|
||||||
@Binding var isPresented: Bool
|
@Binding var isPresented: Bool
|
||||||
|
var onResidenceCreated: (() -> Void)?
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
ResidenceFormView(existingResidence: nil, isPresented: $isPresented)
|
ResidenceFormView(
|
||||||
|
existingResidence: nil,
|
||||||
|
isPresented: $isPresented,
|
||||||
|
onSuccess: onResidenceCreated
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -86,7 +86,12 @@ struct ResidencesListView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
.sheet(isPresented: $showingAddResidence) {
|
.sheet(isPresented: $showingAddResidence) {
|
||||||
AddResidenceView(isPresented: $showingAddResidence)
|
AddResidenceView(
|
||||||
|
isPresented: $showingAddResidence,
|
||||||
|
onResidenceCreated: {
|
||||||
|
viewModel.loadMyResidences(forceRefresh: true)
|
||||||
|
}
|
||||||
|
)
|
||||||
}
|
}
|
||||||
.sheet(isPresented: $showingJoinResidence) {
|
.sheet(isPresented: $showingJoinResidence) {
|
||||||
JoinResidenceView(onJoined: {
|
JoinResidenceView(onJoined: {
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import ComposeApp
|
|||||||
struct ResidenceFormView: View {
|
struct ResidenceFormView: View {
|
||||||
let existingResidence: Residence?
|
let existingResidence: Residence?
|
||||||
@Binding var isPresented: Bool
|
@Binding var isPresented: Bool
|
||||||
|
var onSuccess: (() -> Void)?
|
||||||
@StateObject private var viewModel = ResidenceViewModel()
|
@StateObject private var viewModel = ResidenceViewModel()
|
||||||
@FocusState private var focusedField: Field?
|
@FocusState private var focusedField: Field?
|
||||||
|
|
||||||
@@ -301,6 +302,7 @@ struct ResidenceFormView: View {
|
|||||||
// Edit mode
|
// Edit mode
|
||||||
viewModel.updateResidence(id: residence.id, request: request) { success in
|
viewModel.updateResidence(id: residence.id, request: request) { success in
|
||||||
if success {
|
if success {
|
||||||
|
onSuccess?()
|
||||||
isPresented = false
|
isPresented = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -308,6 +310,7 @@ struct ResidenceFormView: View {
|
|||||||
// Add mode
|
// Add mode
|
||||||
viewModel.createResidence(request: request) { success in
|
viewModel.createResidence(request: request) { success in
|
||||||
if success {
|
if success {
|
||||||
|
onSuccess?()
|
||||||
isPresented = false
|
isPresented = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user