agent: Add plan chip in the Zed section within the settings view (#34503)

| Free | Pro |
|--------|--------|
| <img width="1140" height="368" alt="CleanShot 2025-07-15 at 7  50
48@2x"
src="https://github.com/user-attachments/assets/b54fd46d-d823-4689-b099-0a9aef8b1c9a"
/> | <img width="1136" height="348" alt="CleanShot 2025-07-15 at 7  51
45@2x"
src="https://github.com/user-attachments/assets/d291a1f5-511f-43df-9ce2-041c77d1cb86"
/> |

Release Notes:

- agent: Added a chip communicating which Zed plan you're subscribed to
in the agent panel settings view.
This commit is contained in:
Danilo Leal 2025-07-15 20:10:44 -03:00 committed by GitHub
parent 0a3ef40c2f
commit afbd2b760f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -24,6 +24,7 @@ use project::{
context_server_store::{ContextServerConfiguration, ContextServerStatus, ContextServerStore}, context_server_store::{ContextServerConfiguration, ContextServerStatus, ContextServerStore},
project_settings::{ContextServerSettings, ProjectSettings}, project_settings::{ContextServerSettings, ProjectSettings},
}; };
use proto::Plan;
use settings::{Settings, update_settings_file}; use settings::{Settings, update_settings_file};
use ui::{ use ui::{
ContextMenu, Disclosure, Divider, DividerColor, ElevationIndex, Indicator, PopoverMenu, ContextMenu, Disclosure, Divider, DividerColor, ElevationIndex, Indicator, PopoverMenu,
@ -171,6 +172,15 @@ impl AgentConfiguration {
.copied() .copied()
.unwrap_or(false); .unwrap_or(false);
let is_zed_provider = provider.id() == ZED_CLOUD_PROVIDER_ID;
let current_plan = if is_zed_provider {
self.workspace
.upgrade()
.and_then(|workspace| workspace.read(cx).user_store().read(cx).current_plan())
} else {
None
};
v_flex() v_flex()
.when(is_expanded, |this| this.mb_2()) .when(is_expanded, |this| this.mb_2())
.child( .child(
@ -208,14 +218,31 @@ impl AgentConfiguration {
.size(IconSize::Small) .size(IconSize::Small)
.color(Color::Muted), .color(Color::Muted),
) )
.child(Label::new(provider_name.clone()).size(LabelSize::Large)) .child(
.when( h_flex()
provider.is_authenticated(cx) && !is_expanded, .gap_1()
|parent| { .child(
parent.child( Label::new(provider_name.clone())
Icon::new(IconName::Check).color(Color::Success), .size(LabelSize::Large),
) )
}, .map(|this| {
if is_zed_provider {
this.child(
self.render_zed_plan_info(current_plan, cx),
)
} else {
this.when(
provider.is_authenticated(cx)
&& !is_expanded,
|parent| {
parent.child(
Icon::new(IconName::Check)
.color(Color::Success),
)
},
)
}
}),
), ),
) )
.child( .child(
@ -431,6 +458,48 @@ impl AgentConfiguration {
.child(self.render_sound_notification(cx)) .child(self.render_sound_notification(cx))
} }
fn render_zed_plan_info(&self, plan: Option<Plan>, cx: &mut Context<Self>) -> impl IntoElement {
if let Some(plan) = plan {
let free_chip_bg = cx
.theme()
.colors()
.editor_background
.opacity(0.5)
.blend(cx.theme().colors().text_accent.opacity(0.05));
let pro_chip_bg = cx
.theme()
.colors()
.editor_background
.opacity(0.5)
.blend(cx.theme().colors().text_accent.opacity(0.2));
let (plan_name, plan_color, bg_color) = match plan {
Plan::Free => ("Free", Color::Default, free_chip_bg),
Plan::ZedProTrial => ("Pro Trial", Color::Accent, pro_chip_bg),
Plan::ZedPro => ("Pro", Color::Accent, pro_chip_bg),
};
h_flex()
.ml_1()
.px_1()
.rounded_sm()
.border_1()
.border_color(cx.theme().colors().border)
.bg(bg_color)
.overflow_hidden()
.child(
Label::new(plan_name.to_string())
.color(plan_color)
.size(LabelSize::XSmall)
.buffer_font(cx),
)
.into_any_element()
} else {
div().into_any_element()
}
}
fn render_context_servers_section( fn render_context_servers_section(
&mut self, &mut self,
window: &mut Window, window: &mut Window,