notedeck

One damus client to rule them all
git clone git://jb55.com/notedeck
Log | Files | Refs | README | LICENSE

commit 0c3db9a31eb6362c6f6610dd7e78359782e17f77
parent 8ad9ad20ba6f20f97d43d3abc99dc4cffce4ca5b
Author: William Casarin <jb55@jb55.com>
Date:   Sat, 25 Jan 2025 16:15:55 -0800

Merge additional account relay list improvements from Ken

Ken Sedgwick (1):
      additional account relay list improvements

Diffstat:
Mcrates/notedeck/src/accounts.rs | 65++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------
Mcrates/notedeck_columns/src/accounts/mod.rs | 2+-
Mcrates/notedeck_columns/src/relay_pool_manager.rs | 1+
Mcrates/notedeck_columns/src/ui/relay.rs | 16++++++++--------
4 files changed, 66 insertions(+), 18 deletions(-)

diff --git a/crates/notedeck/src/accounts.rs b/crates/notedeck/src/accounts.rs @@ -343,6 +343,10 @@ impl Accounts { } } + pub fn needs_relay_config(&mut self) { + self.needs_relay_config = true; + } + fn contains_account(&self, pubkey: &[u8; 32]) -> Option<ContainsAccount> { for (index, account) in self.accounts.iter().enumerate() { let has_pubkey = account.pubkey.bytes() == pubkey; @@ -422,6 +426,15 @@ impl Accounts { } } + pub fn get_selected_account_data(&self) -> Option<&AccountData> { + if let Some(account) = self.get_selected_account() { + if let Some(account_data) = self.account_data.get(account.pubkey.bytes()) { + return Some(account_data); + } + } + None + } + pub fn select_account(&mut self, index: usize) { if let Some(account) = self.accounts.get(index) { self.currently_selected_account = Some(index); @@ -532,12 +545,17 @@ impl Accounts { pool: &mut RelayPool, wakeup: impl Fn() + Send + Sync + Clone + 'static, ) { + debug!( + "updating relay configuration for currently selected account {:?}", + self.currently_selected_account + ); + // If forced relays are set use them only let mut desired_relays = self.forced_relays.clone(); - // Compose the desired relay lists from the accounts + // Compose the desired relay lists from the selected account if desired_relays.is_empty() { - for data in self.account_data.values() { + if let Some(data) = self.get_selected_account_data() { desired_relays.extend(data.relay.local.iter().cloned()); desired_relays.extend(data.relay.advertised.iter().cloned()); } @@ -621,9 +639,17 @@ impl Accounts { None } - pub fn add_advertised_relay(&mut self, relay_to_add: &str, pool: &mut RelayPool) { - let relay_to_add = AccountRelayData::canonicalize_url(relay_to_add); - info!("add advertised relay \"{}\"", relay_to_add); + fn modify_advertised_relays( + &mut self, + relay_url: &str, + pool: &mut RelayPool, + action: RelayAction, + ) { + let relay_url = AccountRelayData::canonicalize_url(relay_url); + match action { + RelayAction::Add => info!("add advertised relay \"{}\"", relay_url), + RelayAction::Remove => info!("remove advertised relay \"{}\"", relay_url), + } match self.currently_selected_account { None => error!("no account is currently selected."), Some(index) => match self.accounts.get(index) { @@ -635,13 +661,21 @@ impl Accounts { Some(account_data) => { let advertised = &mut account_data.relay.advertised; if advertised.is_empty() { - // If the selected account has no advertised relays - // iniitialize with the bootstrapping set. + // If the selected account has no advertised relays, + // initialize with the bootstrapping set. advertised.extend(self.bootstrap_relays.iter().cloned()); } - advertised.insert(RelaySpec::new(relay_to_add, false, false)); + match action { + RelayAction::Add => { + advertised.insert(RelaySpec::new(relay_url, false, false)); + } + RelayAction::Remove => { + advertised.remove(&RelaySpec::new(relay_url, false, false)); + } + } self.needs_relay_config = true; - // If we have the secret key publish the nip-65 relay list + + // If we have the secret key publish the NIP-65 relay list if let Some(secretkey) = &keypair.secret_key { account_data .relay @@ -653,6 +687,19 @@ impl Accounts { }, } } + + pub fn add_advertised_relay(&mut self, relay_to_add: &str, pool: &mut RelayPool) { + self.modify_advertised_relays(relay_to_add, pool, RelayAction::Add); + } + + pub fn remove_advertised_relay(&mut self, relay_to_remove: &str, pool: &mut RelayPool) { + self.modify_advertised_relays(relay_to_remove, pool, RelayAction::Remove); + } +} + +enum RelayAction { + Add, + Remove, } fn get_selected_index(accounts: &[UserAccount], keystore: &KeyStorageType) -> Option<usize> { diff --git a/crates/notedeck_columns/src/accounts/mod.rs b/crates/notedeck_columns/src/accounts/mod.rs @@ -97,7 +97,7 @@ pub fn process_accounts_view_response( router.route_to(Route::add_account()); } } - + accounts.needs_relay_config(); selection } diff --git a/crates/notedeck_columns/src/relay_pool_manager.rs b/crates/notedeck_columns/src/relay_pool_manager.rs @@ -41,6 +41,7 @@ impl<'a> RelayPoolManager<'a> { indices.iter().for_each(|index| self.remove_relay(*index)); } + // FIXME - this is not ever called? pub fn add_relay(&mut self, ctx: &egui::Context, relay_url: String) { let _ = self.pool.add_url(relay_url, create_wakeup(ctx)); } diff --git a/crates/notedeck_columns/src/ui/relay.rs b/crates/notedeck_columns/src/ui/relay.rs @@ -37,8 +37,9 @@ impl View for RelayView<'_> { .scroll_bar_visibility(egui::scroll_area::ScrollBarVisibility::AlwaysHidden) .auto_shrink([false; 2]) .show(ui, |ui| { - if let Some(indices) = self.show_relays(ui) { - self.manager.remove_relays(indices); + if let Some(relay_to_remove) = self.show_relays(ui) { + self.accounts + .remove_advertised_relay(&relay_to_remove, self.manager.pool); } ui.add_space(8.0); if let Some(relay_to_add) = self.show_add_relay_ui(ui) { @@ -66,9 +67,9 @@ impl<'a> RelayView<'a> { egui::CentralPanel::default().show(ui.ctx(), |ui| self.ui(ui)); } - /// Show the current relays, and returns the indices of relays the user requested to delete - fn show_relays(&'a self, ui: &mut Ui) -> Option<Vec<usize>> { - let mut indices_to_remove: Option<Vec<usize>> = None; + /// Show the current relays and return a relay the user selected to delete + fn show_relays(&'a self, ui: &mut Ui) -> Option<String> { + let mut relay_to_remove = None; for (index, relay_info) in self.manager.get_relay_infos().iter().enumerate() { ui.add_space(8.0); ui.vertical_centered_justified(|ui| { @@ -106,7 +107,7 @@ impl<'a> RelayView<'a> { ui.with_layout(Layout::right_to_left(Align::Center), |ui| { if ui.add(delete_button(ui.visuals().dark_mode)).clicked() { - indices_to_remove.get_or_insert_with(Vec::new).push(index); + relay_to_remove = Some(relay_info.relay_url.to_string()); }; show_connection_status(ui, relay_info.status); @@ -115,8 +116,7 @@ impl<'a> RelayView<'a> { }); }); } - - indices_to_remove + relay_to_remove } const RELAY_PREFILL: &'static str = "wss://";