use leptos::prelude::*;
use orbital_base_components::DatetimeFormat;
use orbital_macros::component_doc;
use orbital_theme::use_theme_options;
use super::datetime_field_coordinator::use_datetime_field_coordinator;
use crate::building_blocks::{
DateField, DateFieldAppearance, DateTimeFieldAppearance, DateTimeFieldBind, TimeField,
TimeFieldAppearance,
};
use crate::shared::{datetime_field_row_class, picker_style_sheet};
#[component_doc(
category = "Calendar & Time",
preview_slug = "date-time-field",
preview_label = "Date Time Field",
preview_icon = icondata::AiFieldTimeOutlined,
)]
#[component]
pub fn DateTimeField(
#[prop(optional, into)]
bind: DateTimeFieldBind,
#[prop(optional, into)]
appearance: DateTimeFieldAppearance,
#[prop(optional, into)]
class: MaybeProp<String>,
) -> impl IntoView {
let DateTimeFieldBind { value, id, name } = bind;
let DateTimeFieldAppearance {
date_format,
time_format,
timezone,
disabled,
} = appearance;
let locale = crate::use_datetime_locale();
let theme_options = use_theme_options();
let fallback_reference = Signal::derive(move || locale.reference_date);
let coordinator = use_datetime_field_coordinator(value, id, name, fallback_reference);
let resolved_date_format = Signal::derive(move || match date_format.get() {
DatetimeFormat::Time24 | DatetimeFormat::Time12 => locale.default_format,
other => other,
});
let date_appearance = DateFieldAppearance {
format: resolved_date_format,
timezone,
disabled,
};
let time_appearance = TimeFieldAppearance {
format: time_format,
reference_date: coordinator.reference_date,
timezone,
disabled,
..Default::default()
};
let root_class = move || {
let mut parts = Vec::new();
if let Some(extra) = class.get() {
if !extra.is_empty() {
parts.push(extra);
}
}
let _ = theme_options.get();
parts.join(" ")
};
view! {
<style>{picker_style_sheet()}</style>
<div class=root_class data-orbital-picker="">
<div class=datetime_field_row_class()>
<DateField bind=coordinator.date_bind appearance=date_appearance />
<TimeField bind=coordinator.time_bind appearance=time_appearance />
</div>
</div>
}
}