Merge #1580: Fix export subscription

a12bb0b5a4ff065c90c2cb1c9705f651af72d384 gui: add logs when export_subscription() fail to send a message (pythcoiner)
aa0c5d303a2aa925c0498ebd37ef1aa295eddff1 gui: minor cleanup in export_subscription() (pythcoiner)
3513226af0f42c465548ba6076573c063e6733f2 gui: fix the export subscription being stuck in Running state (pythcoiner)
85024d64bdf3133c9ef4f593ef9070df0958e702 gui: ExportModal.update() pass an ExportMessage instead app::message::Message in order to be used in a more generic way (pythcoiner)

Pull request description:

  fix a bug introduced in #1550 where the export subscription were stuck in `Running` state & minor cleanups

ACKs for top commit:
  edouardparis:
    ACK a12bb0b5a4ff065c90c2cb1c9705f651af72d384

Tree-SHA512: 62dd0bbcb46a5d53d959af2a4d924c7b4308b985c3e26d0c2bce5a99607fa4934a393447d7044fb503f89a8a7c2208365d129f1bb191a0a91b60036f584a6d35
This commit is contained in:
edouardparis 2025-03-04 17:42:39 +01:00
commit 759411cfce
No known key found for this signature in database
GPG Key ID: E65F7A089C20DC8F
3 changed files with 51 additions and 50 deletions

View File

@ -9,7 +9,7 @@ use tokio::task::JoinHandle;
use crate::{
app::{
message::Message,
self,
view::{self, export::export_modal},
},
daemon::Daemon,
@ -37,53 +37,47 @@ impl ExportModal {
}
}
pub fn launch(&self) -> Task<Message> {
pub fn launch(&self) -> Task<app::message::Message> {
Task::perform(get_path(), |m| {
Message::View(view::Message::Export(ExportMessage::Path(m)))
app::message::Message::View(view::Message::Export(ExportMessage::Path(m)))
})
}
pub fn update(&mut self, message: Message) -> Task<Message> {
if let Message::View(view::Message::Export(m)) = message {
match m {
ExportMessage::ExportProgress(m) => match m {
ExportProgress::Started(handle) => {
self.handle = Some(handle);
self.state = ExportState::Progress(0.0);
}
ExportProgress::Progress(p) => {
if let ExportState::Progress(_) = self.state {
self.state = ExportState::Progress(p);
}
}
ExportProgress::Finished | ExportProgress::Ended => {
self.state = ExportState::Ended
}
ExportProgress::Error(e) => self.error = Some(e),
ExportProgress::None => {}
},
ExportMessage::TimedOut => {
self.stop(ExportState::TimedOut);
pub fn update(&mut self, message: ExportMessage) -> Task<app::message::Message> {
match message {
ExportMessage::ExportProgress(m) => match m {
ExportProgress::Started(handle) => {
self.handle = Some(handle);
self.state = ExportState::Progress(0.0);
}
ExportMessage::UserStop => {
self.stop(ExportState::Aborted);
}
ExportMessage::Path(p) => {
if let Some(path) = p {
self.path = Some(path);
self.start();
} else {
return Task::perform(async {}, |_| {
Message::View(view::Message::Export(ExportMessage::Close))
});
ExportProgress::Progress(p) => {
if let ExportState::Progress(_) = self.state {
self.state = ExportState::Progress(p);
}
}
ExportMessage::Close | ExportMessage::Open => { /* unreachable */ }
ExportProgress::Finished | ExportProgress::Ended => self.state = ExportState::Ended,
ExportProgress::Error(e) => self.error = Some(e),
ExportProgress::None => {}
},
ExportMessage::TimedOut => {
self.stop(ExportState::TimedOut);
}
Task::none()
} else {
Task::none()
ExportMessage::UserStop => {
self.stop(ExportState::Aborted);
}
ExportMessage::Path(p) => {
if let Some(path) = p {
self.path = Some(path);
self.start();
} else {
return Task::perform(async {}, |_| {
app::message::Message::View(view::Message::Export(ExportMessage::Close))
});
}
}
ExportMessage::Close | ExportMessage::Open => { /* unreachable */ }
}
Task::none()
}
pub fn view<'a>(&'a self, content: Element<'a, view::Message>) -> Element<view::Message> {
let modal = Modal::new(

View File

@ -279,10 +279,16 @@ impl State for TransactionsPanel {
self.modal = TransactionsModal::None;
}
}
_ => {
ref msg => {
return match &mut self.modal {
TransactionsModal::CreateRbf(modal) => modal.update(daemon, _cache, message),
TransactionsModal::Export(modal) => modal.update(message),
TransactionsModal::Export(modal) => {
if let Message::View(view::Message::Export(m)) = msg {
modal.update(m.clone())
} else {
Task::none()
}
}
TransactionsModal::None => Task::none(),
};
}

View File

@ -359,15 +359,14 @@ pub fn export_subscription(
Status::Stopped => {
break;
}
Status::Running => {
sleep(time::Duration::from_millis(100)).await;
continue;
}
Status::Running => {}
}
let msg = state.receiver.try_recv();
let disconnected = match msg {
Ok(m) => {
let _ = output.send(m).await;
if let Err(e) = output.send(m).await {
tracing::error!("export_subscription() fail to send message: {}", e);
}
continue;
}
Err(e) => match e {
@ -379,7 +378,9 @@ pub fn export_subscription(
let handle = match state.handle.take() {
Some(h) => h,
None => {
let _ = output.send(ExportProgress::Error(Error::HandleLost)).await;
if let Err(e) = output.send(ExportProgress::Error(Error::HandleLost)).await {
tracing::error!("export_subscription() fail to send message: {}", e);
}
continue;
}
};
@ -394,14 +395,14 @@ pub fn export_subscription(
}
};
if let Some(msg) = msg {
let _ = output.send(msg).await;
if let Err(e) = output.send(msg).await {
tracing::error!("export_subscription() fail to send message: {}", e);
}
continue;
}
// => release handle lock
state.handle = Some(handle);
sleep(time::Duration::from_millis(100)).await;
let _ = output.send(ExportProgress::None).await;
}
})
}