diff --git a/src/backend_task/contested_names/mod.rs b/src/backend_task/contested_names/mod.rs index 293837967..05844899b 100644 --- a/src/backend_task/contested_names/mod.rs +++ b/src/backend_task/contested_names/mod.rs @@ -26,7 +26,6 @@ impl AppContext { sdk: &Sdk, sender: mpsc::Sender, ) -> Result { - let sdk = sdk.clone(); match &task { ContestedResourceTask::QueryDPNSContestedResources => self .query_dpns_contested_resources(sdk, sender) @@ -39,89 +38,7 @@ impl AppContext { ContestedResourceTask::VoteOnDPNSName(name, vote_choice, voters) => { self.vote_on_dpns_name(name, *vote_choice, voters, sdk, sender) .await - } // ContestedResourceTask::VoteOnContestedResource(vote_poll, vote_choice) => { - // let mut vote = Vote::default(); - // let identity_private_keys_lock = self.known_identities_private_keys.lock().await; - // let loaded_identity_lock = match self.loaded_identity.lock().await.clone() { - // Some(identity) => identity, - // None => { - // return BackendEvent::TaskCompleted { - // task: Task::Document(task), - // execution_result: Err( - // "No loaded identity for signing vote transaction".to_string(), - // ), - // }; - // } - // }; - // - // let mut signer = SimpleSigner::default(); - // let Identity::V0(identity_v0) = &loaded_identity_lock; - // for (key_id, public_key) in &identity_v0.public_keys { - // let identity_key_tuple = (identity_v0.id, *key_id); - // if let Some(private_key_bytes) = - // identity_private_keys_lock.get(&identity_key_tuple) - // { - // signer - // .private_keys - // .insert(public_key.clone(), private_key_bytes.clone()); - // } - // } - // - // let voting_public_key = match loaded_identity_lock.get_first_public_key_matching( - // Purpose::VOTING, - // HashSet::from(SecurityLevel::full_range()), - // HashSet::from(KeyType::all_key_types()), - // false, - // ) { - // Some(voting_key) => voting_key, - // None => { - // return BackendEvent::TaskCompleted { - // task: Task::Document(task), - // execution_result: Err( - // "No voting key in the loaded identity. Are you sure it's a masternode identity?".to_string() - // ), - // }; - // } - // }; - // - // match vote { - // Vote::ResourceVote(ref mut resource_vote) => match resource_vote { - // ResourceVote::V0(ref mut resource_vote_v0) => { - // resource_vote_v0.vote_poll = vote_poll.clone(); - // resource_vote_v0.resource_vote_choice = *vote_choice; - // let pro_tx_hash = self - // .loaded_identity_pro_tx_hash - // .lock() - // .await - // .expect("Expected a proTxHash in AppState"); - // match vote - // .put_to_platform_and_wait_for_response( - // pro_tx_hash, - // voting_public_key, - // sdk, - // &signer, - // None, - // ) - // .await - // { - // Ok(_) => { - // // TODO: Insert vote result into the database - // BackendEvent::TaskCompleted { - // task: Task::Document(task), - // execution_result: Ok(CompletedTaskPayload::String( - // "Vote cast successfully".to_string(), - // )), - // } - // } - // Err(e) => BackendEvent::TaskCompleted { - // task: Task::Document(task), - // execution_result: Err(e.to_string()), - // }, - // } - // } - // }, - // } - // } + } } } } diff --git a/src/backend_task/contested_names/query_dpns_contested_resources.rs b/src/backend_task/contested_names/query_dpns_contested_resources.rs index db8b335fa..3a66b32f4 100644 --- a/src/backend_task/contested_names/query_dpns_contested_resources.rs +++ b/src/backend_task/contested_names/query_dpns_contested_resources.rs @@ -1,4 +1,5 @@ use crate::app::TaskResult; +use crate::backend_task::BackendTaskSuccessResult; use crate::context::AppContext; use crate::model::proof_log_item::{ProofLogItem, RequestType}; use dash_sdk::dpp::data_contract::accessors::v0::DataContractV0Getters; @@ -9,13 +10,12 @@ use dash_sdk::platform::FetchMany; use dash_sdk::query_types::ContestedResource; use dash_sdk::Sdk; use std::sync::Arc; -use std::time::Instant; use tokio::sync::{mpsc, OwnedSemaphorePermit, Semaphore}; impl AppContext { pub(super) async fn query_dpns_contested_resources( self: &Arc, - sdk: Sdk, + sdk: &Sdk, sender: mpsc::Sender, ) -> Result<(), String> { let data_contract = self.dpns_contract.as_ref(); @@ -23,7 +23,9 @@ impl AppContext { .document_type_for_name("domain") .expect("expected document type"); let Some(contested_index) = document_type.find_contested_index() else { - return Err("No contested index on dpns domains".to_string()); + return Err( + "Contested resource query failed: No contested index on dpns domains.".to_string(), + ); }; const MAX_RETRIES: usize = 3; let mut start_at_value = None; @@ -76,7 +78,9 @@ impl AppContext { format!("Error encoding path_query: {}", encode_err) }) { Ok(encoded_path_query) => encoded_path_query, - Err(e) => return Err(e), + Err(e) => { + return Err(format!("Contested resource query failed: {}", e)) + } }; if let Err(e) = self @@ -92,7 +96,7 @@ impl AppContext { }) .map_err(|e| e.to_string()) { - return Err(e); + return Err(format!("Contested resource query failed: {}", e)); } } if e.to_string().contains("try another server") @@ -104,7 +108,7 @@ impl AppContext { if retries > MAX_RETRIES { tracing::error!("Max retries reached for query: {}", e); return Err(format!( - "Error fetching contested resources after retries: {}", + "Contested resource query failed after retries: {}", e )); } else { @@ -112,7 +116,7 @@ impl AppContext { continue; } } else { - return Err(format!("Error fetching contested resources: {}", e)); + return Err(format!("Contested resource query failed: {}", e)); } } }; @@ -139,12 +143,14 @@ impl AppContext { let names_to_be_updated = self .db .insert_name_contests_as_normalized_names(contested_resources_as_strings, &self) - .map_err(|e| e.to_string())?; + .map_err(|e| format!("Contested resource query failed. Failed to insert name contests into database: {}", e.to_string()))?; - sender - .send(TaskResult::Refresh) - .await - .map_err(|e| e.to_string())?; + sender.send(TaskResult::Refresh).await.map_err(|e| { + format!( + "Contested resource query failed. Sender failed to send TaskResult: {}", + e.to_string() + ) + })?; // Create a semaphore with 15 permits let semaphore = Arc::new(Semaphore::new(24)); @@ -196,7 +202,7 @@ impl AppContext { // Perform the query match self_ref - .query_dpns_vote_contenders(&name, sdk, sender.clone()) + .query_dpns_vote_contenders(&name, &sdk, sender.clone()) .await { Ok(_) => { @@ -236,6 +242,12 @@ impl AppContext { start_at_value = Some((Value::Text(last_found_name), false)) } + sender + .send(TaskResult::Success(BackendTaskSuccessResult::Message( + "Finished querying DPNS contested resources".to_string(), + ))) + .await + .map_err(|e| format!("Finished querying DPNS contested resources but sender failed to send TaskResult: {}", e.to_string()))?; Ok(()) } } diff --git a/src/backend_task/contested_names/query_dpns_vote_contenders.rs b/src/backend_task/contested_names/query_dpns_vote_contenders.rs index 162b7147b..6d3fb5de1 100644 --- a/src/backend_task/contested_names/query_dpns_vote_contenders.rs +++ b/src/backend_task/contested_names/query_dpns_vote_contenders.rs @@ -16,7 +16,7 @@ impl AppContext { pub(super) async fn query_dpns_vote_contenders( &self, name: &String, - sdk: Sdk, + sdk: &Sdk, _sender: mpsc::Sender, ) -> Result<(), String> { let data_contract = self.dpns_contract.as_ref(); diff --git a/src/backend_task/contested_names/vote_on_dpns_name.rs b/src/backend_task/contested_names/vote_on_dpns_name.rs index 7a651466b..1685eccd9 100644 --- a/src/backend_task/contested_names/vote_on_dpns_name.rs +++ b/src/backend_task/contested_names/vote_on_dpns_name.rs @@ -22,7 +22,7 @@ impl AppContext { name: &String, vote_choice: ResourceVoteChoice, voters: &Vec, - sdk: Sdk, + sdk: &Sdk, _sender: mpsc::Sender, ) -> Result { // Fetch DPNS contract and document type information diff --git a/src/ui/dpns_contested_names_screen.rs b/src/ui/dpns_contested_names_screen.rs index 11c4f411a..3221a8041 100644 --- a/src/ui/dpns_contested_names_screen.rs +++ b/src/ui/dpns_contested_names_screen.rs @@ -1,4 +1,5 @@ use super::components::dpns_subscreen_chooser_panel::add_dpns_subscreen_chooser_panel; +use super::components::top_panel; use super::{Screen, ScreenType}; use crate::app::{AppAction, DesiredAppAction}; use crate::backend_task::contested_names::ContestedResourceTask; @@ -66,6 +67,7 @@ pub struct DPNSContestedNamesScreen { sort_order: SortOrder, show_vote_popup_info: Option<(String, ContestedResourceTask)>, pub dpns_subscreen: DPNSSubscreen, + refreshing: bool, } impl DPNSContestedNamesScreen { @@ -105,6 +107,7 @@ impl DPNSContestedNamesScreen { sort_order: SortOrder::Ascending, show_vote_popup_info: None, dpns_subscreen, + refreshing: false, } } @@ -794,28 +797,36 @@ impl ScreenLike for DPNSContestedNamesScreen { } fn display_message(&mut self, message: &str, message_type: MessageType) { + if message.contains("Finished querying DPNS contested resources") + || message.contains("Contested resource query failed") + { + self.refreshing = false; + } self.error_message = Some((message.to_string(), message_type, Utc::now())); } fn ui(&mut self, ctx: &Context) -> AppAction { self.check_error_expiration(); - let has_identity_that_can_register = !self.user_identities.is_empty(); - let query = ( + let mut top_panel_refresh_button = ( "Refresh", DesiredAppAction::BackendTask(BackendTask::ContestedResourceTask( ContestedResourceTask::QueryDPNSContestedResources, )), ); + if self.refreshing { + top_panel_refresh_button = ("Refreshing...", DesiredAppAction::None) + } + let has_identity_that_can_register = !self.user_identities.is_empty(); let right_buttons = if has_identity_that_can_register { vec![ ( "Register Name", DesiredAppAction::AddScreenType(ScreenType::RegisterDpnsName), ), - query, + top_panel_refresh_button, ] } else { - vec![query] + vec![top_panel_refresh_button] }; let mut action = add_top_panel( ctx, @@ -918,6 +929,14 @@ impl ScreenLike for DPNSContestedNamesScreen { } }); + if action + == AppAction::BackendTask(BackendTask::ContestedResourceTask( + ContestedResourceTask::QueryDPNSContestedResources, + )) + { + self.refreshing = true; + } + action } }