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
This commit is contained in:
@@ -0,0 +1,38 @@
|
||||
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 }))
|
||||
}
|
||||
Reference in New Issue
Block a user