diff --git a/gui/src/app/state/spend/mod.rs b/gui/src/app/state/spend/mod.rs index dabc1aa6..f37f3a37 100644 --- a/gui/src/app/state/spend/mod.rs +++ b/gui/src/app/state/spend/mod.rs @@ -81,19 +81,20 @@ impl From for Box { } pub struct CreateSpendPanel { - coins: Vec, draft: step::TransactionDraft, current: usize, steps: Vec>, } impl CreateSpendPanel { - pub fn new(coins: &[Coin]) -> Self { + pub fn new(_coins: &[Coin]) -> Self { Self { - coins: coins.to_vec(), draft: step::TransactionDraft::default(), current: 0, - steps: vec![Box::new(step::ChooseRecipients::default())], + steps: vec![ + Box::new(step::ChooseRecipients::default()), + Box::new(step::ChooseFeerate::default()), + ], } } } @@ -113,6 +114,18 @@ impl State for CreateSpendPanel { return redirect(Menu::Spend); } + if matches!(message, Message::View(view::Message::Next)) { + if self.steps.get(self.current + 1).is_some() { + self.current += 1; + } + } + + if matches!(message, Message::View(view::Message::Previous)) { + if self.steps.get(self.current - 1).is_some() { + self.current -= 1; + } + } + if let Some(step) = self.steps.get_mut(self.current) { return step.update(daemon, cache, message); } diff --git a/gui/src/app/state/spend/step.rs b/gui/src/app/state/spend/step.rs index be703e93..d3fb7cb5 100644 --- a/gui/src/app/state/spend/step.rs +++ b/gui/src/app/state/spend/step.rs @@ -162,3 +162,45 @@ impl Recipient { view::spend::step::recipient_view(i, &self.address, &self.amount) } } + +#[derive(Default)] +pub struct ChooseFeerate { + feerate: form::Value, +} + +impl Step for ChooseFeerate { + fn update( + &mut self, + _daemon: Arc, + _cache: &Cache, + message: Message, + ) -> Command { + if let Message::View(view::Message::CreateSpend(view::CreateSpendMessage::FeerateEdited( + s, + ))) = message + { + if s.parse::().is_ok() { + self.feerate.value = s; + self.feerate.valid = true; + } else if s.is_empty() { + self.feerate.value = "".to_string(); + self.feerate.valid = true; + } else { + self.feerate.valid = false; + } + } + + Command::none() + } + + fn apply(&self, draft: &mut TransactionDraft) { + draft.feerate = self.feerate.value.parse::().expect("Checked before"); + } + + fn view<'a>(&'a self, _cache: &'a Cache) -> Element<'a, view::Message> { + view::spend::step::choose_feerate_view( + &self.feerate, + self.feerate.valid && !self.feerate.value.is_empty(), + ) + } +} diff --git a/gui/src/app/view/message.rs b/gui/src/app/view/message.rs index 80f0bd41..c4a7f0a4 100644 --- a/gui/src/app/view/message.rs +++ b/gui/src/app/view/message.rs @@ -10,6 +10,7 @@ pub enum Message { Settings(usize, SettingsMessage), CreateSpend(CreateSpendMessage), Next, + Previous, } #[derive(Debug, Clone)] diff --git a/gui/src/app/view/mod.rs b/gui/src/app/view/mod.rs index ee4cac6b..6633b1d7 100644 --- a/gui/src/app/view/mod.rs +++ b/gui/src/app/view/mod.rs @@ -273,7 +273,9 @@ pub fn modal<'a, T: Into>>( row() .push(if is_previous { column() - .push(button::transparent(None, "< Previous")) + .push( + button::transparent(None, "< Previous").on_press(Message::Previous), + ) .width(Length::Fill) } else { column().width(Length::Fill) diff --git a/gui/src/app/view/spend/step.rs b/gui/src/app/view/spend/step.rs index 815450fe..7b426e90 100644 --- a/gui/src/app/view/spend/step.rs +++ b/gui/src/app/view/spend/step.rs @@ -83,3 +83,37 @@ pub fn recipient_view<'a>( .width(Length::Fill) .into() } + +pub fn choose_feerate_view<'a>( + feerate: &form::Value, + is_valid: bool, +) -> Element<'a, Message> { + modal( + true, + None, + column() + .push(text("Choose feerate").bold().size(50)) + .push( + container( + form::Form::new("Feerate", feerate, move |msg| { + Message::CreateSpend(CreateSpendMessage::FeerateEdited(msg)) + }) + .warning("Please enter correct feerate") + .size(20) + .padding(10), + ) + .width(Length::Units(250)), + ) + .push_maybe(if is_valid { + Some( + button::primary(None, "Next") + .on_press(Message::Next) + .width(Length::Units(100)), + ) + } else { + None + }) + .spacing(20) + .align_items(Alignment::Center), + ) +}