🦀/100 Projects/Notes/Source

src/lib.rs

View on GitHub
use yew::prelude::*;
use gloo_timers::callback::Timeout;
use wasm_bindgen::prelude::*;

#[derive(Clone, PartialEq)]
struct Metrics {
    users: u32,
    orders: u32,
    revenue: f64,
}

#[derive(Properties, PartialEq, Clone)]
struct MetricCardProps {
    pub label: String,
    pub value: String,
}

#[function_component(MetricCard)]
fn metric_card(props: &MetricCardProps) -> Html {
    html! {
        <div style="padding: 1em; border-radius: 8px; background: #f4f4f4; width: 30%; margin: 1%;">
            <h3>{ &props.label }</h3>
            <p style="font-size: 1.4em; font-weight: bold;">{ &props.value }</p>
        </div>
    }
}

#[function_component(App)]
fn app() -> Html {
    let data = use_state(|| Metrics {
        users: 0,
        orders: 0,
        revenue: 0.0,
    });

    {
        let data = data.clone();
        use_effect(move || {
            Timeout::new(1000, move || {
                data.set(Metrics {
                    users: 1324,
                    orders: 768,
                    revenue: 125430.75,
                });
            })
            .forget();
            || ()
        });
    }

    html! {
        <div style="font-family: sans-serif; padding: 2em;">
            <h1>{ "📊 Admin Dashboard" }</h1>
            <div style="display: flex; justify-content: space-between;">
                <MetricCard 
                    label={"Users".to_string()}
                    value={format!("{}", data.users)} 
                />
                <MetricCard 
                    label={"Orders".to_string()}
                    value={format!("{}", data.orders)} 
                />
                <MetricCard 
                    label={"Revenue".to_string()}
                    value={format!("${:.2}", data.revenue)} 
                />
            </div>
        </div>
    }
}

#[wasm_bindgen(start)]
pub fn run_app() {
    yew::Renderer::<App>::new().render();
}

← Back to folder