Files
web/apps/scandic-web/components/Blocks/DynamicContent/Stays/utils/groupStaysByYear.ts
Chuma Mcphoy (We Ahead) f40035baa9 Merged in LOY-493/Sidepeek-upcoming-stays (pull request #3315)
LOY-493/Sidepeek upcoming stays

* chore(LOY-493): Add icon to next stay card cta

* chore(LOY-493): better folder org for stays

* chore(LOY-494): more folder reorg

* feat(LOY-493): Implement Sidepeek for Upcoming Stays


Approved-by: Matilda Landström
2025-12-09 10:54:57 +00:00

39 lines
1.0 KiB
TypeScript

import { dt } from "@scandic-hotels/common/dt"
import type { Stay } from "@scandic-hotels/trpc/routers/user/output"
export interface StaysByYear {
year: number
stays: Stay[]
}
type SortOrder = "asc" | "desc"
/**
* Groups stays by year based on checkinDate.
* @param stays - Array of stays to group
* @param sortOrder - Sort order for years: "desc" (most recent first) or "asc" (earliest first). Defaults to "desc".
* @returns an array sorted by year in the specified order.
*/
export function groupStaysByYear(
stays: Stay[],
sortOrder: SortOrder = "desc"
): StaysByYear[] {
const groupedMap = new Map<number, Stay[]>()
for (const stay of stays) {
const year = dt(stay.attributes.checkinDate).year()
if (!groupedMap.has(year)) {
groupedMap.set(year, [])
}
groupedMap.get(year)!.push(stay)
}
return Array.from(groupedMap.entries())
.sort(([yearA], [yearB]) =>
sortOrder === "asc" ? yearA - yearB : yearB - yearA
)
.map(([year, stays]) => ({ year, stays }))
}