additional account relay list improvements
- Use the current selected account only to determine desired relays. Previously the desired relay list was determined from the union of all accounts. - Update the relay configuration immediately when the user switches accounts. - Delete relays from the account (instead of the relay pool directly). This results in the relay being removed in the pool as well, but is persisted correctly.
This commit is contained in:
@@ -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> {
|
||||
|
||||
@@ -97,7 +97,7 @@ pub fn process_accounts_view_response(
|
||||
router.route_to(Route::add_account());
|
||||
}
|
||||
}
|
||||
|
||||
accounts.needs_relay_config();
|
||||
selection
|
||||
}
|
||||
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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://";
|
||||
|
||||
Reference in New Issue
Block a user