improve date presentation in event list view
This commit is contained in:
@ -37,7 +37,7 @@ const EventList = ({ events }: { events: EventFragment[] }) => {
|
|||||||
return (
|
return (
|
||||||
<ul className={styles.eventList}>
|
<ul className={styles.eventList}>
|
||||||
{events.map((event) => (
|
{events.map((event) => (
|
||||||
<EventItem key={event.id} event={event} />
|
<EventItem key={event.id} event={event} mode="list" />
|
||||||
))}
|
))}
|
||||||
</ul>
|
</ul>
|
||||||
);
|
);
|
||||||
|
@ -3,7 +3,11 @@
|
|||||||
import styles from "./eventItem.module.scss";
|
import styles from "./eventItem.module.scss";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
import Image from "../general/Image";
|
import Image from "../general/Image";
|
||||||
import { SingularEvent, EventFragment } from "@/lib/event";
|
import {
|
||||||
|
SingularEvent,
|
||||||
|
EventFragment,
|
||||||
|
getClosestOccurrence,
|
||||||
|
} from "@/lib/event";
|
||||||
import { toLocalTime, formatDate, commonDateFormat } from "@/lib/date";
|
import { toLocalTime, formatDate, commonDateFormat } from "@/lib/date";
|
||||||
|
|
||||||
export const EventItem = ({
|
export const EventItem = ({
|
||||||
@ -15,6 +19,8 @@ export const EventItem = ({
|
|||||||
mode: "list" | "calendar";
|
mode: "list" | "calendar";
|
||||||
size?: "small" | "medium" | "large";
|
size?: "small" | "medium" | "large";
|
||||||
}) => {
|
}) => {
|
||||||
|
const nextOccurrence = getClosestOccurrence(event);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<li
|
<li
|
||||||
className={`${styles.eventItem} ${
|
className={`${styles.eventItem} ${
|
||||||
@ -34,12 +40,19 @@ export const EventItem = ({
|
|||||||
</div>
|
</div>
|
||||||
<div className={styles.text}>
|
<div className={styles.text}>
|
||||||
<h1 className={styles.title}>{event.title}</h1>
|
<h1 className={styles.title}>{event.title}</h1>
|
||||||
{event.occurrence?.start && mode === "list" && (
|
{mode === "list" && nextOccurrence && (
|
||||||
<p className={styles.details}>
|
<p className={styles.details}>
|
||||||
{formatDate(event.occurrence?.start, commonDateFormat)}
|
{event.occurrences.length === 1 &&
|
||||||
|
formatDate(nextOccurrence.start, commonDateFormat)}
|
||||||
|
{event.occurrences.length > 1 && nextOccurrence && (
|
||||||
|
<span>
|
||||||
|
<em>Neste:</em>{" "}
|
||||||
|
{formatDate(nextOccurrence.start, commonDateFormat)}
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
</p>
|
</p>
|
||||||
)}
|
)}
|
||||||
{event.occurrence?.start && mode === "calendar" && (
|
{mode === "calendar" && event.occurrence?.start && (
|
||||||
<p className={styles.details}>
|
<p className={styles.details}>
|
||||||
{formatDate(event.occurrence?.start, "'kl.' HH:mm")}
|
{formatDate(event.occurrence?.start, "'kl.' HH:mm")}
|
||||||
</p>
|
</p>
|
||||||
|
@ -5,9 +5,12 @@ import {
|
|||||||
getWeek,
|
getWeek,
|
||||||
getDate,
|
getDate,
|
||||||
endOfWeek,
|
endOfWeek,
|
||||||
|
startOfToday,
|
||||||
startOfWeek,
|
startOfWeek,
|
||||||
|
isAfter,
|
||||||
eachDayOfInterval,
|
eachDayOfInterval,
|
||||||
addWeeks,
|
addWeeks,
|
||||||
|
parseISO,
|
||||||
} from "date-fns";
|
} from "date-fns";
|
||||||
import { toLocalTime, formatDate } from "./date";
|
import { toLocalTime, formatDate } from "./date";
|
||||||
import { graphql } from "@/gql";
|
import { graphql } from "@/gql";
|
||||||
@ -145,3 +148,17 @@ export function organizeEventsByDate(events: SingularEvent[]): EventsByDate {
|
|||||||
|
|
||||||
return eventsByDate;
|
return eventsByDate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function getClosestOccurrence(event: EventFragment) {
|
||||||
|
const today = startOfToday();
|
||||||
|
const occurrences = event?.occurrences ?? [];
|
||||||
|
|
||||||
|
const futureOccurrences = occurrences.filter((occurrence) =>
|
||||||
|
isAfter(toLocalTime(occurrence.start), today)
|
||||||
|
);
|
||||||
|
futureOccurrences.sort(
|
||||||
|
(a, b) => parseISO(a.start).getTime() - parseISO(b.start).getTime()
|
||||||
|
);
|
||||||
|
|
||||||
|
return futureOccurrences[0];
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user