Add choose feerate step

This commit is contained in:
edouard 2022-10-27 18:47:47 +02:00
parent 5b9414260b
commit 0b2f64279b
5 changed files with 97 additions and 5 deletions

View File

@ -81,19 +81,20 @@ impl From<SpendPanel> for Box<dyn State> {
}
pub struct CreateSpendPanel {
coins: Vec<Coin>,
draft: step::TransactionDraft,
current: usize,
steps: Vec<Box<dyn step::Step>>,
}
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);
}

View File

@ -162,3 +162,45 @@ impl Recipient {
view::spend::step::recipient_view(i, &self.address, &self.amount)
}
}
#[derive(Default)]
pub struct ChooseFeerate {
feerate: form::Value<String>,
}
impl Step for ChooseFeerate {
fn update(
&mut self,
_daemon: Arc<dyn Daemon + Sync + Send>,
_cache: &Cache,
message: Message,
) -> Command<Message> {
if let Message::View(view::Message::CreateSpend(view::CreateSpendMessage::FeerateEdited(
s,
))) = message
{
if s.parse::<u64>().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::<u64>().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(),
)
}
}

View File

@ -10,6 +10,7 @@ pub enum Message {
Settings(usize, SettingsMessage),
CreateSpend(CreateSpendMessage),
Next,
Previous,
}
#[derive(Debug, Clone)]

View File

@ -273,7 +273,9 @@ pub fn modal<'a, T: Into<Element<'a, Message>>>(
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)

View File

@ -83,3 +83,37 @@ pub fn recipient_view<'a>(
.width(Length::Fill)
.into()
}
pub fn choose_feerate_view<'a>(
feerate: &form::Value<String>,
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),
)
}