Fix error alert infinite loop in ClubsView and ChallengesView (FRE-4664)

- Replace unused lastError state with alertIsPresented boolean
- OK button now clears viewModel.error to prevent re-trigger
- Add onChange observer to show alert when error becomes non-nil
- Applies to both ClubsView.swift and ChallengesView.swift

Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
2026-05-10 10:42:40 -04:00
parent 9b14011dfa
commit d74f65b9d5
2 changed files with 22 additions and 6 deletions

View File

@@ -4,7 +4,7 @@ struct ChallengesView: View {
@StateObject private var viewModel = ChallengeViewModel() @StateObject private var viewModel = ChallengeViewModel()
@State private var showingCreateSheet = false @State private var showingCreateSheet = false
@State private var selectedTab: ChallengeTab = .active @State private var selectedTab: ChallengeTab = .active
@State private var lastError: ChallengeError? @State private var alertIsPresented = false
enum ChallengeTab: String, CaseIterable { enum ChallengeTab: String, CaseIterable {
case active, upcoming, completed case active, upcoming, completed
@@ -35,11 +35,19 @@ struct ChallengesView: View {
.sheet(isPresented: $showingCreateSheet) { .sheet(isPresented: $showingCreateSheet) {
CreateChallengeSheet(viewModel: viewModel) CreateChallengeSheet(viewModel: viewModel)
} }
.alert("Error", isPresented: .init(get: { viewModel.error != nil }, set: { if !$0 { lastError = viewModel.error } })) { .alert("Error", isPresented: $alertIsPresented) {
Button("OK") { lastError = viewModel.error } Button("OK") {
viewModel.error = nil
alertIsPresented = false
}
} message: { } message: {
Text(viewModel.error?.errorDescription ?? "") Text(viewModel.error?.errorDescription ?? "")
} }
.onChange(of: viewModel.error) { _ in
if viewModel.error != nil {
alertIsPresented = true
}
}
} }
.onAppear { .onAppear {
Task { Task {

View File

@@ -4,7 +4,7 @@ struct ClubsView: View {
@StateObject private var viewModel = ClubViewModel() @StateObject private var viewModel = ClubViewModel()
@State private var showingCreateSheet = false @State private var showingCreateSheet = false
@State private var selectedTab: ClubTab = .discover @State private var selectedTab: ClubTab = .discover
@State private var lastError: ClubError? @State private var alertIsPresented = false
enum ClubTab: String, CaseIterable { enum ClubTab: String, CaseIterable {
case discover, myClubs case discover, myClubs
@@ -35,11 +35,19 @@ struct ClubsView: View {
.sheet(isPresented: $showingCreateSheet) { .sheet(isPresented: $showingCreateSheet) {
CreateClubSheet(viewModel: viewModel) CreateClubSheet(viewModel: viewModel)
} }
.alert("Error", isPresented: .init(get: { viewModel.error != nil }, set: { if !$0 { lastError = nil } })) { .alert("Error", isPresented: $alertIsPresented) {
Button("OK") { lastError = viewModel.error } Button("OK") {
viewModel.error = nil
alertIsPresented = false
}
} message: { } message: {
Text(viewModel.error?.errorDescription ?? "") Text(viewModel.error?.errorDescription ?? "")
} }
.onChange(of: viewModel.error) { _ in
if viewModel.error != nil {
alertIsPresented = true
}
}
} }
.onAppear { .onAppear {
Task { Task {