Check for duplicate recipient addresses

This commit is contained in:
edouard 2022-12-07 16:46:17 +01:00
parent 2aede0bc76
commit c222dfba95
2 changed files with 32 additions and 1 deletions

View File

@ -43,12 +43,33 @@ pub trait Step {
pub struct ChooseRecipients {
recipients: Vec<Recipient>,
is_valid: bool,
is_duplicate: bool,
}
impl std::default::Default for ChooseRecipients {
fn default() -> Self {
Self {
recipients: vec![Recipient::default()],
is_valid: false,
is_duplicate: false,
}
}
}
impl ChooseRecipients {
fn check_valid(&mut self) {
self.is_valid = !self.recipients.is_empty();
self.is_duplicate = false;
for (i, recipient) in self.recipients.iter().enumerate() {
if !recipient.valid() {
self.is_valid = false;
}
if !self.is_duplicate {
self.is_duplicate = self.recipients[..i]
.iter()
.any(|r| r.address.value == recipient.address.value);
}
}
}
}
@ -74,6 +95,8 @@ impl Step for ChooseRecipients {
}
_ => {}
}
self.check_valid();
}
Command::none()
}
@ -102,7 +125,8 @@ impl Step for ChooseRecipients {
.map(|r| r.amount().unwrap_or(0_u64))
.sum(),
),
!self.recipients.iter().any(|recipient| !recipient.valid()),
self.is_valid,
self.is_duplicate,
)
}
}

View File

@ -27,6 +27,7 @@ pub fn choose_recipients_view(
recipients: Vec<Element<Message>>,
total_amount: Amount,
is_valid: bool,
duplicate: bool,
) -> Element<Message> {
modal(
false,
@ -49,11 +50,17 @@ pub fn choose_recipients_view(
Some(
Container::new(
Row::new()
.spacing(20)
.align_items(Alignment::Center)
.push(
Container::new(text(format!("{}", total_amount)).bold())
.width(Length::Fill),
)
.push_maybe(if duplicate {
Some(text("Two recipient addresses are the same").style(color::WARNING))
} else {
None
})
.push(if is_valid {
button::primary(None, "Next")
.on_press(Message::Next)