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
39 lines
1.0 KiB
TypeScript
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 }))
|
|
}
|