"use client"; import { FIXED_TIMELINE_END_YEAR, FIXED_TIMELINE_START_YEAR, clampYearValue } from "@/uhm/lib/utils/timeline"; import styles from "@/styles/TimelineBar.module.css"; type Props = { year: number; onYearChange: (year: number) => void; timeRange?: number; onTimeRangeChange?: (range: number) => void; isLoading: boolean; disabled: boolean; statusText?: string | null; filterEnabled?: boolean; onFilterEnabledChange?: (enabled: boolean) => void; style?: React.CSSProperties; }; export default function TimelineBar({ year, onYearChange, timeRange, onTimeRangeChange, isLoading, disabled, statusText, filterEnabled, onFilterEnabledChange, style, }: Props) { const lower = FIXED_TIMELINE_START_YEAR; const upper = FIXED_TIMELINE_END_YEAR; const effectiveDisabled = disabled; const safeYear = clampYearValue(year, lower, upper); const helperText = isLoading ? "Đang tải geometry theo mốc thời gian..." : statusText || null; const handleYearChange = (nextYear: number) => { onYearChange(clampYearValue(Math.trunc(nextYear), lower, upper)); }; const handleTimeRangeChange = (nextValue: number) => { if (!onTimeRangeChange) return; const safe = Number.isFinite(nextValue) ? Math.trunc(nextValue) : 0; onTimeRangeChange(Math.max(0, Math.min(30, safe))); }; return (
{typeof filterEnabled === "boolean" && onFilterEnabledChange ? ( ) : null} {formatYear(lower)} handleYearChange(Number(event.target.value))} disabled={effectiveDisabled} className={styles.slider} aria-label="Timeline year" /> {formatYear(upper)} handleYearChange(Number(event.target.value))} disabled={effectiveDisabled} className={styles.numberInput} aria-label="Timeline exact year" /> {typeof timeRange === "number" && onTimeRangeChange ? ( ) : null}
); } function formatYear(year: number): string { if (year < 0) { return `${Math.abs(year)} TCN`; } return `${year}`; }