Skip to content

Commit fbc1f30

Browse files
committed
events now clickable (But are not being loaded correctly)
1 parent 06e59f6 commit fbc1f30

File tree

4 files changed

+82
-23
lines changed

4 files changed

+82
-23
lines changed

nextjs-calendar/src/app/components/CalendarGrid.tsx

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,40 @@
1-
// src/app/components/CalendarGrid.tsx
2-
"use client";
1+
'use client'
2+
33
import React from "react";
44
import { format, startOfMonth, endOfMonth, addDays } from "date-fns";
5+
import Link from "next/link";
56
import EventCard from "./EventCard";
67

78
interface CalendarGridProps {
89
currentDate: Date;
10+
events: { id: string; title: string; date: string; description: string }[];
911
}
1012

11-
export default function CalendarGrid({ currentDate }: CalendarGridProps) {
13+
export default function CalendarGrid({ currentDate, events }: CalendarGridProps) {
1214
const start = startOfMonth(currentDate);
1315
const end = endOfMonth(currentDate);
1416

1517
const days = [];
1618
for (let day = start; day <= end; day = addDays(day, 1)) {
19+
// Filter events that match the current day
20+
const dayEvents = events.filter(
21+
(event) => event.date === format(day, "yyyy-MM-dd")
22+
);
23+
24+
// Create day grid elements
1725
days.push(
1826
<div
1927
key={day.toString()}
2028
className="flex flex-col items-center justify-center p-4 border border-gray-300 rounded-lg bg-white shadow-sm hover:shadow-lg transition-all duration-200"
2129
>
2230
<div className="text-lg font-medium text-gray-800">{format(day, "d")}</div>
23-
{/* Event cards will be displayed here */}
2431
<div className="mt-2 text-sm text-gray-600">
25-
<EventCard event={{ id: "1", title: "Sample Event", date: day.toISOString() }} />
32+
{dayEvents.map((event) => (
33+
// Create a link for each event with dynamic routing to event/[id]
34+
<Link key={event.id} href={`/event/${event.id}`}>
35+
<EventCard id={event.id} title={event.title} date={event.date} />
36+
</Link>
37+
))}
2638
</div>
2739
</div>
2840
);
Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,21 @@
11
// src/app/components/EventCard.tsx
2-
import React from "react";
2+
'use client'
33

4-
interface Event {
4+
import Link from "next/link";
5+
6+
interface EventCardProps {
57
id: string;
68
title: string;
79
date: string;
8-
description?: string;
9-
}
10-
11-
interface EventCardProps {
12-
event: Event;
1310
}
1411

15-
export default function EventCard({ event }: EventCardProps) {
12+
export default function EventCard({ id, title, date }: EventCardProps) {
1613
return (
17-
<div className="p-2 bg-blue-100 rounded-md shadow-md">
18-
<h3 className="text-sm font-semibold text-blue-800">{event.title}</h3>
19-
<p className="text-xs text-gray-700">{event.description || "No description"}</p>
20-
</div>
14+
<Link href={`/event/${id}`} passHref>
15+
<div className="p-2 bg-blue-100 rounded-md hover:bg-blue-200 transition cursor-pointer">
16+
<h3 className="font-semibold">{title}</h3>
17+
<p className="text-sm text-gray-600">{date}</p>
18+
</div>
19+
</Link>
2120
);
2221
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// src/app/event/[id]/page.tsx
2+
'use client'
3+
4+
import { useParams } from 'next/navigation';
5+
import { useEffect, useState } from 'react';
6+
7+
export default function EventPage() {
8+
const { id } = useParams(); // Extract the event ID from the URL
9+
const [event, setEvent] = useState<{ id: string; title: string; date: string; description: string } | null>(null);
10+
11+
useEffect(() => {
12+
// Fetch the events from localStorage when the component loads
13+
const savedEvents = localStorage.getItem('events');
14+
if (savedEvents) {
15+
const events = JSON.parse(savedEvents);
16+
const currentEvent = events.find((event: { id: string }) => event.id === id);
17+
setEvent(currentEvent || null); // Set the event or null if not found
18+
}
19+
}, [id]); // Run the effect whenever the `id` changes
20+
21+
if (!event) {
22+
return <div className="p-6 bg-gray-100 min-h-screen">Event not found</div>; // If event not found, display a message
23+
}
24+
25+
return (
26+
<div className="p-6 bg-gray-100 min-h-screen">
27+
<h1 className="text-2xl font-semibold">{event.title}</h1>
28+
<p className="text-gray-600">{event.date}</p>
29+
<p className="mt-4">{event.description}</p>
30+
</div>
31+
);
32+
}

nextjs-calendar/src/app/page.tsx

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,23 @@
1-
"use client";
2-
import React, { useState } from "react";
3-
import { format, startOfMonth, endOfMonth, addMonths, subMonths, addDays } from "date-fns";
1+
// src/app/page.tsx
2+
'use client'
3+
4+
import React, { useState, useEffect } from "react";
5+
import { format, addMonths, subMonths } from "date-fns";
46
import CalendarGrid from "./components/CalendarGrid";
57
import EventForm from "./components/EventForm";
68

79
export default function CalendarPage() {
810
const [currentDate, setCurrentDate] = useState(new Date());
911
const [showEventForm, setShowEventForm] = useState(false);
12+
const [events, setEvents] = useState<{ id: string; title: string; date: string; description: string }[]>([]);
13+
14+
// Load events from localStorage when the component mounts
15+
useEffect(() => {
16+
const savedEvents = localStorage.getItem("events");
17+
if (savedEvents) {
18+
setEvents(JSON.parse(savedEvents));
19+
}
20+
}, []);
1021

1122
const handlePrevMonth = () => setCurrentDate(subMonths(currentDate, 1));
1223
const handleNextMonth = () => setCurrentDate(addMonths(currentDate, 1));
@@ -16,9 +27,14 @@ export default function CalendarPage() {
1627
};
1728

1829
const handleSaveEvent = (event: { title: string; date: string; description: string }) => {
19-
console.log("Event saved:", event);
30+
const newEvent = {
31+
...event,
32+
id: new Date().toISOString(), // Generate a unique id using the current timestamp
33+
};
34+
const updatedEvents = [...events, newEvent];
35+
setEvents(updatedEvents); // Add the new event to the events array
36+
localStorage.setItem("events", JSON.stringify(updatedEvents)); // Persist events in localStorage
2037
setShowEventForm(false);
21-
// Here you can add logic to save the event to the calendar
2238
};
2339

2440
return (
@@ -39,7 +55,7 @@ export default function CalendarPage() {
3955
</button>
4056
</header>
4157

42-
<CalendarGrid currentDate={currentDate} />
58+
<CalendarGrid currentDate={currentDate} events={events} />
4359

4460
<button
4561
onClick={handleAddEvent}

0 commit comments

Comments
 (0)