Make loading the messages be responsibility of the state itself

This commit is contained in:
Sofia 2026-06-04 19:28:38 +03:00
parent 11ca5019b5
commit 9daff326d1
2 changed files with 56 additions and 38 deletions

View File

@ -165,7 +165,7 @@ pub trait MenuItem {
#[derive(Default, Debug, Clone)] #[derive(Default, Debug, Clone)]
pub struct Menu<T: MenuItem> { pub struct Menu<T: MenuItem> {
items: Vec<T>, pub items: Vec<T>,
idx: usize, idx: usize,
scroll: usize, scroll: usize,
} }

View File

@ -340,27 +340,7 @@ impl State for MainMenuState {
match option { match option {
MainMenuItem::SendSMS => return Some(Box::new(PhoneNumberState::default())), MainMenuItem::SendSMS => return Some(Box::new(PhoneNumberState::default())),
MainMenuItem::ReadSMS => { MainMenuItem::ReadSMS => {
return Some(Box::new(ATCommandState::with( return Some(Box::new(ListSMSMessagesState::default()));
"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(),
}),
},
)));
} }
} }
} }
@ -388,24 +368,53 @@ impl MenuItem for MessageListing {
#[derive(Clone, Default)] #[derive(Clone, Default)]
pub struct ListSMSMessagesState { pub struct ListSMSMessagesState {
menu: Menu<MessageListing>, menu: Menu<MessageListing>,
} promise: Option<ATPromise<ListSMSMessages>>,
impl ListSMSMessagesState {
pub fn from(messages: Vec<SMSMessageListing>) -> 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 }
}
} }
impl State for ListSMSMessagesState { 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<Box<dyn State>> { fn update(&mut self, data: &mut StateData) -> Option<Box<dyn State>> {
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) { if let Some(listing) = self.menu.poll(&mut data.io) {
return Some(Box::new(ReadMessageState { return Some(Box::new(ReadMessageState {
message: listing.clone(), message: listing.clone(),
@ -419,7 +428,16 @@ impl State for ListSMSMessagesState {
} }
fn draw(&self, data: &mut StateData) { 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 { impl State for ReadMessageState {
fn update(&mut self, data: &mut StateData) -> Option<Box<dyn State>> { fn update(&mut self, data: &mut StateData) -> Option<Box<dyn State>> {
if data.io.keypad.get_presses(KeypadButton::KeypadB) > 0 { if data.io.keypad.get_presses(KeypadButton::KeypadB) > 0 {
Some(Box::new(MainMenuState::default())) Some(Box::new(ListSMSMessagesState::default()))
} else { } else {
None None
} }