Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 29 additions & 33 deletions crates/git_ui/src/project_diff.rs
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,6 @@ impl ProjectDiff {
pub(crate) fn register(workspace: &mut Workspace, cx: &mut Context<Workspace>) {
workspace.register_action(Self::deploy);
workspace.register_action(Self::deploy_branch_diff);
workspace.register_action(Self::deploy_review_diff);
workspace.register_action(|workspace, _: &Add, window, cx| {
Self::deploy(workspace, &Diff, window, cx);
});
Expand Down Expand Up @@ -148,25 +147,13 @@ impl ProjectDiff {
.detach_and_notify_err(workspace_weak, window, cx);
}

fn deploy_review_diff(
workspace: &mut Workspace,
_: &ReviewDiff,
window: &mut Window,
cx: &mut Context<Workspace>,
) {
let Some(project_diff) = workspace
.items_of_type::<Self>(cx)
.find(|item| matches!(item.read(cx).diff_base(cx), DiffBase::Merge { .. }))
else {
return;
};

let diff_base = project_diff.read(cx).diff_base(cx).clone();
fn review_diff(&mut self, _: &ReviewDiff, window: &mut Window, cx: &mut Context<Self>) {
let diff_base = self.diff_base(cx).clone();
let DiffBase::Merge { base_ref } = diff_base else {
return;
};

let Some(repo) = project_diff.read(cx).branch_diff.read(cx).repo().cloned() else {
let Some(repo) = self.branch_diff.read(cx).repo().cloned() else {
return;
};

Expand All @@ -179,26 +166,31 @@ impl ProjectDiff {
)
});

let workspace_handle = cx.entity();
let workspace_weak = workspace_handle.downgrade();
window
.spawn(cx, async move |cx| {
let diff_text = diff_receiver.await??;
let workspace = self.workspace.clone();

workspace_handle.update_in(cx, |_workspace, window, cx| {
window.dispatch_action(
ReviewBranchDiff {
diff_text: diff_text.into(),
base_ref: base_ref.to_string().into(),
}
.boxed_clone(),
cx,
);
})?;
window
.spawn(cx, {
let workspace = workspace.clone();
async move |cx| {
let diff_text = diff_receiver.await??;

if let Some(workspace) = workspace.upgrade() {
workspace.update_in(cx, |_workspace, window, cx| {
window.dispatch_action(
ReviewBranchDiff {
diff_text: diff_text.into(),
base_ref: base_ref.to_string().into(),
}
.boxed_clone(),
cx,
);
})?;
}

anyhow::Ok(())
anyhow::Ok(())
}
})
.detach_and_notify_err(workspace_weak, window, cx);
.detach_and_notify_err(workspace, window, cx);
}

pub fn deploy_at(
Expand Down Expand Up @@ -1139,10 +1131,14 @@ impl Item for ProjectDiff {
impl Render for ProjectDiff {
fn render(&mut self, _window: &mut Window, cx: &mut Context<Self>) -> impl IntoElement {
let is_empty = self.multibuffer.read(cx).is_empty();
let is_branch_diff_view = matches!(self.diff_base(cx), DiffBase::Merge { .. });

div()
.track_focus(&self.focus_handle)
.key_context(if is_empty { "EmptyPane" } else { "GitDiff" })
.when(is_branch_diff_view, |this| {
this.on_action(cx.listener(Self::review_diff))
})
.bg(cx.theme().colors().editor_background)
.flex()
.items_center()
Expand Down