feat: Add media details sidebar and date handling features, including media grouping by date
This commit is contained in:
36
libertas-frontend/src/lib/date-utils.ts
Normal file
36
libertas-frontend/src/lib/date-utils.ts
Normal file
@@ -0,0 +1,36 @@
|
||||
import { format, parseISO, isToday, isYesterday } from "date-fns";
|
||||
import type { Media } from "@/domain/types";
|
||||
|
||||
/**
|
||||
* Groups a flat array of media items into a Map
|
||||
* where keys are human-readable date strings.
|
||||
* Assumes the media array is already sorted chronologically.
|
||||
*/
|
||||
export const groupMediaByDate = (
|
||||
media: Media[],
|
||||
): Map<string, Media[]> => { // <-- Return a Map
|
||||
return media.reduce(
|
||||
(acc, m) => {
|
||||
const dateString = m.date_taken ?? m.created_at;
|
||||
const date = parseISO(dateString);
|
||||
|
||||
let groupTitle: string;
|
||||
|
||||
if (isToday(date)) {
|
||||
groupTitle = "Today";
|
||||
} else if (isYesterday(date)) {
|
||||
groupTitle = "Yesterday";
|
||||
} else {
|
||||
// e.g., "November 2025"
|
||||
groupTitle = format(date, "MMMM yyyy");
|
||||
}
|
||||
|
||||
if (!acc.has(groupTitle)) {
|
||||
acc.set(groupTitle, []);
|
||||
}
|
||||
acc.get(groupTitle)!.push(m);
|
||||
return acc;
|
||||
},
|
||||
new Map<string, Media[]>(),
|
||||
);
|
||||
};
|
||||
Reference in New Issue
Block a user