organize events by day in UpcomingEvents

This commit is contained in:
2024-06-23 15:39:41 +02:00
parent 19d3866934
commit 50b08b874d
4 changed files with 70 additions and 33 deletions

View File

@ -8,7 +8,7 @@ import {
EventCategory,
SingularEvent,
getSingularEvents,
organizeEventsByDate,
organizeEventsInCalendar,
EventOrganizer,
} from "@/lib/event";
import { isTodayOrFuture } from "@/lib/date";
@ -141,7 +141,7 @@ const EventCalendar = ({ events }: { events: EventFragment[] }) => {
(x) => x.occurrence?.start && isTodayOrFuture(x.occurrence.start)
);
const eventsByDate = organizeEventsByDate(futureSingularEvents);
const eventsByDate = organizeEventsInCalendar(futureSingularEvents);
return (
<div className={styles.eventCalendar}>

View File

@ -18,7 +18,7 @@ export const EventItem = ({
size,
}: {
event: SingularEvent | EventFragment;
mode: "list" | "calendar" | "singular";
mode: "list" | "calendar" | "singular-time-only";
size?: "small" | "medium" | "large";
}) => {
const futureOccurrences = getFutureOccurrences(event);
@ -58,14 +58,7 @@ export const EventItem = ({
)}
</div>
)}
{mode === "singular" &&
"occurrence" in event &&
event.occurrence?.start && (
<p className={styles.dates}>
{formatExtendedDateTime(event.occurrence.start)}
</p>
)}
{mode === "calendar" &&
{(mode === "calendar" || mode === "singular-time-only") &&
"occurrence" in event &&
event.occurrence?.start && (
<p className={styles.dates}>

View File

@ -1,6 +1,11 @@
import { EventFragment } from "@/gql/graphql";
import { isTodayOrFuture } from "@/lib/date";
import { getSingularEvents, sortSingularEvents } from "@/lib/event";
import { isTodayOrFuture, formatDate } from "@/lib/date";
import { parse } from "date-fns";
import {
getSingularEvents,
organizeEventsByDate,
sortSingularEvents,
} from "@/lib/event";
import Link from "next/link";
import { EventItem } from "./EventItem";
import styles from "./upcomingEvents.module.scss";
@ -11,6 +16,8 @@ export const UpcomingEvents = ({ events }: { events: EventFragment[] }) => {
isTodayOrFuture(event.occurrence.start)
)
);
const sliced = upcomingSingularEvents.slice(0, 10);
const eventsByDate = organizeEventsByDate(sliced);
return (
<section className={styles.upcomingWrapper}>
@ -20,16 +27,31 @@ export const UpcomingEvents = ({ events }: { events: EventFragment[] }) => {
<span className="circle"></span>
Denne uka Chateau Neuf
</h2>
<ul className={styles.eventList}>
{upcomingSingularEvents.slice(0, 10).map((event) => (
<EventItem
key={`${event.id}-${event.occurrence.id}`}
event={event}
mode="singular"
size="medium"
/>
))}
</ul>
<div className={styles.eventList}>
{Object.keys(eventsByDate).map((day) => {
const eventsThisDay = eventsByDate[day];
return (
<div key={day}>
<h3>
{formatDate(
parse(day, "yyyy-MM-dd", new Date()),
"eeee dd.MM."
)}
</h3>
<ul>
{eventsThisDay.map((event) => (
<EventItem
key={`${event.id}-${event.occurrence.id}`}
event={event}
mode="singular-time-only"
size="medium"
/>
))}
</ul>
</div>
);
})}
</div>
<div className={styles.calendarLink}>
<Link href="/arrangementer?mode=calendar">Vis kalender &rarr;</Link>
</div>

View File

@ -143,7 +143,7 @@ export function sortSingularEvents(events: SingularEvent[]) {
compareDates(a.occurrence.start, b.occurrence.start)
);
}
interface EventsByDate {
interface EventCalendar {
[yearMonth: string]: {
[week: string]: {
[day: string]: SingularEvent[];
@ -151,10 +151,12 @@ interface EventsByDate {
};
}
export function organizeEventsByDate(events: SingularEvent[]): EventsByDate {
export function organizeEventsInCalendar(
events: SingularEvent[]
): EventCalendar {
const sortedEvents = sortSingularEvents(events);
const eventsByDate: EventsByDate = {};
const calendar: EventCalendar = {};
const minDate = new Date(sortedEvents[0]?.occurrence.start);
const maxDate = new Date(
@ -170,16 +172,16 @@ export function organizeEventsByDate(events: SingularEvent[]): EventsByDate {
end: endOfWeek(currentDate, { weekStartsOn: 1 }),
});
if (!eventsByDate[yearMonth]) {
eventsByDate[yearMonth] = {};
if (!calendar[yearMonth]) {
calendar[yearMonth] = {};
}
if (!eventsByDate[yearMonth][week]) {
eventsByDate[yearMonth][week] = {};
if (!calendar[yearMonth][week]) {
calendar[yearMonth][week] = {};
}
daysOfWeek.forEach((day) => {
const formattedDay = formatDate(day, "yyyy-MM-dd");
if (!eventsByDate[yearMonth][week][formattedDay]) {
eventsByDate[yearMonth][week][formattedDay] = [];
if (!calendar[yearMonth][week][formattedDay]) {
calendar[yearMonth][week][formattedDay] = [];
}
});
@ -191,7 +193,27 @@ export function organizeEventsByDate(events: SingularEvent[]): EventsByDate {
const yearMonth = formatDate(start, "yyyy-MM");
const week = formatDate(start, "w");
const day = formatDate(start, "yyyy-MM-dd");
eventsByDate[yearMonth][week][day].push(event);
calendar[yearMonth][week][day].push(event);
});
return calendar;
}
interface EventsByDate {
[day: string]: SingularEvent[];
}
export function organizeEventsByDate(events: SingularEvent[]): EventsByDate {
const sortedEvents = sortSingularEvents(events);
const eventsByDate: EventsByDate = {};
sortedEvents.forEach((event) => {
const start = toLocalTime(event.occurrence.start);
const day = formatDate(start, "yyyy-MM-dd");
if (!eventsByDate[day]) {
eventsByDate[day] = [];
}
eventsByDate[day].push(event);
});
return eventsByDate;