mod commit_diff; mod dialog_state; pub(crate) mod discussion; mod inbox; mod issues; mod placeholder_panel; mod pull_requests; mod repo; mod repo_list; mod send_patch; pub(crate) mod sidebar; mod status_list; pub(crate) mod tree; use std::fmt::Display; use gpui::prelude::*; use gpui::{AnyElement, App, Entity, div}; use gpui_component::{Sizable as _, h_flex}; pub use inbox::InboxView; use metadata::ProfileDirectory; pub(crate) use placeholder_panel::PlaceholderPanel; pub use repo::RepoDetailView; pub(crate) use repo::{RepoItem, open_repo_item, open_repo_panel}; pub use repo_list::RepoListView; pub use sidebar::SidebarPanel; use signed_state::RepoStore; use signed_ui::Avatar; pub(crate) fn tab_title(avatar: AnyElement, label: impl IntoElement) -> impl IntoElement { h_flex() .gap_1p5() .items_center() .child(div().flex_shrink_0().child(avatar)) .child(label) } pub(crate) fn panel_avatar(seed: impl Display) -> AnyElement { Avatar::new(seed).xsmall().into_any_element() } pub(crate) fn repo_tab_avatar( store: &RepoStore, directory: &Entity, cx: &App, ) -> AnyElement { let seed = store .announcement .as_ref() .map(|announcement| format!("{}:{}", announcement.owner, announcement.id)) .or_else(|| store.addr().map(|addr| addr.to_string())) .or_else(|| { store .path .as_ref() .map(|path| path.to_string_lossy().into_owned()) }) .unwrap_or_default(); let owner = store .announcement .as_ref() .map(|announcement| directory.read(cx).profile(&announcement.owner, cx)); let (name, picture) = owner .map(|profile| (Some(profile.name()), profile.picture())) .unwrap_or((None, None)); Avatar::new(seed) .name(name) .picture(picture) .xsmall() .into_any_element() }