Skip to content

Commit

Permalink
profiles: introduce DisplayNames
Browse files Browse the repository at this point in the history
This is exactly the same as the DisplayName enum in Damus iOS. Due to
the various inconsistencies in `name` and `display_name` between
clients, we have to generalize DisplayName into two variants: one name
or two names.

If we have two names, we treat it in the standard way of display_name is
the real name, and `name` is the username.

If only one is set, then it is considered both the username and "real name".

Signed-off-by: William Casarin <[email protected]>
  • Loading branch information
jb55 committed Apr 21, 2024
1 parent 2edba99 commit 893fd58
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 19 deletions.
1 change: 1 addition & 0 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ mod test_utils;

pub use app::Damus;
pub use error::Error;
pub use profile::DisplayName;

#[cfg(target_os = "android")]
use winit::platform::android::EventLoopBuilderExtAndroid;
Expand Down
42 changes: 32 additions & 10 deletions src/profile.rs
Original file line number Diff line number Diff line change
@@ -1,17 +1,39 @@
use nostrdb::ProfileRecord;

pub fn get_profile_name<'a>(record: &'a ProfileRecord) -> Option<&'a str> {
let profile = record.record().profile()?;
let display_name = profile.display_name();
let name = profile.name();
pub enum DisplayName<'a> {
One(&'a str),

if display_name.is_some() && display_name.unwrap() != "" {
return display_name;
}
Both {
username: &'a str,
display_name: &'a str,
},
}

if name.is_some() && name.unwrap() != "" {
return name;
impl<'a> DisplayName<'a> {
pub fn username(&self) -> &'a str {
match self {
Self::One(n) => n,
Self::Both { username, .. } => username,
}
}
}

None
fn is_empty(s: &str) -> bool {
s.chars().all(|c| c.is_whitespace())
}

pub fn get_profile_name<'a>(record: &'a ProfileRecord) -> Option<DisplayName<'a>> {
let profile = record.record().profile()?;
let display_name = profile.display_name().filter(|n| !is_empty(n));
let name = profile.name().filter(|n| !is_empty(n));

match (display_name, name) {
(None, None) => None,
(Some(disp), None) => Some(DisplayName::One(disp)),
(None, Some(username)) => Some(DisplayName::One(username)),
(Some(display_name), Some(username)) => Some(DisplayName::Both {
display_name,
username,
}),
}
}
10 changes: 4 additions & 6 deletions src/ui/note/contents.rs
Original file line number Diff line number Diff line change
Expand Up @@ -129,19 +129,17 @@ fn render_note_contents(
let name: String = if let Some(name) =
profile.as_ref().and_then(crate::profile::get_profile_name)
{
format!("@{}", name)
format!("@{}", name.username())
} else {
"@nostrich".to_string()
"??".to_string()
};

let resp = ui.colored_label(colors::PURPLE, &name);

if let Some(rec) = profile.as_ref() {
resp.on_hover_ui_at_pointer(|ui| {
egui::Frame::default().show(ui, |ui| {
ui.set_max_width(300.0);
ui.add(ui::ProfilePreview::new(rec));
});
ui.set_max_width(300.0);
ui.add(ui::ProfilePreview::new(rec));
});
}
});
Expand Down
22 changes: 19 additions & 3 deletions src/ui/profile/preview.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
use crate::app_style::NotedeckTextStyle;
use crate::images;
use crate::DisplayName;
use egui::load::TexturePoll;
use egui::{RichText, Sense};
use egui_extras::Size;
Expand Down Expand Up @@ -58,14 +59,29 @@ impl<'a> ProfilePreview<'a> {
}
}

fn body(ui: &mut egui::Ui, profile: &ProfileRecord<'_>) -> egui::Response {
fn body(ui: &mut egui::Ui, profile: &ProfileRecord<'_>) {
let name = if let Some(name) = crate::profile::get_profile_name(profile) {
name
} else {
"nostrich"
DisplayName::One("??")
};

ui.label(RichText::new(name).text_style(NotedeckTextStyle::Heading3.text_style()))
match name {
DisplayName::One(n) => {
ui.label(RichText::new(n).text_style(NotedeckTextStyle::Heading3.text_style()));
}

DisplayName::Both {
display_name,
username,
} => {
ui.label(
RichText::new(display_name)
.text_style(NotedeckTextStyle::Heading3.text_style()),
);
ui.label(RichText::new(format!("@{}", username)));
}
}
}
}

Expand Down

0 comments on commit 893fd58

Please sign in to comment.