|
|
|
@ -19,11 +19,33 @@ function parseDateParts(dateValue: string): { |
|
|
|
month: string; |
|
|
|
day: string; |
|
|
|
} { |
|
|
|
const parts = dateValue ? dateValue.split("-") : []; |
|
|
|
if (typeof dateValue !== "string") { |
|
|
|
return { year: "", month: "", day: "" }; |
|
|
|
} |
|
|
|
const parts = dateValue.trim().split("-"); |
|
|
|
if (parts.length !== 3) { |
|
|
|
return { year: "", month: "", day: "" }; |
|
|
|
} |
|
|
|
const [y, m, d] = parts; |
|
|
|
const yearNum = Number.parseInt(y, 10); |
|
|
|
const monthNum = Number.parseInt(m, 10); |
|
|
|
const dayNum = Number.parseInt(d, 10); |
|
|
|
if ( |
|
|
|
Number.isNaN(yearNum) || |
|
|
|
Number.isNaN(monthNum) || |
|
|
|
Number.isNaN(dayNum) || |
|
|
|
yearNum <= 0 || |
|
|
|
monthNum < 1 || |
|
|
|
monthNum > 12 || |
|
|
|
dayNum < 1 || |
|
|
|
dayNum > 31 |
|
|
|
) { |
|
|
|
return { year: "", month: "", day: "" }; |
|
|
|
} |
|
|
|
return { |
|
|
|
year: parts[0] || "", |
|
|
|
month: parts[1] || "", |
|
|
|
day: parts[2] || "", |
|
|
|
year: y, |
|
|
|
month: m.padStart(2, "0"), |
|
|
|
day: d.padStart(2, "0"), |
|
|
|
}; |
|
|
|
} |
|
|
|
|
|
|
|
@ -70,16 +92,32 @@ export function QuestionDate({ question, disabled }: QuestionDateProps) { |
|
|
|
|
|
|
|
const displayDate = useMemo(() => { |
|
|
|
if (!year || !month || !day) return ""; |
|
|
|
const date = new Date( |
|
|
|
Number.parseInt(year, 10), |
|
|
|
Number.parseInt(month, 10) - 1, |
|
|
|
Number.parseInt(day, 10), |
|
|
|
); |
|
|
|
return new Intl.DateTimeFormat(`${locale}-u-ca-gregory`, { |
|
|
|
day: "numeric", |
|
|
|
month: "long", |
|
|
|
year: "numeric", |
|
|
|
}).format(date); |
|
|
|
const y = Number.parseInt(year, 10); |
|
|
|
const m = Number.parseInt(month, 10); |
|
|
|
const d = Number.parseInt(day, 10); |
|
|
|
if ( |
|
|
|
!y || |
|
|
|
!m || |
|
|
|
!d || |
|
|
|
Number.isNaN(y) || |
|
|
|
Number.isNaN(m) || |
|
|
|
Number.isNaN(d) |
|
|
|
) { |
|
|
|
return ""; |
|
|
|
} |
|
|
|
const date = new Date(y, m - 1, d); |
|
|
|
if (Number.isNaN(date.getTime()) || !Number.isFinite(date.getTime())) { |
|
|
|
return ""; |
|
|
|
} |
|
|
|
try { |
|
|
|
return new Intl.DateTimeFormat(`${locale}-u-ca-gregory`, { |
|
|
|
day: "numeric", |
|
|
|
month: "long", |
|
|
|
year: "numeric", |
|
|
|
}).format(date); |
|
|
|
} catch { |
|
|
|
return ""; |
|
|
|
} |
|
|
|
}, [year, month, day, locale]); |
|
|
|
|
|
|
|
const openSheet = () => { |
|
|
|
|