@@ -17,14 +17,20 @@ import {
1717 PR_ROW_EXIT ,
1818 PR_POSITION_LAYOUT ,
1919} from "./pullRequestAnimations" ;
20- import { openOnProviderLabel } from "./pullRequestActions" ;
20+ import {
21+ canPerformPullRequestAction ,
22+ openOnProviderLabel ,
23+ PR_ACTION_ICONS ,
24+ PR_ACTION_LABELS ,
25+ } from "./pullRequestActions" ;
2126import * as Clipboard from "expo-clipboard" ;
2227import { ControlPillMenu } from "../../components/ControlPillMenu" ;
2328import { MaterialIconButton } from "../../components/MaterialIconButton" ;
2429import { MaterialButton } from "../../components/MaterialButton" ;
2530import { usePullRequestReviewDraft } from "./usePullRequestReviewDraft" ;
2631import { usePullRequestFilesViewed } from "./usePullRequestFilesViewed" ;
2732import { usePullRequestPermissions } from "./usePullRequestPermissions" ;
33+ import { usePullRequestAction } from "./usePullRequestAction" ;
2834import { annotatePullRequestDiff , reviewPosition } from "./pullRequestDiffComments" ;
2935import { usePullRequestFileFilter } from "./usePullRequestFileFilter" ;
3036import { isPullRequestTestFile } from "./pullRequestFileFilters" ;
@@ -341,6 +347,15 @@ export function PullRequestRouteScreen({ route }: StaticScreenProps<PullRequestP
341347 const summary = params . initialSummary ;
342348 const identity = pr ?? summary ;
343349 const permissions = usePullRequestPermissions ( params , pr ) ;
350+ const action = usePullRequestAction ( params , pr ) ;
351+ const showsDeleteBranch = pr !== null && canPerformPullRequestAction ( pr , "delete-branch" ) ;
352+ const confirmDeleteBranch = ( ) =>
353+ pr &&
354+ action . confirm (
355+ "delete-branch" ,
356+ PR_ACTION_LABELS [ "delete-branch" ] ,
357+ `Delete ${ pr . headBranch } from ${ pr . headRepositoryNameWithOwner ?? pr . repository } ? Local branches and worktrees are not changed.` ,
358+ ) ;
344359 const stack = usePullRequestStack ( params , pr ) ;
345360 const refreshActivity = useAtomRefresh ( composerPullRequests . activity ( requestTarget ( params ) ) ) ;
346361 const refreshGuide = useAtomRefresh ( composerPullRequests . reviewGuide ( requestTarget ( params ) ) ) ;
@@ -417,6 +432,18 @@ export function PullRequestRouteScreen({ route }: StaticScreenProps<PullRequestP
417432 } ,
418433 ]
419434 : [ ] ) ,
435+ ...( showsDeleteBranch
436+ ? [
437+ {
438+ accessibilityLabel : PR_ACTION_LABELS [ "delete-branch" ] ,
439+ icon : PR_ACTION_ICONS [ "delete-branch" ] ,
440+ disabled : ! action . available ( "delete-branch" ) ,
441+ destructive : true ,
442+ overflowOnly : true ,
443+ onPress : confirmDeleteBranch ,
444+ } ,
445+ ]
446+ : [ ] ) ,
420447 ] }
421448 />
422449 ) : null }
@@ -456,6 +483,25 @@ export function PullRequestRouteScreen({ route }: StaticScreenProps<PullRequestP
456483 </ NativeHeaderToolbar . Label >
457484 </ NativeHeaderToolbar . MenuAction >
458485 ) : null }
486+ { showsDeleteBranch ? (
487+ < NativeHeaderToolbar . MenuAction
488+ icon = { PR_ACTION_ICONS [ "delete-branch" ] }
489+ destructive
490+ disabled = { ! action . available ( "delete-branch" ) }
491+ subtitle = {
492+ action . busy
493+ ? "Deleting…"
494+ : connected
495+ ? pr . headBranch
496+ : "Reconnect to delete this branch."
497+ }
498+ onPress = { confirmDeleteBranch }
499+ >
500+ < NativeHeaderToolbar . Label >
501+ { PR_ACTION_LABELS [ "delete-branch" ] }
502+ </ NativeHeaderToolbar . Label >
503+ </ NativeHeaderToolbar . MenuAction >
504+ ) : null }
459505 </ NativeHeaderToolbar . Menu >
460506 </ NativeHeaderToolbar >
461507 < View
0 commit comments