gui: change home warning

close #439
This commit is contained in:
edouard 2023-04-21 17:07:35 +02:00
parent fd67c5dea8
commit 56e1aa04aa
3 changed files with 84 additions and 75 deletions

View File

@ -48,8 +48,8 @@ pub struct Home {
wallet: Arc<Wallet>,
balance: Amount,
unconfirmed_balance: Amount,
recovery_warning: Option<(Amount, usize)>,
recovery_alert: Option<(Amount, usize)>,
remaining_sequence: Option<u32>,
number_of_expiring_coins: usize,
pending_events: Vec<HistoryTransaction>,
events: Vec<HistoryTransaction>,
selected_event: Option<usize>,
@ -74,8 +74,8 @@ impl Home {
wallet,
balance,
unconfirmed_balance,
recovery_alert: None,
recovery_warning: None,
remaining_sequence: None,
number_of_expiring_coins: 0,
selected_event: None,
events: Vec::new(),
pending_events: Vec::new(),
@ -106,8 +106,8 @@ impl State for Home {
view::home::home_view(
&self.balance,
&self.unconfirmed_balance,
self.recovery_warning.as_ref(),
self.recovery_alert.as_ref(),
&self.remaining_sequence,
self.number_of_expiring_coins,
&self.pending_events,
&self.events,
),
@ -127,8 +127,8 @@ impl State for Home {
self.warning = None;
self.balance = Amount::from_sat(0);
self.unconfirmed_balance = Amount::from_sat(0);
let mut recovery_warning = (Amount::from_sat(0), 0);
let mut recovery_alert = (Amount::from_sat(0), 0);
self.remaining_sequence = None;
self.number_of_expiring_coins = 0;
for coin in coins {
if coin.spend_info.is_none() {
if coin.block_height.is_some() {
@ -136,24 +136,22 @@ impl State for Home {
let timelock = self.wallet.main_descriptor.first_timelock_value();
let seq =
remaining_sequence(&coin, cache.blockheight as u32, timelock);
if seq == 0 {
recovery_alert.0 += coin.amount;
recovery_alert.1 += 1;
} else if seq < timelock as u32 * 10 / 100 {
recovery_warning.0 += coin.amount;
recovery_warning.1 += 1;
// number of block in a day
if seq <= 144 {
self.number_of_expiring_coins += 1;
}
if let Some(last) = &mut self.remaining_sequence {
if seq < *last {
*last = seq
}
} else {
self.remaining_sequence = Some(seq);
}
} else {
self.unconfirmed_balance += coin.amount;
}
}
}
if recovery_warning.1 > 0 {
self.recovery_warning = Some(recovery_warning);
}
if recovery_alert.1 > 0 {
self.recovery_alert = Some(recovery_alert);
}
}
},
Message::HistoryTransactions(res) => match res {

View File

@ -202,31 +202,33 @@ pub fn coin_sequence_label<'a, T: 'a>(seq: u32, timelock: u32) -> Container<'a,
}
}
/// returns y,m,d,h,m
pub fn expire_message(sequence: u32) -> String {
let mut n_minutes = sequence * 10;
if n_minutes <= 1440 {
if sequence <= 144 {
"Expires today".to_string()
} else if n_minutes <= 2 * 1440 {
} else if sequence <= 2 * 144 {
"Expires in ≈ 2 days".to_string()
} else {
let n_years = n_minutes / 525960;
n_minutes -= n_years * 525960;
let n_months = n_minutes / 43830;
n_minutes -= n_months * 43830;
let n_days = n_minutes / 1440;
let units: Vec<String> = [(n_years, "year"), (n_months, "month"), (n_days, "day")]
.iter()
.filter_map(|(n, u)| {
if *n != 0 {
Some(format!("{} {}{}", n, u, if *n > 1 { "s" } else { "" }))
} else {
None
}
})
.collect();
format!("Expires in {}", units.join(","))
format!("Expires in {}", expire_message_units(sequence).join(","))
}
}
/// returns y,m,d
pub fn expire_message_units(sequence: u32) -> Vec<String> {
let mut n_minutes = sequence * 10;
let n_years = n_minutes / 525960;
n_minutes -= n_years * 525960;
let n_months = n_minutes / 43830;
n_minutes -= n_months * 43830;
let n_days = n_minutes / 1440;
[(n_years, "year"), (n_months, "month"), (n_days, "day")]
.iter()
.filter_map(|(n, u)| {
if *n != 0 {
Some(format!("{} {}{}", n, u, if *n > 1 { "s" } else { "" }))
} else {
None
}
})
.collect()
}

View File

@ -11,15 +11,18 @@ use liana_ui::{
widget::*,
};
use crate::{app::view::message::Message, daemon::model::HistoryTransaction};
use crate::{
app::view::{coins, message::Message},
daemon::model::HistoryTransaction,
};
pub const HISTORY_EVENT_PAGE_SIZE: u64 = 20;
pub fn home_view<'a>(
balance: &'a bitcoin::Amount,
unconfirmed_balance: &'a bitcoin::Amount,
recovery_warning: Option<&(bitcoin::Amount, usize)>,
recovery_alert: Option<&(bitcoin::Amount, usize)>,
remaining_sequence: &Option<u32>,
number_of_expiring_coins: usize,
pending_events: &[HistoryTransaction],
events: &Vec<HistoryTransaction>,
) -> Element<'a, Message> {
@ -40,39 +43,45 @@ pub fn home_view<'a>(
None
}),
)
.push_maybe(recovery_warning.map(|(a, c)| {
Row::new()
.spacing(15)
.align_items(Alignment::Center)
.push(icon::hourglass_icon().size(30).style(color::ORANGE))
.push(
.push_maybe(if number_of_expiring_coins == 0 {
remaining_sequence.map(|sequence| {
Container::new(
Row::new()
.spacing(5)
.push(text(format!(
"Recovery path will be soon available for {} coins",
c
)))
.push(text("("))
.push(amount(a))
.push(text(")")),
.spacing(15)
.align_items(Alignment::Center)
.push(
h4_regular(format!(
"Your next coin to expire will in ≈ {}",
coins::expire_message_units(sequence).join(",")
))
.width(Length::Fill),
)
.push(
icon::tooltip_icon()
.size(20)
.style(color::GREY_3)
.width(Length::Units(20)),
)
.width(Length::Fill),
)
.padding(10)
}))
.push_maybe(recovery_alert.map(|(a, c)| {
Row::new()
.spacing(15)
.align_items(Alignment::Center)
.push(icon::hourglass_done_icon().style(color::RED))
.push(
Row::new()
.spacing(5)
.push(text(format!("Recovery path is available for {} coins", c)))
.push(text("("))
.push(amount(a))
.push(text(")")),
.padding(25)
.style(theme::Card::Border)
})
} else {
Some(
Container::new(
Row::new().spacing(15).align_items(Alignment::Center).push(
h4_regular(format!(
"You have {} coins that are already or about to be expired",
number_of_expiring_coins
))
.width(Length::Fill),
),
)
.padding(10)
}))
.padding(25)
.style(theme::Card::Invalid),
)
})
.push(
Column::new()
.spacing(10)