diff --git a/GiteaPR.xcodeproj/project.pbxproj b/GiteaPR.xcodeproj/project.pbxproj index 88354ff..89a19a6 100644 --- a/GiteaPR.xcodeproj/project.pbxproj +++ b/GiteaPR.xcodeproj/project.pbxproj @@ -187,7 +187,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 24; + CURRENT_PROJECT_VERSION = 25; DEVELOPMENT_TEAM = ""; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_CFBundleDisplayName = "GiteaPR"; @@ -197,7 +197,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 3.3; + MARKETING_VERSION = 3.4; PRODUCT_BUNDLE_IDENTIFIER = com.bueso.giteapr; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_EMIT_LOC_STRINGS = YES; @@ -211,7 +211,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 24; + CURRENT_PROJECT_VERSION = 25; DEVELOPMENT_TEAM = ""; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_CFBundleDisplayName = "GiteaPR"; @@ -221,7 +221,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 3.3; + MARKETING_VERSION = 3.4; PRODUCT_BUNDLE_IDENTIFIER = com.bueso.giteapr; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_EMIT_LOC_STRINGS = YES; diff --git a/GiteaPR/Detail/PRDetailView.swift b/GiteaPR/Detail/PRDetailView.swift index 69310d6..14e5d65 100644 --- a/GiteaPR/Detail/PRDetailView.swift +++ b/GiteaPR/Detail/PRDetailView.swift @@ -70,8 +70,9 @@ struct PRDetailView: View { } .sheet(isPresented: $showMergeSheet) { MergeSheet(vm: vm) { - // Merge succeeded: show the success animation, then pop back - // to the landing page. + // Merge succeeded: mark the inbox for refresh, show the success + // animation, then pop back to the landing page. + SettingsStore.shared.inboxNeedsRefresh = true withAnimation(.spring(response: 0.4, dampingFraction: 0.6)) { showMergeSuccess = true } @@ -114,6 +115,7 @@ struct PRDetailView: View { case .none: OverviewTab(pr: pr) } } + .refreshable { await vm.load() } bottomTabBar } diff --git a/GiteaPR/Settings/SettingsStore.swift b/GiteaPR/Settings/SettingsStore.swift index 0a3f997..e719585 100644 --- a/GiteaPR/Settings/SettingsStore.swift +++ b/GiteaPR/Settings/SettingsStore.swift @@ -33,6 +33,9 @@ final class SettingsStore: ObservableObject { didSet { UserDefaults.standard.set(monitoredRepos, forKey: "monitoredRepos") } } + /// Set when a PR is merged, so the inbox knows to reload on next appearance + /// (otherwise a just-merged PR could linger as stale in the list). + @Published var inboxNeedsRefresh = false private init() { instanceURL = KeychainHelper.get("instanceURL") ?? "https://gitea.bueso.eu" diff --git a/GiteaPR/Views/InboxView.swift b/GiteaPR/Views/InboxView.swift index 499fb62..40dfb92 100644 --- a/GiteaPR/Views/InboxView.swift +++ b/GiteaPR/Views/InboxView.swift @@ -60,6 +60,14 @@ struct InboxView: View { didInitialLoad = true await vm.load() } + .onAppear { + // After a merge, the inbox must reload so the just-merged PR + // doesn't linger as stale in the list. + if SettingsStore.shared.inboxNeedsRefresh { + SettingsStore.shared.inboxNeedsRefresh = false + Task { await vm.load() } + } + } .alert("Error", isPresented: .init( get: { vm.errorMessage != nil }, set: { if !$0 { vm.errorMessage = nil } })) {