Skip to content

Commit 5273c02

Browse files
Merge pull request #3 from PyVersify/Nathan-Bransby-NMT/add-calendar-component
Add calendar component to community page
2 parents 4226893 + 555eef5 commit 5273c02

File tree

5 files changed

+131
-1
lines changed

5 files changed

+131
-1
lines changed

public/events.csv

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
date,title
2+
2025-01-08,Event 1
3+
2025-01-22,Event 2
4+
2025-02-12,Event 3
5+
2025-02-26,Event 4
6+
2025-03-12,Event 5
7+
2025-03-26,Event 6
8+
2025-04-09,Event 7
9+
2025-04-23,Event 8
10+
2025-05-14,Event 9
11+
2025-05-28,Event 10
12+
2025-06-11,Event 11
13+
2025-06-25,Event 12
14+
2025-07-09,Event 13
15+
2025-07-23,Event 14
16+
2025-08-13,Event 15
17+
2025-08-27,Event 16
18+
2025-09-10,Event 17
19+
2025-09-24,Event 18
20+
2025-10-08,Event 19
21+
2025-10-22,Event 20
22+
2025-11-12,Event 21
23+
2025-11-26,Event 22

src/components/Calendar.tsx

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import React from 'react';
2+
3+
interface Event {
4+
date: string;
5+
title: string;
6+
}
7+
8+
interface CalendarProps {
9+
events: Event[];
10+
}
11+
12+
const Calendar: React.FC<CalendarProps> = ({ events }) => {
13+
const renderCalendar = () => {
14+
// Create a calendar grid for 2025
15+
const months = [
16+
'January', 'February', 'March', 'April', 'May', 'June',
17+
'July', 'August', 'September', 'October', 'November'
18+
];
19+
20+
return months.map((month, index) => (
21+
<div key={index} className="calendar-month">
22+
<h3 className="text-lg font-bold mb-2">{month}</h3>
23+
<div className="calendar-grid">
24+
{events
25+
.filter(event => new Date(event.date).getMonth() === index)
26+
.map((event, idx) => (
27+
<div key={idx} className="calendar-event">
28+
<span>{new Date(event.date).getDate()}</span>
29+
<span>{event.title}</span>
30+
</div>
31+
))}
32+
</div>
33+
</div>
34+
));
35+
};
36+
37+
return (
38+
<div className="calendar-container">
39+
{renderCalendar()}
40+
</div>
41+
);
42+
};
43+
44+
export default Calendar;

src/components/Community.tsx

+17-1
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,28 @@
1-
import React from 'react';
1+
import React, { useState, useEffect } from 'react';
2+
import Calendar from './Calendar';
3+
import UpcomingEvents from './UpcomingEvents';
4+
import { fetchEvents } from '../utils/events';
25

36
const Community: React.FC = () => {
7+
const [events, setEvents] = useState([]);
8+
9+
useEffect(() => {
10+
const loadEvents = async () => {
11+
const eventsData = await fetchEvents();
12+
setEvents(eventsData);
13+
};
14+
15+
loadEvents();
16+
}, []);
17+
418
return (
519
<div className="container mx-auto px-4 py-8">
620
<h1 className="text-4xl font-bold mb-4 text-[#4584b6]">Community</h1>
721
<p className="text-xl text-gray-600">
822
Welcome to the community page! Here you can find information about our community events, forums, and how to get involved.
923
</p>
24+
<Calendar events={events} />
25+
<UpcomingEvents events={events} />
1026
</div>
1127
);
1228
};

src/components/UpcomingEvents.tsx

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import React from 'react';
2+
3+
interface Event {
4+
date: string;
5+
title: string;
6+
}
7+
8+
interface UpcomingEventsProps {
9+
events: Event[];
10+
}
11+
12+
const UpcomingEvents: React.FC<UpcomingEventsProps> = ({ events }) => {
13+
const futureEvents = events.filter(event => new Date(event.date) > new Date());
14+
15+
return (
16+
<div className="upcoming-events-container">
17+
<h2 className="text-2xl font-bold mb-4 text-[#4584b6]">Upcoming Events</h2>
18+
<ul className="upcoming-events-list">
19+
{futureEvents.map((event, index) => (
20+
<li key={index} className="upcoming-event-item">
21+
<span>{new Date(event.date).toLocaleDateString()}</span>
22+
<span>{event.title}</span>
23+
</li>
24+
))}
25+
</ul>
26+
</div>
27+
);
28+
};
29+
30+
export default UpcomingEvents;

src/utils/events.ts

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import Papa from 'papaparse';
2+
3+
interface Event {
4+
date: string;
5+
title: string;
6+
}
7+
8+
export const fetchEvents = async (): Promise<Event[]> => {
9+
const response = await fetch('/events.csv');
10+
const csvText = await response.text();
11+
const parsedData = Papa.parse<Event>(csvText, {
12+
header: true,
13+
dynamicTyping: true,
14+
});
15+
16+
return parsedData.data;
17+
};

0 commit comments

Comments
 (0)