Add choose feerate step
This commit is contained in:
parent
5b9414260b
commit
0b2f64279b
@ -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);
|
||||
}
|
||||
|
||||
@ -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(),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@ -10,6 +10,7 @@ pub enum Message {
|
||||
Settings(usize, SettingsMessage),
|
||||
CreateSpend(CreateSpendMessage),
|
||||
Next,
|
||||
Previous,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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),
|
||||
)
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user