use leptos::prelude::*;
use orbital_core_components::{TimePicker, TimePickerAppearance, TimePickerBind};
use orbital_macros::component_doc;
use orbital_theme::use_theme_options;
use crate::building_blocks::{
TimeRangeField, TimeRangeFieldAppearance, TimeRangeFieldBind, TimeRangePickerAppearance,
TimeRangePickerBind,
};
use crate::shared::{
datetime_range_picker_row_class, layout_root_classes, picker_style_sheet, use_range_coordinator,
};
#[component_doc(
category = "Calendar & Time",
preview_slug = "time-range-picker",
preview_label = "Time Range Picker",
preview_icon = icondata::AiFieldTimeOutlined,
)]
#[component]
pub fn TimeRangePicker(
#[prop(optional, into)]
bind: TimeRangePickerBind,
#[prop(optional, into)]
appearance: TimeRangePickerAppearance,
#[prop(optional, into)]
class: MaybeProp<String>,
) -> impl IntoView {
let TimeRangePickerBind { value, id, name } = bind;
let TimeRangePickerAppearance {
format,
reference_date,
timezone,
disabled,
} = appearance;
let locale = crate::use_datetime_locale();
let theme_options = use_theme_options();
let value_stored = StoredValue::new(value);
let coordinator = use_range_coordinator(value_stored.with_value(|v| v.clone()));
let resolved_reference = Signal::derive(move || reference_date.get());
let field_bind = TimeRangeFieldBind {
value: value_stored.with_value(|v| v.clone()),
id,
name,
};
let field_appearance = TimeRangeFieldAppearance {
format,
reference_date: resolved_reference,
timezone,
minute_step: Signal::from(1),
disabled,
};
let start_picker_appearance = TimePickerAppearance {
format,
reference_date: Signal::derive(move || Some(reference_date.get())),
timezone,
disabled,
};
let end_picker_appearance = TimePickerAppearance {
format,
reference_date: Signal::derive(move || Some(reference_date.get())),
timezone,
disabled,
};
let root_class = move || {
let mut parts = vec![layout_root_classes(theme_options.get().density)];
if let Some(extra) = class.get() {
if !extra.is_empty() {
parts.push(extra);
}
}
let _ = locale.reference_date;
parts.join(" ")
};
view! {
<style>{picker_style_sheet()}</style>
<div class=root_class data-orbital-picker="">
<TimeRangeField bind=field_bind appearance=field_appearance />
<div class=datetime_range_picker_row_class()>
<TimePicker bind=TimePickerBind::new(coordinator.start) appearance=start_picker_appearance />
<TimePicker bind=TimePickerBind::new(coordinator.end) appearance=end_picker_appearance />
</div>
</div>
}
}