Reload inbox after merge + pull-to-refresh on PR content; bump to 3.4
Build iOS App / Build .ipa and publish source (push) Successful in 34s

- After a merge, the app returns to the landing page but the inbox kept stale
  PRs. Add an inboxNeedsRefresh flag set on merge success; InboxView reloads
  on next appearance when it's set.
- The PR content (incl. the Checks/workflow tab) is now pull-to-refreshable
  via .refreshable on the content ScrollView, so workflow status can be
  updated by pulling down. Bump to 3.4.
This commit is contained in:
Hermes committed 2026-08-17 13:23:10 +00:00
1 parent a9d408ee85
commit a045a36125
4 files changed
+19 -6

No files matched your search

+4 -4
View File
@@ -187,7 +187,7 @@
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 24; CURRENT_PROJECT_VERSION = 25;
DEVELOPMENT_TEAM = ""; DEVELOPMENT_TEAM = "";
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_KEY_CFBundleDisplayName = "GiteaPR"; INFOPLIST_KEY_CFBundleDisplayName = "GiteaPR";
@@ -197,7 +197,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 3.3; MARKETING_VERSION = 3.4;
PRODUCT_BUNDLE_IDENTIFIER = com.bueso.giteapr; PRODUCT_BUNDLE_IDENTIFIER = com.bueso.giteapr;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_EMIT_LOC_STRINGS = YES;
@@ -211,7 +211,7 @@
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 24; CURRENT_PROJECT_VERSION = 25;
DEVELOPMENT_TEAM = ""; DEVELOPMENT_TEAM = "";
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_KEY_CFBundleDisplayName = "GiteaPR"; INFOPLIST_KEY_CFBundleDisplayName = "GiteaPR";
@@ -221,7 +221,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 3.3; MARKETING_VERSION = 3.4;
PRODUCT_BUNDLE_IDENTIFIER = com.bueso.giteapr; PRODUCT_BUNDLE_IDENTIFIER = com.bueso.giteapr;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_EMIT_LOC_STRINGS = YES;
+4 -2
View File
@@ -70,8 +70,9 @@ struct PRDetailView: View {
} }
.sheet(isPresented: $showMergeSheet) { .sheet(isPresented: $showMergeSheet) {
MergeSheet(vm: vm) { MergeSheet(vm: vm) {
// Merge succeeded: show the success animation, then pop back // Merge succeeded: mark the inbox for refresh, show the success
// to the landing page. // animation, then pop back to the landing page.
SettingsStore.shared.inboxNeedsRefresh = true
withAnimation(.spring(response: 0.4, dampingFraction: 0.6)) { withAnimation(.spring(response: 0.4, dampingFraction: 0.6)) {
showMergeSuccess = true showMergeSuccess = true
} }
@@ -114,6 +115,7 @@ struct PRDetailView: View {
case .none: OverviewTab(pr: pr) case .none: OverviewTab(pr: pr)
} }
} }
.refreshable { await vm.load() }
bottomTabBar bottomTabBar
} }
+3
View File
@@ -33,6 +33,9 @@ final class SettingsStore: ObservableObject {
didSet { UserDefaults.standard.set(monitoredRepos, didSet { UserDefaults.standard.set(monitoredRepos,
forKey: "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() { private init() {
instanceURL = KeychainHelper.get("instanceURL") ?? "https://gitea.bueso.eu" instanceURL = KeychainHelper.get("instanceURL") ?? "https://gitea.bueso.eu"
+8
View File
@@ -60,6 +60,14 @@ struct InboxView: View {
didInitialLoad = true didInitialLoad = true
await vm.load() 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( .alert("Error", isPresented: .init(
get: { vm.errorMessage != nil }, get: { vm.errorMessage != nil },
set: { if !$0 { vm.errorMessage = nil } })) { set: { if !$0 { vm.errorMessage = nil } })) {