use gpui::prelude::FluentBuilder; use gpui::{ParentElement, Styled, div}; use crate::component::button::button; use crate::query::{self, QueryStatus, read_query, use_query}; use crate::{ api, app, component::{ font_icon::{FontIcon, font_icon}, text::text, }, }; pub struct TitleBar { fetch_user_query: query::Entity, } pub struct RepoSelector {} impl TitleBar { pub fn new(cx: &mut gpui::Context) -> Self { Self { fetch_user_query: use_query(api::user::Fetch, cx), } } } impl gpui::Render for TitleBar { fn render( &mut self, _window: &mut gpui::Window, cx: &mut gpui::Context, ) -> impl gpui::IntoElement { let g = cx.global::(); let user = read_query(&self.fetch_user_query, cx); let user_avatar = match user { QueryStatus::Err(api::Error::Unauthenticated) => div().absolute().right_2p5().child( button("login-btn", cx) .leading(font_icon(FontIcon::Github, cx)) .label("Login"), ), _ => div(), }; div() .flex_row() .justify_center() .items_center() .w_full() .h_10() .flex() .px(g.safe_area.size.width) .py_2() .bg(g.current_theme.colors.background) .text_color(g.current_theme.colors.text) .relative() .child(repo_selector(cx)) .child(user_avatar) } } impl RepoSelector { pub fn new(cx: &mut gpui::Context) -> Self { use_query(api::repo::List, cx); use_query(api::user::Fetch, cx); Self {} } } fn repo_selector(cx: &gpui::Context) -> gpui::Div { div() .flex() .flex_row() .items_center() .gap_1() .text_xs() .child(font_icon(FontIcon::FolderGit, cx).size_3()) .child(text("test/repo", cx)) .child(font_icon(FontIcon::ChevronDown, cx).size_3()) }