From e9b6be91f50d319cedcd2aaa253133445daab6a4 Mon Sep 17 00:00:00 2001 From: systemBlue Date: Thu, 4 Jun 2026 13:00:44 +0200 Subject: [PATCH] fix: don't open a duplicate PR when the reviewer request fails (#53) --- Forji/Forji/Views/PullRequestCreateView.swift | 36 ++++++++++++------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/Forji/Forji/Views/PullRequestCreateView.swift b/Forji/Forji/Views/PullRequestCreateView.swift index 38f2b33..e3cc200 100644 --- a/Forji/Forji/Views/PullRequestCreateView.swift +++ b/Forji/Forji/Views/PullRequestCreateView.swift @@ -20,6 +20,7 @@ struct PullRequestCreateView: View { @State private var selectedMilestoneID: Int? @State private var selectedAssigneeLogins: Set = [] @State private var selectedReviewerLogins: Set = [] + @State private var createdPRNumber: Int? @Environment(\.dismiss) private var dismiss private let prService: PullRequestService? @@ -175,24 +176,33 @@ struct PullRequestCreateView: View { guard let prService else { return } isSubmitting = true do { - let trimmedBody = bodyText.trimmingCharacters(in: .whitespacesAndNewlines) - let createdPR = try await prService.createPullRequest( - owner: owner, - repo: repo, - title: title.trimmingCharacters(in: .whitespacesAndNewlines), - head: headBranch, - base: baseBranch, - body: trimmedBody.isEmpty ? nil : trimmedBody, - labels: selectedLabelIDs.isEmpty ? nil : Array(selectedLabelIDs), - milestone: selectedMilestoneID, - assignees: selectedAssigneeLogins.isEmpty ? nil : Array(selectedAssigneeLogins), - ) + // Reuse the already-created PR on retry so a failed reviewer request + // doesn't open a duplicate PR when the user taps Create again. + let prNumber: Int + if let existingNumber = createdPRNumber { + prNumber = existingNumber + } else { + let trimmedBody = bodyText.trimmingCharacters(in: .whitespacesAndNewlines) + let createdPR = try await prService.createPullRequest( + owner: owner, + repo: repo, + title: title.trimmingCharacters(in: .whitespacesAndNewlines), + head: headBranch, + base: baseBranch, + body: trimmedBody.isEmpty ? nil : trimmedBody, + labels: selectedLabelIDs.isEmpty ? nil : Array(selectedLabelIDs), + milestone: selectedMilestoneID, + assignees: selectedAssigneeLogins.isEmpty ? nil : Array(selectedAssigneeLogins), + ) + createdPRNumber = createdPR.number + prNumber = createdPR.number + } if !selectedReviewerLogins.isEmpty { do { try await prService.requestReviewers( owner: owner, repo: repo, - index: createdPR.number, + index: prNumber, reviewers: Array(selectedReviewerLogins), ) } catch {