Skip to content

Commit 172e307

Browse files
authoredMar 6, 2025
Loading state for "Checkout Source Branch" button (#161)
* Loading state for "Checkout Source Branch" button
1 parent cac2b1c commit 172e307

File tree

2 files changed

+28
-6
lines changed

2 files changed

+28
-6
lines changed
 

‎src/react/atlascode/pullrequest/PullRequestDetailsPage.tsx

+5-2
Original file line numberDiff line numberDiff line change
@@ -184,15 +184,18 @@ export const PullRequestDetailsPage: React.FunctionComponent = () => {
184184
<Grid item>
185185
<Button
186186
disabled={
187-
state.pr.data.source.branchName === state.currentBranchName
187+
state.pr.data.source.branchName ===
188+
state.currentBranchName || state.isCheckingOutBranch
188189
}
189190
onClick={controller.checkoutBranch}
190191
color={'primary'}
191192
>
192193
<Typography variant="button" noWrap>
193194
{state.pr.data.source.branchName === state.currentBranchName
194195
? 'Source branch checked out'
195-
: 'Checkout source branch'}
196+
: state.isCheckingOutBranch
197+
? 'Checking out...'
198+
: 'Checkout source branch'}
196199
</Typography>
197200
</Button>
198201
</Grid>

‎src/react/atlascode/pullrequest/pullRequestDetailsController.ts

+23-4
Original file line numberDiff line numberDiff line change
@@ -107,10 +107,13 @@ export const emptyApi: PullRequestDetailsControllerApi = {
107107

108108
export const PullRequestDetailsControllerContext = React.createContext(emptyApi);
109109

110-
export interface PullRequestDetailsState extends PullRequestDetailsInitMessage {}
110+
export interface PullRequestDetailsState extends PullRequestDetailsInitMessage {
111+
isCheckingOutBranch: boolean;
112+
}
111113

112114
const emptyState: PullRequestDetailsState = {
113115
...emptyPullRequestDetailsInitMessage,
116+
isCheckingOutBranch: false,
114117
};
115118

116119
export enum PullRequestDetailsUIActionType {
@@ -131,6 +134,7 @@ export enum PullRequestDetailsUIActionType {
131134
UpdateMergeStrategies = 'updateMergeStrategies',
132135
UpdateRelatedJiraIssues = 'updateRelatedJiraIssues',
133136
UpdateRelatedBitbucketIssues = 'updateRelatedBitbucketIssues',
137+
SetCheckoutLoading = 'setCheckoutLoading',
134138
}
135139

136140
export type PullRequestDetailsUIAction =
@@ -160,7 +164,8 @@ export type PullRequestDetailsUIAction =
160164
PullRequestDetailsUIActionType.UpdateRelatedBitbucketIssues,
161165
{ data: PullRequestDetailsRelatedBitbucketIssuesMessage }
162166
>
163-
| ReducerAction<PullRequestDetailsUIActionType.Loading>;
167+
| ReducerAction<PullRequestDetailsUIActionType.Loading>
168+
| ReducerAction<PullRequestDetailsUIActionType.SetCheckoutLoading, { data: { isLoading: boolean } }>;
164169

165170
function pullRequestDetailsReducer(
166171
state: PullRequestDetailsState,
@@ -283,6 +288,12 @@ function pullRequestDetailsReducer(
283288
loadState: { ...state.loadState, relatedBitbucketIssues: false },
284289
};
285290
}
291+
case PullRequestDetailsUIActionType.SetCheckoutLoading: {
292+
return {
293+
...state,
294+
isCheckingOutBranch: action.data.isLoading,
295+
};
296+
}
286297
default:
287298
return defaultStateGuard(state, action);
288299
}
@@ -459,8 +470,16 @@ export function usePullRequestDetailsController(): [PullRequestDetailsState, Pul
459470

460471
const checkoutBranch = useCallback(() => {
461472
dispatch({ type: PullRequestDetailsUIActionType.Loading });
462-
postMessage({ type: PullRequestDetailsActionType.CheckoutBranch });
463-
}, [postMessage]);
473+
dispatch({ type: PullRequestDetailsUIActionType.SetCheckoutLoading, data: { isLoading: true } });
474+
475+
postMessagePromise(
476+
{ type: PullRequestDetailsActionType.CheckoutBranch },
477+
PullRequestDetailsMessageType.CheckoutBranch,
478+
ConnectionTimeout,
479+
).finally(() => {
480+
dispatch({ type: PullRequestDetailsUIActionType.SetCheckoutLoading, data: { isLoading: false } });
481+
});
482+
}, [postMessagePromise]);
464483

465484
const postComment = useCallback(
466485
(rawText: string, parentId?: string): Promise<void> => {

0 commit comments

Comments
 (0)
Failed to load comments.