Skip to content

Commit 65b61a0

Browse files
authored
Merge pull request #56 from aws-samples/refactor/comment-form
Refactor/comment form
2 parents 5489736 + 3634d51 commit 65b61a0

File tree

2 files changed

+52
-3
lines changed

2 files changed

+52
-3
lines changed

src/App.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,14 @@ const WorkshopApp = ({ signOut, user = defaultUser }: WorkshopAppProps) => {
6060
path="/catalog"
6161
element={signOut ? <Catalog /> : <NotFound />}
6262
/>
63+
<Route
64+
path="/catalog/course/:courseId"
65+
element={signOut ? <Catalog /> : <NotFound />}
66+
/>
67+
<Route
68+
path="/catalog/course/:courseId/class/:classId"
69+
element={signOut ? <Catalog /> : <NotFound />}
70+
/>
6371
<Route
6472
path="/profile"
6573
element={signOut ? <ProfilePage {...getProfileProps(user)} /> : <NotFound />}

src/pages/catalog.tsx

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { useEffect, useState } from "react";
2+
import { useParams, useNavigate } from "react-router-dom";
23
import {
34
Container,
45
SpaceBetween,
@@ -18,6 +19,9 @@ import BaseAppLayout from "../components/base-app-layout";
1819
const client = generateClient<Schema>();
1920

2021
export default function Catalog(props: any) {
22+
const { courseId, classId } = useParams();
23+
const navigate = useNavigate();
24+
2125
const [activeClass, setActiveClass] = useState<Schema["Class"]["type"]>();
2226
const [activeCourse, setActiveCourse] = useState<Schema["Course"]["type"]>();
2327
const [courses, setCourses] = useState<Array<Schema["Course"]["type"]>>([]);
@@ -26,25 +30,62 @@ export default function Catalog(props: any) {
2630
const fetchCourse = async () => {
2731
const {data: items } = await client.models.Course.list();
2832
setCourses(items);
29-
if (!activeCourse && items.length > 0) {
33+
34+
// URL에 courseId가 있으면 해당 코스를 활성화
35+
if (courseId && items.length > 0) {
36+
const selectedCourse = items.find(c => c.id === courseId);
37+
if (selectedCourse) {
38+
setActiveCourse(selectedCourse);
39+
setActiveTabId(selectedCourse.id);
40+
}
41+
} else if (!activeCourse && items.length > 0) {
3042
setActiveCourse(items[0]);
3143
setActiveTabId(items[0].id);
3244
}
3345
};
3446

47+
const fetchClass = async () => {
48+
if (classId) {
49+
try {
50+
const { data: classData } = await client.models.Class.get({ id: classId });
51+
if (classData) {
52+
setActiveClass(classData);
53+
}
54+
} catch (error) {
55+
console.error('Error fetching class:', error);
56+
}
57+
}
58+
};
59+
3560
useEffect(() => {
3661
fetchCourse();
3762
}, []);
3863

64+
useEffect(() => {
65+
if (classId) {
66+
fetchClass();
67+
} else {
68+
setActiveClass(undefined);
69+
}
70+
}, [classId]);
71+
3972
const handleTabChange = (detail: { activeTabId: string }) => {
4073
const selectedCourse = courses.find(c => c.id === detail.activeTabId);
4174
if (selectedCourse) {
4275
setActiveCourse(selectedCourse);
43-
setActiveClass(undefined); // Reset active class when changing course
76+
setActiveClass(undefined);
4477
setActiveTabId(detail.activeTabId);
78+
// URL 업데이트
79+
navigate(`/catalog/course/${detail.activeTabId}`);
4580
}
4681
};
4782

83+
const handleClassSelect = (selectedClass: Schema["Class"]["type"]) => {
84+
setActiveClass(selectedClass);
85+
// URL 업데이트
86+
navigate(`/catalog/course/${activeCourse?.id}/class/${selectedClass.id}`);
87+
};
88+
4889
return (
4990
<BaseAppLayout
5091
content={
@@ -67,7 +108,7 @@ export default function Catalog(props: any) {
67108
(activeClass && activeClass != null && activeClass.class_flag != null && activeClass.class_flag <= 0) ? (
68109
<Class activeClass={activeClass} userName={props.user} userId={props.uid} />
69110
) : (
70-
<ClassCatalog activeCourse={course} setActiveClass={setActiveClass} />
111+
<ClassCatalog activeCourse={course} setActiveClass={handleClassSelect} />
71112
)
72113
)
73114
}))}

0 commit comments

Comments
 (0)