"use client"; type Props = { year: number; onYearChange: (year: number) => void; isLoading: boolean; disabled: boolean; statusText?: string | null; }; const FIXED_TIMELINE_START_YEAR = -2000; const FIXED_TIMELINE_END_YEAR = 2000; export default function TimelineBar({ year, onYearChange, isLoading, disabled, statusText, }: Props) { const lower = FIXED_TIMELINE_START_YEAR; const upper = FIXED_TIMELINE_END_YEAR; const effectiveDisabled = disabled; const safeYear = clampYear(year, lower, upper); const helperText = isLoading ? "Đang tải geometry theo mốc thời gian..." : statusText || "Kéo thanh hoặc nhập số năm để query chính xác."; const handleYearChange = (nextYear: number) => { onYearChange(clampYear(Math.trunc(nextYear), lower, upper)); }; return (
Timeline {formatYear(safeYear)}
Mốc thời gian chi tiết
handleYearChange(Number(event.target.value))} disabled={effectiveDisabled} aria-label="Timeline year" style={{ width: "100%", accentColor: "#22c55e", cursor: effectiveDisabled ? "not-allowed" : "pointer", opacity: effectiveDisabled ? 0.6 : 1, }} /> handleYearChange(Number(event.target.value))} disabled={effectiveDisabled} aria-label="Timeline exact year" style={{ width: "100%", border: "1px solid rgba(148, 163, 184, 0.45)", borderRadius: "6px", padding: "6px 8px", background: "rgba(15, 23, 42, 0.7)", color: "#f8fafc", fontSize: "13px", outline: "none", }} />
{formatYear(lower)} {helperText} {formatYear(upper)}
); } function clampYear(year: number, minYear: number, maxYear: number): number { if (year < minYear) return minYear; if (year > maxYear) return maxYear; return year; } function formatYear(year: number): string { if (year < 0) { return `${Math.abs(year)} TCN`; } return `${year}`; }