Skip to content

Commit e2753fd

Browse files
Update calendar view (#44)
Co-authored-by: Luc <[email protected]>
1 parent a0bd9f1 commit e2753fd

File tree

6 files changed

+347
-87
lines changed

6 files changed

+347
-87
lines changed

web/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
"cx": "^25.3.1",
4848
"date-fns": "^4.1.0",
4949
"eslint-config-prettier": "^10.1.2",
50+
"html-react-parser": "^5.2.5",
5051
"leaflet": "^1.9.4",
5152
"openapi-hooks": "0.0.6",
5253
"postcss": "^8.5.1",

web/pnpm-lock.yaml

Lines changed: 88 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import { format, isToday, isTomorrow, parseISO } from 'date-fns';
2+
import { FC } from 'react';
3+
4+
import { CalendarEvent } from '@/api/events';
5+
6+
import { MeetingCard } from './Meetings';
7+
8+
const DayHeader: FC<{ date: string }> = ({ date }) => {
9+
let prefix = format(date, 'MMM d');
10+
11+
if (isToday(date)) prefix = 'Today';
12+
13+
if (isTomorrow(date)) prefix = 'Tomorrow';
14+
15+
return (
16+
<h2 className="text-base text-primary py-2 mt-2 inline-block">
17+
<span className="font-semibold">{prefix} </span>
18+
<span className="font-normal text-primary/70">{format(date, 'EEEE')}</span>
19+
</h2>
20+
);
21+
};
22+
23+
export const CalendarDays: FC<{ data: CalendarEvent[] }> = ({ data }) => {
24+
const groupedDays = Object.values(
25+
data.reduce(
26+
(day, event) => {
27+
if (!event.start) return day;
28+
29+
const date = parseISO(event.start).toDateString();
30+
31+
if (!day[date]) {
32+
day[date] = { date, events: [] };
33+
}
34+
35+
day[date].events.push(event);
36+
37+
return day;
38+
},
39+
{} as Record<string, { date: string; events: CalendarEvent[] }>
40+
)
41+
);
42+
43+
return (
44+
<div>
45+
{groupedDays.map(({ date, events }) => (
46+
<div key={date} className="flex gap-1">
47+
{/* timeline */}
48+
<div className="relative flex flex-col items-center pl-3 pr-3">
49+
<div className="absolute top-6 h-2 w-2 rounded-full bg-grey" />
50+
<div className="absolute top-6 h-full border-r border-dashed border-primary" />
51+
</div>
52+
53+
<div className="flex-1">
54+
<DayHeader date={date} />
55+
56+
{/* meeting cards */}
57+
<div className="space-y-3 pb-1">
58+
{events.map((event) => (
59+
<MeetingCard key={`${event.uid}-${event.start}`} event={event} />
60+
))}
61+
</div>
62+
</div>
63+
</div>
64+
))}
65+
</div>
66+
);
67+
};

0 commit comments

Comments
 (0)