From 9daff326d1c69bf2bbe04f7d1398bb27c1e4b522 Mon Sep 17 00:00:00 2001 From: Sofia Date: Thu, 4 Jun 2026 19:28:38 +0300 Subject: [PATCH] Make loading the messages be responsibility of the state itself --- src/state.rs | 2 +- src/states.rs | 92 ++++++++++++++++++++++++++++++--------------------- 2 files changed, 56 insertions(+), 38 deletions(-) diff --git a/src/state.rs b/src/state.rs index eae09b0..32ff0e4 100644 --- a/src/state.rs +++ b/src/state.rs @@ -165,7 +165,7 @@ pub trait MenuItem { #[derive(Default, Debug, Clone)] pub struct Menu { - items: Vec, + pub items: Vec, idx: usize, scroll: usize, } diff --git a/src/states.rs b/src/states.rs index 9078b46..66e7d2b 100644 --- a/src/states.rs +++ b/src/states.rs @@ -340,27 +340,7 @@ impl State for MainMenuState { match option { MainMenuItem::SendSMS => return Some(Box::new(PhoneNumberState::default())), MainMenuItem::ReadSMS => { - return Some(Box::new(ATCommandState::with( - "Loading\nmessages".to_owned(), - ListSMSMessages { - stat: SMSMessageStat::All, - }, - |resp| match resp { - Ok(response) => match response { - ListSMSMessagesResponse::Ok(messages) => { - Box::new(ListSMSMessagesState::from(messages)) - } - ListSMSMessagesResponse::Error(err) => Box::new(TextState { - text: format!("Error:\n{:?}", err), - after: MainMenuState::default(), - }), - }, - Err(err) => Box::new(TextState { - text: format!("Error:\n{:?}", err), - after: MainMenuState::default(), - }), - }, - ))); + return Some(Box::new(ListSMSMessagesState::default())); } } } @@ -388,24 +368,53 @@ impl MenuItem for MessageListing { #[derive(Clone, Default)] pub struct ListSMSMessagesState { menu: Menu, -} - -impl ListSMSMessagesState { - pub fn from(messages: Vec) -> ListSMSMessagesState { - let mut menu = Menu::default(); - for message in &messages { - menu = menu.with_item(MessageListing { - from: message.from_addr.clone(), - text: message.text.clone(), - }) - } - - ListSMSMessagesState { menu } - } + promise: Option>, } impl State for ListSMSMessagesState { + fn init(&mut self, data: &mut StateData) { + self.promise = data + .io + .send_at_command(ListSMSMessages { + stat: SMSMessageStat::All, + }) + .ok() + } + fn update(&mut self, data: &mut StateData) -> Option> { + if let Some(promise) = &self.promise { + match promise.poll(&mut data.io) { + Some(result) => { + match result { + Ok(response) => match response { + ListSMSMessagesResponse::Ok(messages) => { + for message in messages { + self.menu = self.menu.clone().with_item(MessageListing { + from: message.from_addr.clone(), + text: message.text.clone(), + }) + } + } + ListSMSMessagesResponse::Error(err) => { + return Some(Box::new(TextState { + text: format!("Error\n{:?}", err), + after: MainMenuState::default(), + })); + } + }, + Err(err) => { + return Some(Box::new(TextState { + text: format!("Error\n{:?}", err), + after: MainMenuState::default(), + })); + } + } + self.promise = None; + } + None => return None, + } + } + if let Some(listing) = self.menu.poll(&mut data.io) { return Some(Box::new(ReadMessageState { message: listing.clone(), @@ -419,7 +428,16 @@ impl State for ListSMSMessagesState { } fn draw(&self, data: &mut StateData) { - self.menu.draw(data); + data.clear_screen(Rgb565::black().as_color()); + if self.menu.items.len() == 0 { + data.draw_text( + "Loading\nmessages", + Position::new(0, 0), + TextSettings::default(), + ); + } else { + self.menu.draw(data); + } } } @@ -431,7 +449,7 @@ pub struct ReadMessageState { impl State for ReadMessageState { fn update(&mut self, data: &mut StateData) -> Option> { if data.io.keypad.get_presses(KeypadButton::KeypadB) > 0 { - Some(Box::new(MainMenuState::default())) + Some(Box::new(ListSMSMessagesState::default())) } else { None }