---
import { defined } from "@utils/anonymous";
interface Props {
date?: Date;
years: number[];
months: number[];
days?: number[];
}
const { date, years, months, days } = Astro.props;
const dateParts = Astro.params.date?.split("/").map(Number);
const y = dateParts?.[0];
const m = dateParts?.[1];
const d = dateParts?.[2];
let yI = 0;
let mI = 0;
let dI = 0;
const list = new Intl.ListFormat("pt-PT", { type: "unit", style: "narrow" });
const pad = (n: number) => String(n).padStart(2, "0");
---
Anos:{" "}
{
list.formatToParts(
years.sort().map((y) =>
new Intl.DateTimeFormat("pt-PT", { year: "numeric" }).format(
new Date(
Date.UTC(
y,
0,
3,
...[
date === undefined
? undefined
: date.getTimezoneOffset() / 60,
date === undefined
? undefined
: date.getTimezoneOffset() % 60,
].filter(defined),
),
),
)
),
).map(({ type, value }: { type: string; value: string }) => {
switch (type) {
case "element": {
const year = years[yI++];
return (
{value}
);
}
case "literal": {
return {value} ;
}
}
})
}
{
y && (
<>
Meses:{" "}
{
list.formatToParts(
months.sort().map((m) =>
new Intl.DateTimeFormat("pt-PT", { month: "short" }).format(
new Date(
Date.UTC(
y,
m - 1,
3,
...[
date === undefined
? undefined
: date.getTimezoneOffset() / 60,
date === undefined
? undefined
: date.getTimezoneOffset() % 60,
].filter(defined),
),
),
)
),
).map(({ type, value }: { type: string; value: string }) => {
switch (type) {
case "element": {
const month = months[mI++];
return (
{value}
);
}
case "literal": {
return {value} ;
}
}
})
}
>
)
}
{
days &&
(
<>
Dias:{" "}
{
y && m &&
list.formatToParts(
days.sort().map((d) => {
return new Intl.DateTimeFormat("pt-PT", {
day: "numeric",
})
.format(
new Date(
Date.UTC(
y,
m - 1,
d,
...[
date === undefined
? undefined
: date.getTimezoneOffset() / 60,
date === undefined
? undefined
: date.getTimezoneOffset() % 60,
].filter(defined),
),
),
);
}),
).map(
({ type, value }: { type: string; value: string }) => {
switch (type) {
case "element": {
const day = days[dI++];
return (
{value}
);
}
case "literal": {
return {value} ;
}
}
},
)
}
>
)
}