nigig-org/crates/apps/nigig-pay-ui/src/fee_band.rs
2026-07-26 19:38:26 +03:00

84 lines
2.7 KiB
Rust
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//! `FeeBandPreview` — M-Pesa fee band preview card.
use makepad_widgets::*;
use robius_ussd::{TransactionKind, mpesa_band_for_kind_amount, mpesa_fee_for_kind_amount};
#[derive(Script, ScriptHook, Widget)]
pub struct FeeBandPreview {
#[deref]
view: View,
}
impl Widget for FeeBandPreview {
fn handle_event(&mut self, cx: &mut Cx, event: &Event, scope: &mut Scope) {
self.view.handle_event(cx, event, scope);
}
fn draw_walk(&mut self, cx: &mut Cx2d, scope: &mut Scope, walk: Walk) -> DrawStep {
self.view.draw_walk(cx, scope, walk)
}
}
impl FeeBandPreviewRef {
/// Updates the band + fee labels for the given kind + amount.
pub fn update(&self, cx: &mut Cx, kind: TransactionKind, amount: u64) {
if let Some(inner) = self.borrow() {
let band_text = match mpesa_band_for_kind_amount(kind, amount) {
Some(b) => {
let fee = b.fee;
if fee == 0 {
format!("Band: KSh {}–{} → Fee: Free", b.min, b.max)
} else {
format!("Band: KSh {}–{} → Fee: KSh {}", b.min, b.max, fee)
}
}
None => {
if amount == 0 {
"Band: — → Fee: — (enter amount)".to_string()
} else {
format!("KSh {} outside supported range", amount)
}
}
};
inner.view.label(cx, ids!(band_label)).set_text(cx, &band_text);
let fee_text = match mpesa_fee_for_kind_amount(kind, amount) {
Some(0) => "Free".to_string(),
Some(f) => format!("KSh {}", f),
None => "—".to_string(),
};
inner.view.label(cx, ids!(fee_label)).set_text(cx, &fee_text);
}
}
}
script_mod! {
use mod.prelude.widgets.*
use mod.widgets.*
mod.widgets.FeeBandPreview = #(FeeBandPreview::register_widget(vm)) {
..mod.widgets.RoundedView
width: Fill, height: Fit
flow: Down, spacing: 4
padding: 12
show_bg: true
draw_bg +: {
color: #xFFFFFF12
border_radius: 12.0
border_size: 1.0
border_color: #xFFFFFF20
}
band_label := Label {
width: Fill
text: "Band: — → Fee: — (enter amount)"
draw_text +: { color: #xB7B7B7, text_style: theme.font_regular { font_size: 11.0 } }
}
fee_label := Label {
width: Fit
text: "—"
draw_text +: { color: #x138808, text_style: theme.font_bold { font_size: 16.0 } }
}
}
}