Skip to content

Commit d89820a

Browse files
committed
feat: SessionTimeGroup 하위 컴포넌트 개발
1 parent 1ab01ef commit d89820a

2 files changed

Lines changed: 104 additions & 60 deletions

File tree

packages/common/src/components/mdx_components/session_timetable.tsx

Lines changed: 103 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Box, Button, ButtonBase, Stack, styled, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Typography } from "@mui/material";
1+
import { Box, ButtonBase, Chip, Stack, styled, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Typography } from "@mui/material";
22
import { ErrorBoundary, Suspense } from "@suspensive/react";
33
import * as React from "react";
44
import BackendAPISchemas from "../../schemas/backendAPI";
@@ -126,10 +126,10 @@ type SessionExtraDataType = {
126126
};
127127
};
128128

129-
type SessionTimeTableSlotType = {
130-
session: BackendAPISchemas.SessionSchema;
131-
rowSpan: number;
132-
colSpan: number;
129+
type SessionTimeWithSameStartTime = {
130+
isSession: boolean;
131+
isLast: boolean;
132+
sessions: BackendAPISchemas.SessionSchema[];
133133
};
134134

135135
type SessionDate = {
@@ -185,18 +185,20 @@ const rawRooms: Room[] = [
185185
},
186186
];
187187

188-
const SessionTimeTableItem: React.FC<{ data: SessionTimeTableSlotType }> = ({ data }) => {
189-
const sessionCategories = data.session.categories;
188+
const SessionTimeTableItem: React.FC<{ data: BackendAPISchemas.SessionSchema }> = ({ data }) => {
189+
const sessionCategories = data.categories;
190190

191191
return (
192192
<SessionTimeTableItemContainer direction="column">
193+
<SessionTitle children={data.title} />
194+
{data.speakers.map((speaker) => (
195+
<Chip key={speaker.id} size="small" label={speaker.nickname} />
196+
))}
193197
<SessionTimeTableItemTagContainer direction="row">
194198
{sessionCategories.map((category) => (
195-
<CategoryButtonStyle>{category.name}</CategoryButtonStyle>
199+
<Chip key={category.id} variant="outlined" color="primary" size="small" label={category.name} />
196200
))}
197201
</SessionTimeTableItemTagContainer>
198-
<SessionTitle children={data.session.title} />
199-
<SpeakerName children={data.session.speakers ? data.session.speakers[0].nickname : ""} />
200202
</SessionTimeTableItemContainer>
201203
);
202204
};
@@ -243,6 +245,27 @@ export const SessionTimeTable: React.FC = ErrorBoundary.with(
243245
);
244246
};
245247

248+
const SessionTimeGroup: React.FC<{ sessionGroup: SessionTimeWithSameStartTime }> = ({ sessionGroup }) => {
249+
if (sessionGroup.isSession) {
250+
return (
251+
<SessionTableRow>
252+
<TableCell colSpan={sessionRooms.length + 1}>
253+
<SessionTimeTableItem data={sessionGroup.sessions[0]} />
254+
</TableCell>
255+
</SessionTableRow>
256+
);
257+
} else {
258+
const sessions: BackendAPISchemas.SessionSchema[] = sessionGroup.sessions;
259+
return (
260+
<SessionTableRow>
261+
{sessions.map((session) => {
262+
return <SessionTimeTableItem data={session} />;
263+
})}
264+
</SessionTableRow>
265+
);
266+
}
267+
};
268+
246269
// const backendAPIClient = Hooks.BackendAPI.useBackendClient();
247270
// const { data: sessions } = Hooks.BackendAPI.useSessionsQuery(backendAPIClient);
248271
const sessions: BackendAPISchemas.SessionSchema[] = generateSessionData();
@@ -254,26 +277,50 @@ export const SessionTimeTable: React.FC = ErrorBoundary.with(
254277
const [selectedDate, setSelectedDate] = React.useState<SessionDate>(sessionDates[0]);
255278
// @ts-ignore
256279
const [sessionRooms, setSessionRooms] = React.useState<Room[]>(rawRooms);
257-
const filteredSessions = React.useMemo(() => {
258-
return sessions.filter((session) => {
259-
return selectedDate.date.toLocaleDateString() === session.room_schedules.start_at.toLocaleDateString();
260-
});
261-
}, [sessions, selectedDate]);
262-
263-
const filteredSessionTimeTableSlots: SessionTimeTableSlotType[] = React.useMemo(() => {
264-
let data: SessionTimeTableSlotType[] = [];
265-
filteredSessions.map((session) => {
266-
data.push({
267-
session: session,
268-
rowSpan: 1,
269-
colSpan: 1,
270-
});
271-
});
272-
return data;
273-
}, [filteredSessions, selectedDate]);
280+
281+
const [sessionGroupByStartTime, setSessionGroupByStartTime] = React.useState<SessionTimeWithSameStartTime[]>([]);
282+
// const filteredSessions = React.useMemo(() => {
283+
// return sessions.filter((session) => {
284+
// return selectedDate.date.toLocaleDateString() === session.room_schedules.start_at.toLocaleDateString();
285+
// });
286+
// }, [sessions, selectedDate]);
287+
288+
// 세션을 순회하며 시작 시간이 같은 세션들만 계산해서 리턴하는 함수
289+
const getSessionWithSameStartTime: () => SessionTimeWithSameStartTime[] = () => {
290+
let sessionList: SessionTimeWithSameStartTime[] = [];
291+
let sessionWithSameStartTime: BackendAPISchemas.SessionSchema[] = [];
292+
let sessionIndex: number = 0;
293+
while (sessionIndex < sessionData.length) {
294+
const session: BackendAPISchemas.SessionSchema = sessionData[sessionIndex];
295+
if (!session.isSession) {
296+
sessionList.push({
297+
sessions: [session],
298+
isSession: false,
299+
isLast: sessionIndex != sessionData.length,
300+
});
301+
} else {
302+
sessionWithSameStartTime.push(session);
303+
while (sessionIndex + 1 < sessionData.length) {
304+
sessionWithSameStartTime.push(sessionData[sessionIndex + 1]);
305+
}
306+
sessionList.push({
307+
sessions: sessionWithSameStartTime,
308+
isSession: true,
309+
isLast: sessionIndex != sessionData.length,
310+
});
311+
}
312+
sessionWithSameStartTime = [];
313+
sessionIndex += 1;
314+
}
315+
return sessionList;
316+
};
274317

275318
React.useEffect(() => {
276-
filteredSessionTimeTableSlots;
319+
setSessionData(generateSessionData());
320+
});
321+
322+
React.useEffect(() => {
323+
setSessionGroupByStartTime(getSessionWithSameStartTime());
277324
});
278325

279326
return (
@@ -282,15 +329,18 @@ export const SessionTimeTable: React.FC = ErrorBoundary.with(
282329
<TableContainer>
283330
<Table>
284331
<TableHead>
285-
<TableRow>
332+
<SessionTableRow>
286333
{sessionRooms.map((room) => {
287-
return <TableCell>{room.name}</TableCell>;
334+
return <SessionTableCell align="center">{room.name}</SessionTableCell>;
288335
})}
289-
</TableRow>
336+
</SessionTableRow>
290337
</TableHead>
291338
<TableBody>
292-
{filteredSessionTimeTableSlots.map((session) => {
293-
return <SessionTimeTableItem data={session} />;
339+
<SessionTableRow>
340+
<TableCell colSpan={sessionRooms.length + 1}></TableCell>
341+
</SessionTableRow>
342+
{sessionGroupByStartTime.map((sessionGroup) => {
343+
return <SessionTimeGroup sessionGroup={sessionGroup} />;
294344
})}
295345
</TableBody>
296346
</Table>
@@ -300,10 +350,12 @@ export const SessionTimeTable: React.FC = ErrorBoundary.with(
300350
})
301351
);
302352

303-
const SessionTimeTableItemContainer = styled(Stack)({
353+
const SessionTimeTableItemContainer = styled(Stack)(({ theme }) => ({
304354
alignItems: "center",
305355
justifyContent: "center",
306-
});
356+
borderRadius: 16,
357+
border: `1px solid color-mix(in srgb, ${theme.palette.primary.light} 50%, transparent 50%)`,
358+
}));
307359

308360
const SessionTimeTableItemTagContainer = styled(Stack)({
309361
alignItems: "center",
@@ -342,23 +394,6 @@ const SessionDateSubTitle = styled(Typography)<{ isSelected: boolean }>(({ theme
342394
color: isSelected ? theme.palette.primary.main : theme.palette.primary.light,
343395
}));
344396

345-
const CategoryButtonStyle = styled(Button)(({ theme }) => ({
346-
flexGrow: 0,
347-
flexShrink: 0,
348-
flexBasis: "14rem",
349-
350-
wordBreak: "keep-all",
351-
whiteSpace: "nowrap",
352-
353-
// backgroundColor: selected ? theme.palette.primary.light : "transparent",
354-
// color: selected ? theme.palette.primary.main : theme.palette.primary.light, // main or light color로 지정
355-
backgroundColor: "transparent",
356-
color: theme.palette.primary.light,
357-
"&:hover": {
358-
color: theme.palette.primary.dark,
359-
},
360-
}));
361-
362397
const SessionTitle = styled(Typography)({
363398
fontSize: "1.5em",
364399
fontWeight: 600,
@@ -367,14 +402,22 @@ const SessionTitle = styled(Typography)({
367402
whiteSpace: "pre-wrap",
368403
});
369404

370-
const SpeakerName = styled(Typography)({
371-
fontSize: "1em",
372-
fontWeight: 400,
373-
lineHeight: 1.25,
374-
textDecoration: "none",
375-
whiteSpace: "pre-wrap",
376-
});
377-
378405
const ColoredDivider = styled(StyledDivider)(({ theme }) => ({
379406
color: theme.palette.primary.main,
380407
}));
408+
409+
// @ts-ignore
410+
const SessionTableStyle = styled(Table)({
411+
alignItems: "center",
412+
justifyContent: "center",
413+
});
414+
415+
const SessionTableRow = styled(TableRow)({
416+
alignItems: "center",
417+
justifyContent: "center",
418+
});
419+
420+
const SessionTableCell = styled(TableCell)({
421+
alignItems: "center",
422+
justifyContent: "center",
423+
});

packages/common/src/schemas/backendAPI.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ namespace BackendAPISchemas {
7575
title: string;
7676
description: string;
7777
image: string | null;
78+
isSession?: boolean;
7879
categories: {
7980
id: string;
8081
name: string;

0 commit comments

Comments
 (0)