diff --git a/gui/src/app/state/settings/bitcoind.rs b/gui/src/app/state/settings/bitcoind.rs index a31ab761..b5c098cf 100644 --- a/gui/src/app/state/settings/bitcoind.rs +++ b/gui/src/app/state/settings/bitcoind.rs @@ -251,6 +251,7 @@ pub struct RescanSetting { year: form::Value, month: form::Value, day: form::Value, + invalid_date: bool, } impl From for Box { @@ -292,6 +293,7 @@ impl Setting for RescanSetting { } } view::SettingsEditMessage::FieldEdited(field, value) => { + self.invalid_date = false; if !self.processing && (value.is_empty() || u32::from_str(&value).is_ok()) { match field { "rescan_year" => self.year.value = value, @@ -302,12 +304,22 @@ impl Setting for RescanSetting { } } view::SettingsEditMessage::Confirm => { - let date_time = NaiveDate::from_ymd_opt( + let date_time = if let Some(date) = NaiveDate::from_ymd_opt( i32::from_str(&self.year.value).unwrap_or(1), u32::from_str(&self.month.value).unwrap_or(1), u32::from_str(&self.day.value).unwrap_or(1), - ) - .unwrap(); + ) { + if date < NaiveDate::from_str("2009-01-03").unwrap() { + self.invalid_date = true; + return Command::none(); + } else { + self.invalid_date = false; + date + } + } else { + self.invalid_date = true; + return Command::none(); + }; let t = date_time.and_hms_opt(0, 0, 0).unwrap().timestamp() as u32; self.processing = true; info!("Asking deamon to rescan with timestamp: {}", t); @@ -329,6 +341,7 @@ impl Setting for RescanSetting { self.success, self.processing, can_edit, + self.invalid_date, ) } } diff --git a/gui/src/app/view/settings.rs b/gui/src/app/view/settings.rs index 9b27fdce..14a18061 100644 --- a/gui/src/app/view/settings.rs +++ b/gui/src/app/view/settings.rs @@ -414,6 +414,7 @@ pub fn is_running_label<'a, T: 'a>(is_running: Option) -> Container<'a, T> } } +#[allow(clippy::too_many_arguments)] pub fn rescan<'a>( year: &form::Value, month: &form::Value, @@ -422,6 +423,7 @@ pub fn rescan<'a>( success: bool, processing: bool, can_edit: bool, + invalid_date: bool, ) -> Element<'a, SettingsEditMessage> { card::simple(Container::new( Column::new() @@ -479,8 +481,17 @@ pub fn rescan<'a>( .align_items(Alignment::Center) .spacing(10), ) + .push_maybe(if invalid_date { + Some( + p1_regular("Provided date is either invalid or anterior to the genesis block's timestamp.") + .style(color::RED), + ) + } else { + None + }) .push( if can_edit + && !invalid_date && !processing && (is_ok_and(&u32::from_str(&year.value), |&v| v > 0) && is_ok_and(&u32::from_str(&month.value), |&v| {