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" ;
22import { ErrorBoundary , Suspense } from "@suspensive/react" ;
33import * as React from "react" ;
44import 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
135135type 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
308360const 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-
362397const 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-
378405const 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+ } ) ;
0 commit comments