Skip to content

Commit 1d322bf

Browse files
committed
Enhance EventDetailPage with user data handling
1 parent 02bed96 commit 1d322bf

File tree

4 files changed

+85
-36
lines changed

4 files changed

+85
-36
lines changed

README.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# SyncUp
2+
23
"Let's Sync Up" – SyncUp is a lightweight event coordination app that helps you plan events and sync available time slots with others.
34

45
## ✨ Features
@@ -17,6 +18,9 @@
1718

1819
https://github.com/user-attachments/assets/29d921fc-4514-4b20-917c-f4a03be7796b
1920

20-
2121
📆 Give SyncUp a try and let us know what you think!
2222
🧪 Feedback is super welcome!
23+
24+
## ⚒️ Contributing
25+
26+
We welcome contributions! If you have suggestions or improvements, please open an issue or submit a pull request.

frontend/src/App.tsx

Lines changed: 10 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,35 +5,23 @@ import { Event } from "./types/types";
55
import { CreateEventPage } from "./CreateEventPage";
66
import { EventDetailPage } from "./EventDetailPage";
77
import { ThemeProvider } from "./components/ThemeProvider";
8-
import { Toaster } from "@/components/ui/sonner";
9-
import { Navbar } from "@/components/NavBar";
8+
import { Layout } from "./Layout";
109

1110
function App() {
1211
const [eventData, setEventData] = useState<Event | undefined>(undefined);
1312

1413
return (
1514
<ThemeProvider defaultTheme="system" storageKey="vite-ui-theme">
1615
<BrowserRouter basename={import.meta.env.VITE_SYNCUP_BASENAME}>
17-
<div className="min-h-screen flex flex-col">
18-
<Navbar eventData={eventData} />
19-
<main className="flex-1 py-8">
20-
<div className="max-w-4xl mx-auto px-4">
21-
<Routes>
22-
<Route path="/" element={<CreateEventPage />} />
23-
<Route
24-
path="/:key"
25-
element={<EventDetailPage onEventLoad={setEventData} />}
26-
/>
27-
</Routes>
28-
</div>
29-
</main>
30-
<footer className="border-t py-4">
31-
<div className="max-w-4xl mx-auto px-4 text-center text-sm text-muted-foreground">
32-
© {new Date().getFullYear()} Yorkie Team. All rights reserved.
33-
</div>
34-
</footer>
35-
<Toaster />
36-
</div>
16+
<Layout eventData={eventData}>
17+
<Routes>
18+
<Route path="/" element={<CreateEventPage />} />
19+
<Route
20+
path="/:key"
21+
element={<EventDetailPage onEventLoad={setEventData} />}
22+
/>
23+
</Routes>
24+
</Layout>
3725
</BrowserRouter>
3826
</ThemeProvider>
3927
);

frontend/src/EventDetailPage.tsx

Lines changed: 44 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,24 +9,16 @@ import { LegendItems } from "./components/LegendItems";
99
import { User, Event, TimeSlot } from "./types/types";
1010
import { useFetchUser } from "./hooks/useFetchUser";
1111

12-
export function EventDetailPage({
12+
function EventDetail({
13+
user,
14+
initialRoot,
1315
onEventLoad,
1416
}: {
17+
user?: User;
18+
initialRoot?: Event;
1519
onEventLoad?: (event: Event) => void;
1620
}) {
1721
const { key } = useParams();
18-
const formData = useLocation().state;
19-
const initialRoot =
20-
(formData && {
21-
name: formData.name,
22-
selectedDates: formData.selectedDates,
23-
startTime: formData.startTime,
24-
endTime: formData.endTime,
25-
availables: {},
26-
}) ||
27-
undefined;
28-
29-
const { user } = useFetchUser();
3022

3123
const { root, update, presences, loading, error } = useYorkieDoc<Event, User>(
3224
import.meta.env.VITE_YORKIE_API_KEY,
@@ -217,3 +209,42 @@ export function EventDetailPage({
217209
</div>
218210
);
219211
}
212+
213+
export function EventDetailPage({
214+
onEventLoad,
215+
}: {
216+
onEventLoad?: (event: Event) => void;
217+
}) {
218+
const formData = useLocation().state;
219+
const initialRoot =
220+
(formData && {
221+
name: formData.name,
222+
selectedDates: formData.selectedDates,
223+
startTime: formData.startTime,
224+
endTime: formData.endTime,
225+
availables: {},
226+
}) ||
227+
undefined;
228+
229+
const { user, loading } = useFetchUser();
230+
231+
if (loading) {
232+
return (
233+
<div
234+
className="flex flex-col items-center justify-center min-h-[300px]"
235+
aria-live="polite"
236+
>
237+
<Loader2 className="h-8 w-8 animate-spin text-primary" />
238+
<p className="mt-4 text-sm text-muted-foreground">Loading user...</p>
239+
</div>
240+
);
241+
}
242+
243+
return (
244+
<EventDetail
245+
user={user}
246+
initialRoot={initialRoot}
247+
onEventLoad={onEventLoad}
248+
/>
249+
);
250+
}

frontend/src/Layout.tsx

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { ReactNode } from "react";
2+
import { Toaster } from "@/components/ui/sonner";
3+
import { Navbar } from "@/components/NavBar";
4+
import { Event } from "./types/types";
5+
6+
type LayoutProps = {
7+
children: ReactNode;
8+
eventData?: Event;
9+
};
10+
11+
export function Layout({ children, eventData }: LayoutProps) {
12+
return (
13+
<div className="min-h-screen flex flex-col">
14+
<Navbar eventData={eventData} />
15+
<main className="flex-1 py-8">
16+
<div className="max-w-4xl mx-auto px-4">{children}</div>
17+
</main>
18+
<footer className="border-t py-4">
19+
<div className="max-w-4xl mx-auto px-4 text-center text-sm text-muted-foreground">
20+
© {new Date().getFullYear()} Yorkie Team. All rights reserved.
21+
</div>
22+
</footer>
23+
<Toaster />
24+
</div>
25+
);
26+
}

0 commit comments

Comments
 (0)