Skip to content

Commit 08106e9

Browse files
committed
Add calendar button
1 parent ca6eef4 commit 08106e9

3 files changed

Lines changed: 145 additions & 126 deletions

File tree

src/app/schedule/page.js

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,6 @@ export default function Schedule() {
7070
{/* Render time slot */}
7171
<div className="text-2xl lg:text-xl tabular-nums text-neutral-950">
7272
<span className="opacity-80">{timeSlot.startTime}</span>
73-
<span className={`${tags.length === 0 && 'xl:block'} opacity-50`}>
74-
<span className={tags.length === 0 && "xl:hidden"}> - </span>
75-
{timeSlot.endTime}
76-
</span>
7773
</div>
7874

7975
{/* Render sessions within the same time slot */}

src/components/elements/ScheduleSessionCard.js

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,20 @@
11
// Session component
2+
import { scheduleData } from '@/data/scheduleData';
23
import { sessions2024Data } from '@/data/sessions2024Data';
34
import { speakers2024 } from '@/data/speakers2024Data';
4-
import { scheduleData } from '@/data/scheduleData';
55
import Image from 'next/image';
6-
import { FaRegIdBadge } from 'react-icons/fa';
6+
import Link from 'next/link';
7+
import { FaCalendarPlus, FaRegIdBadge } from 'react-icons/fa';
78
import { MdOutlineFastfood } from 'react-icons/md';
8-
import { TbNotes } from 'react-icons/tb';
99
import { PiCoffee } from 'react-icons/pi';
10-
import Link from 'next/link';
10+
import { TbNotes } from 'react-icons/tb';
11+
12+
function generateGoogleCalendarLink(event) {
13+
const startTime = (event.start).toISOString().replace(/-|:|\.\d+/g, "");
14+
const endTime = (event.end).toISOString().replace(/-|:|\.\d+/g, "");
15+
16+
return `https://www.google.com/calendar/render?action=TEMPLATE&text=${encodeURIComponent(event.title)}&dates=${startTime}/${endTime}&details=${encodeURIComponent(event.description)}&location=${encodeURIComponent(event.location)}`;
17+
}
1118

1219
export const ScheduleSessionCard = ({ timeSlot, session, sessionIndex }) => {
1320
const sessionDetails = sessions2024Data.find(
@@ -34,8 +41,24 @@ export const ScheduleSessionCard = ({ timeSlot, session, sessionIndex }) => {
3441
className={`p-5 relative h-full flex flex-col overflow-hidden justify-between border border-[#e2e2e2] hover:bg-[#f7f7f7] hover:cursor-pointer rounded-lg text-left ${sessionClassName}`}
3542
>
3643
<div className="flex flex-col justify-between items-start"> {/* Add a flex container */}
37-
<div className="flex items-center gap-2">
38-
{room?.name}
44+
<div className="flex flex-row justify-between w-full">
45+
<div className="flex items-center gap-2">
46+
{room?.name}
47+
</div>
48+
<div>{!timeSlot.icon &&
49+
<FaCalendarPlus className="w-6 h-6 text-[#424242]"
50+
onClick={() => {
51+
const link = generateGoogleCalendarLink({
52+
title: `${room?.name}: ${sessionDetails?.title}`,
53+
start: new Date(`2024-11-09T${timeSlot.startTime}-05:00`),
54+
end: new Date(`2024-11-09T${timeSlot.endTime}-05:00`),
55+
description: sessionDetails?.description,
56+
location: room?.name,
57+
});
58+
window.open(link, '_blank');
59+
}}
60+
/>}
61+
</div>
3962
</div>
4063
<h5 className="text-xl mb-2 tracking-normal text-[#424242]">
4164
{sessionDetails?.title || 'Session Title'}

src/data/scheduleData.js

Lines changed: 116 additions & 116 deletions
Original file line numberDiff line numberDiff line change
@@ -3,121 +3,121 @@ import { speakers2024 } from './speakers2024Data';
33
import { sessions2024Data } from './sessions2024Data';
44

55
export const scheduleData =
6-
{
7-
date: '2024-11-09',
8-
dateReadable: 'November 9',
9-
rooms: [
10-
{ uuid: 'f9ed81db-f90a-42d4-b7e4-d554d8f338fd', name: 'Room 1' },
11-
{ uuid: '03daa4f4-7d63-42dd-b133-9194f298e194', name: 'Room 2' },
12-
{ uuid: '1b974777-55d4-4741-8fff-920d5a292385', name: 'Room 3' },
13-
{ uuid: 'cba79f3f-3e12-4f15-bb42-e17652efae58', name: '' },
14-
],
15-
timeSlots: [
16-
{
17-
startTime: '08:30',
18-
endTime: '09:30',
19-
sessions: [
20-
{ roomUUID: 'cba79f3f-3e12-4f15-bb42-e17652efae58', sessionUUID: '246a17da-adf9-4d8e-9c50-ef84bdf68c55' },
21-
],
22-
commonAllRooms: true,
23-
icon: 'FaRegIdBadge',
24-
}, {
25-
startTime: '09:30',
26-
endTime: '10:00',
27-
sessions: [
28-
{ roomUUID: 'cba79f3f-3e12-4f15-bb42-e17652efae58', sessionUUID: '4d0cb762-4de4-43cf-b4ea-f02bcfa5b559' },
29-
],
30-
commonAllRooms: true,
31-
icon: 'TbNotes',
32-
}, {
33-
startTime: '10:00',
34-
endTime: '10:45',
35-
sessions: [
36-
{ roomUUID: 'f9ed81db-f90a-42d4-b7e4-d554d8f338fd', sessionUUID: '08c71152-c552-42e7-b094-f510ff44e9d0' },
37-
{ roomUUID: '03daa4f4-7d63-42dd-b133-9194f298e194', sessionUUID: '5108babc-bf35-44d5-a9ba-de08badfa80a' },
38-
{ roomUUID: '1b974777-55d4-4741-8fff-920d5a292385', sessionUUID: '08c71152-c552-42e7-b094-f510ff44e9cb' },
39-
],
40-
}, {
41-
startTime: '10:45',
42-
endTime: '11:00',
43-
sessions: [
44-
{ roomUUID: 'cba79f3f-3e12-4f15-bb42-e17652efae58', sessionUUID: '27ff7729-5792-4efd-a813-321fd6523e63' },
45-
],
46-
commonAllRooms: true,
47-
icon: 'MdOutlineFastfood',
48-
},
49-
{
50-
startTime: '11:00',
51-
endTime: '11:45',
52-
sessions: [
53-
{ roomUUID: 'f9ed81db-f90a-42d4-b7e4-d554d8f338fd', sessionUUID: '08c71152-c552-42e7-b094-f510ff44e9cc' },
54-
{ roomUUID: '03daa4f4-7d63-42dd-b133-9194f298e194', sessionUUID: 'a47442e6-ff57-43ca-af40-7e2b4d46f93d' },
55-
{ roomUUID: '1b974777-55d4-4741-8fff-920d5a292385', sessionUUID: '789c0123-d456-f789-0123-456789abcdef' },
56-
],
57-
}, {
58-
startTime: '11:45',
59-
endTime: '14:00',
60-
sessions: [
61-
{ roomUUID: 'cba79f3f-3e12-4f15-bb42-e17652efae58', sessionUUID: '81debd8b-7e40-493f-8abe-6650ed08a289' },
62-
],
63-
commonAllRooms: true,
64-
icon: 'MdOutlineFastfood',
65-
},
66-
{
67-
startTime: '14:00',
68-
endTime: '14:45',
69-
sessions: [
70-
{ roomUUID: 'f9ed81db-f90a-42d4-b7e4-d554d8f338fd', sessionUUID: '08c71152-c552-42e7-b094-f510ff44e9ce' },
71-
{ roomUUID: '03daa4f4-7d63-42dd-b133-9194f298e194', sessionUUID: '08c71152-c552-42e7-b094-f510ff44e9cd' },
72-
{ roomUUID: '1b974777-55d4-4741-8fff-920d5a292385', sessionUUID: '08c71152-c552-42e7-b094-f510ff44e9d2' },
73-
],
74-
},
75-
{
76-
startTime: '14:45',
77-
endTime: '15:00',
78-
sessions: [
79-
{ roomUUID: 'cba79f3f-3e12-4f15-bb42-e17652efae58', sessionUUID: '004d6b2c-7803-4170-a41c-8ddd1d1c2ded' },
80-
],
81-
commonAllRooms: true,
82-
icon: 'PiCoffee',
83-
},
84-
{
85-
startTime: '15:00',
86-
endTime: '15:45',
87-
sessions: [
88-
{ roomUUID: 'f9ed81db-f90a-42d4-b7e4-d554d8f338fd', sessionUUID: '08c71152-c552-42e7-b094-f510ff44e9d1' },
89-
{ roomUUID: '03daa4f4-7d63-42dd-b133-9194f298e194', sessionUUID: '08c71152-c552-42e7-b094-f510ff44e9d3' },
90-
{ roomUUID: '1b974777-55d4-4741-8fff-920d5a292385', sessionUUID: '08c71152-c552-42e7-b094-f510ff44e9d6' },
91-
],
92-
},
93-
{
94-
startTime: '15:45',
95-
endTime: '16:00',
96-
sessions: [
97-
{ roomUUID: 'cba79f3f-3e12-4f15-bb42-e17652efae58', sessionUUID: '55cf2089-c5f9-49d7-a8a0-6a17c16ed4bf' },
98-
],
99-
commonAllRooms: true,
100-
icon: 'PiCoffee',
101-
},
102-
{
103-
startTime: '16:00',
104-
endTime: '17:00',
105-
sessions: [
106-
{ roomUUID: 'f9ed81db-f90a-42d4-b7e4-d554d8f338fd', sessionUUID: '08c71152-c552-42e7-b094-f510ff44e9d4' },
107-
{ roomUUID: '03daa4f4-7d63-42dd-b133-9194f298e194', sessionUUID: '08c71152-c552-42e7-b094-f510ff44e9d5' },
108-
{ roomUUID: '1b974777-55d4-4741-8fff-920d5a292385', sessionUUID: '08c71152-c552-42e7-b094-f510ff44e9d7' },
109-
],
110-
},
111-
{
112-
startTime: '17:00',
113-
endTime: '17:30',
114-
sessions: [
115-
{ roomUUID: 'cba79f3f-3e12-4f15-bb42-e17652efae58', sessionUUID: '9ac5195c-b7c1-4e53-8f64-ceba480a6dc4' },
116-
],
117-
commonAllRooms: true,
118-
icon: 'TbNotes',
6+
{
7+
date: '2024-11-09',
8+
dateReadable: 'November 9',
9+
rooms: [
10+
{ uuid: 'f9ed81db-f90a-42d4-b7e4-d554d8f338fd', name: 'Room 1' },
11+
{ uuid: '03daa4f4-7d63-42dd-b133-9194f298e194', name: 'Room 2' },
12+
{ uuid: '1b974777-55d4-4741-8fff-920d5a292385', name: 'Room 3' },
13+
{ uuid: 'cba79f3f-3e12-4f15-bb42-e17652efae58', name: '' },
14+
],
15+
timeSlots: [
16+
{
17+
startTime: '08:30',
18+
endTime: '09:30',
19+
sessions: [
20+
{ roomUUID: 'cba79f3f-3e12-4f15-bb42-e17652efae58', sessionUUID: '246a17da-adf9-4d8e-9c50-ef84bdf68c55' },
21+
],
22+
commonAllRooms: true,
23+
icon: 'FaRegIdBadge',
24+
}, {
25+
startTime: '09:30',
26+
endTime: '10:00',
27+
sessions: [
28+
{ roomUUID: 'cba79f3f-3e12-4f15-bb42-e17652efae58', sessionUUID: '4d0cb762-4de4-43cf-b4ea-f02bcfa5b559' },
29+
],
30+
commonAllRooms: true,
31+
icon: 'TbNotes',
32+
}, {
33+
startTime: '10:00',
34+
endTime: '10:45',
35+
sessions: [
36+
{ roomUUID: 'f9ed81db-f90a-42d4-b7e4-d554d8f338fd', sessionUUID: '08c71152-c552-42e7-b094-f510ff44e9d0' },
37+
{ roomUUID: '03daa4f4-7d63-42dd-b133-9194f298e194', sessionUUID: '5108babc-bf35-44d5-a9ba-de08badfa80a' },
38+
{ roomUUID: '1b974777-55d4-4741-8fff-920d5a292385', sessionUUID: '08c71152-c552-42e7-b094-f510ff44e9cb' },
39+
],
40+
}, {
41+
startTime: '10:45',
42+
endTime: '11:00',
43+
sessions: [
44+
{ roomUUID: 'cba79f3f-3e12-4f15-bb42-e17652efae58', sessionUUID: '27ff7729-5792-4efd-a813-321fd6523e63' },
45+
],
46+
commonAllRooms: true,
47+
icon: 'MdOutlineFastfood',
48+
},
49+
{
50+
startTime: '11:00',
51+
endTime: '11:45',
52+
sessions: [
53+
{ roomUUID: 'f9ed81db-f90a-42d4-b7e4-d554d8f338fd', sessionUUID: '08c71152-c552-42e7-b094-f510ff44e9cc' },
54+
{ roomUUID: '03daa4f4-7d63-42dd-b133-9194f298e194', sessionUUID: 'a47442e6-ff57-43ca-af40-7e2b4d46f93d' },
55+
{ roomUUID: '1b974777-55d4-4741-8fff-920d5a292385', sessionUUID: '789c0123-d456-f789-0123-456789abcdef' },
56+
],
57+
}, {
58+
startTime: '11:45',
59+
endTime: '14:00',
60+
sessions: [
61+
{ roomUUID: 'cba79f3f-3e12-4f15-bb42-e17652efae58', sessionUUID: '81debd8b-7e40-493f-8abe-6650ed08a289' },
62+
],
63+
commonAllRooms: true,
64+
icon: 'MdOutlineFastfood',
65+
},
66+
{
67+
startTime: '14:00',
68+
endTime: '14:45',
69+
sessions: [
70+
{ roomUUID: 'f9ed81db-f90a-42d4-b7e4-d554d8f338fd', sessionUUID: '08c71152-c552-42e7-b094-f510ff44e9ce' },
71+
{ roomUUID: '03daa4f4-7d63-42dd-b133-9194f298e194', sessionUUID: '08c71152-c552-42e7-b094-f510ff44e9cd' },
72+
{ roomUUID: '1b974777-55d4-4741-8fff-920d5a292385', sessionUUID: '08c71152-c552-42e7-b094-f510ff44e9d2' },
73+
],
74+
},
75+
{
76+
startTime: '14:45',
77+
endTime: '15:00',
78+
sessions: [
79+
{ roomUUID: 'cba79f3f-3e12-4f15-bb42-e17652efae58', sessionUUID: '004d6b2c-7803-4170-a41c-8ddd1d1c2ded' },
80+
],
81+
commonAllRooms: true,
82+
icon: 'PiCoffee',
83+
},
84+
{
85+
startTime: '15:00',
86+
endTime: '15:45',
87+
sessions: [
88+
{ roomUUID: 'f9ed81db-f90a-42d4-b7e4-d554d8f338fd', sessionUUID: '08c71152-c552-42e7-b094-f510ff44e9d1' },
89+
{ roomUUID: '03daa4f4-7d63-42dd-b133-9194f298e194', sessionUUID: '08c71152-c552-42e7-b094-f510ff44e9d3' },
90+
{ roomUUID: '1b974777-55d4-4741-8fff-920d5a292385', sessionUUID: '08c71152-c552-42e7-b094-f510ff44e9d6' },
91+
],
92+
},
93+
{
94+
startTime: '15:45',
95+
endTime: '16:00',
96+
sessions: [
97+
{ roomUUID: 'cba79f3f-3e12-4f15-bb42-e17652efae58', sessionUUID: '55cf2089-c5f9-49d7-a8a0-6a17c16ed4bf' },
98+
],
99+
commonAllRooms: true,
100+
icon: 'PiCoffee',
101+
},
102+
{
103+
startTime: '16:00',
104+
endTime: '16:45',
105+
sessions: [
106+
{ roomUUID: 'f9ed81db-f90a-42d4-b7e4-d554d8f338fd', sessionUUID: '08c71152-c552-42e7-b094-f510ff44e9d4' },
107+
{ roomUUID: '03daa4f4-7d63-42dd-b133-9194f298e194', sessionUUID: '08c71152-c552-42e7-b094-f510ff44e9d5' },
108+
{ roomUUID: '1b974777-55d4-4741-8fff-920d5a292385', sessionUUID: '08c71152-c552-42e7-b094-f510ff44e9d7' },
109+
],
110+
},
111+
{
112+
startTime: '17:00',
113+
endTime: '17:30',
114+
sessions: [
115+
{ roomUUID: 'cba79f3f-3e12-4f15-bb42-e17652efae58', sessionUUID: '9ac5195c-b7c1-4e53-8f64-ceba480a6dc4' },
116+
],
117+
commonAllRooms: true,
118+
icon: 'TbNotes',
119119

120-
},
121-
],
122-
};
120+
},
121+
],
122+
};
123123

0 commit comments

Comments
 (0)