thaw 0.4.8

An easy to use leptos component library
Documentation
use super::PanelVariant;
use crate::{Button, ButtonAppearance, ButtonSize};
use chrono::{Datelike, NaiveDate};
use leptos::{html, prelude::*};
use thaw_components::FollowerInjection;

const MAX_YEAR: i32 = (i32::MAX >> 13) / 10 - 1;
const MIN_YEAR: i32 = (i32::MIN >> 13) / 10 + 1;

#[component]
pub fn YearPanel(
    date_panel_show_date: RwSignal<NaiveDate>,
    panel_variant: RwSignal<PanelVariant>,
) -> impl IntoView {
    let follower = FollowerInjection::expect_context();
    let panel_ref = NodeRef::<html::Div>::new();
    Effect::new(move || {
        let Some(_) = panel_ref.get() else {
            return;
        };
        follower.refresh_position();
    });
    let show_min_year = RwSignal::new(date_panel_show_date.get_untracked().year() / 10);
    let previous_year_range = move |_| {
        show_min_year.update(|year| {
            if *year > MIN_YEAR {
                *year -= 1;
            }
        });
    };
    let next_year_range = move |_| {
        show_min_year.update(|year| {
            if *year < MAX_YEAR {
                *year += 1;
            }
        });
    };
    view! {
        <div class="thaw-date-picker-year-panel" node_ref=panel_ref>
            <div class="thaw-date-picker-year-panel__header">
                <Button
                    appearance=ButtonAppearance::Transparent
                    size=ButtonSize::Small
                    icon=icondata_ai::AiArrowLeftOutlined
                    on_click=previous_year_range
                />
                <div>
                    {move || {
                        let year = show_min_year.get();
                        format!("{}0 - {}9", year, year)
                    }}

                </div>
                <Button
                    appearance=ButtonAppearance::Transparent
                    size=ButtonSize::Small
                    icon=icondata_ai::AiArrowRightOutlined
                    on_click=next_year_range
                />
            </div>
            <div class="thaw-date-picker-year-panel__years">

                {move || {
                    (-1..=10)
                        .map(|index| {
                            let year = show_min_year.get() * 10 + index;
                            let on_click = move |_| {
                                date_panel_show_date
                                    .update(|date| {
                                        *date = date.with_year(year).unwrap();
                                    });
                                panel_variant.set(PanelVariant::Month);
                            };
                            view! { <YearPanelItem date_panel_show_date year on:click=on_click /> }
                        })
                        .collect_view()
                }}

            </div>
        </div>
    }
}

#[component]
fn YearPanelItem(date_panel_show_date: RwSignal<NaiveDate>, year: i32) -> impl IntoView {
    let is_selected = Memo::new(move |_| date_panel_show_date.with(|date| date.year() == year));

    view! {
        <div
            class="thaw-date-picker-year-panel__item"
            class=("thaw-date-picker-year-panel__item--selected", move || is_selected.get())
        >
            <div class="thaw-date-picker-year-panel__item-year">{year}</div>
        </div>
    }
}