use std::sync::Arc;
use leptos::prelude::*;
use orbital_base_components::{DatetimeFormat, DatetimeTimezone};
use crate::DateTimeRange;
#[derive(Clone, Copy)]
pub struct PickerFieldContext {
pub value: Signal<Option<DateTimeRange>>,
pub disabled: Signal<bool>,
pub format: Signal<DatetimeFormat>,
pub timezone: Signal<DatetimeTimezone>,
}
#[derive(Clone, Copy)]
struct PickerFieldInjection(Signal<PickerFieldContext>);
pub fn use_picker_field() -> PickerFieldContext {
use_context::<PickerFieldInjection>()
.expect("use_picker_field requires PickerFieldSlot on DateRangePicker")
.0
.get()
}
pub(crate) fn provide_picker_field(context: Signal<PickerFieldContext>) {
provide_context(PickerFieldInjection(context));
}
#[component]
pub fn PickerFieldSlotHost(
context: Signal<PickerFieldContext>,
children: ChildrenFn,
) -> impl IntoView {
provide_picker_field(context);
children()
}
#[derive(Default)]
pub struct PickerLayoutSlots {
pub toolbar: Option<PickerLayoutToolbarSlot>,
pub action_bar: Option<PickerLayoutActionBarSlot>,
}
impl PickerLayoutSlots {
pub fn from_slot_props(
toolbar: Option<PickerLayoutToolbarSlot>,
action_bar: Option<PickerLayoutActionBarSlot>,
) -> Self {
Self {
toolbar,
action_bar,
}
}
}
#[derive(Default)]
pub struct DateRangePickerSlots {
pub field: Option<PickerFieldSlot>,
pub open_trigger: Option<OpenTriggerSlot>,
}
impl DateRangePickerSlots {
pub fn from_slot_props(
field: Option<PickerFieldSlot>,
open_trigger: Option<OpenTriggerSlot>,
) -> Self {
Self {
field,
open_trigger,
}
}
}
#[slot]
pub struct PickerLayoutToolbarSlot {
pub(crate) children: ChildrenFn,
}
#[slot]
pub struct PickerLayoutActionBarSlot {
pub(crate) children: ChildrenFn,
}
#[slot]
pub struct PickerFieldSlot {
pub(crate) children: ChildrenFn,
}
#[slot]
pub struct OpenTriggerSlot {
pub(crate) children: ChildrenFn,
}
pub type CalendarDayRenderer =
Arc<dyn Fn(orbital_core_components::CalendarDayProps) -> AnyView + Send + Sync>;
pub type CalendarMonthButtonRenderer =
Arc<dyn Fn(orbital_core_components::CalendarMonthButtonProps) -> AnyView + Send + Sync>;