1- import { wrap } from "@suspensive/react"
2- import React from "react"
3- import Markdown from "react-markdown"
4- import * as R from "remeda"
5-
6- import { SloganShort } from "assets/icons"
7- import { FallbackImg } from "components/common/FallbackImg"
8- import Page from "components/common/Page"
9- import { APIPretalxSessions } from "models/api/session"
10- import { useNavigate , useParams } from "react-router"
11- import styled from "styled-components"
12- import { useRetrieveSessionQuery } from "utils/hooks/useAPI"
13- import useTranslation from "utils/hooks/useTranslation"
1+ import { wrap } from "@suspensive/react" ;
2+ import React from "react" ;
3+ import Markdown from "react-markdown" ;
4+ import * as R from "remeda" ;
5+
6+ import { SloganShort } from "assets/icons" ;
7+ import { FallbackImg } from "components/common/FallbackImg" ;
8+ import Page from "components/common/Page" ;
9+ import { APIPretalxSessions } from "models/api/session" ;
10+ import { useNavigate , useParams } from "react-router" ;
11+ import styled from "styled-components" ;
12+ import { useRetrieveSessionQuery } from "utils/hooks/useAPI" ;
13+ import useTranslation from "utils/hooks/useTranslation" ;
1414
1515const SessionSpeakerItem : React . FC < { speaker : APIPretalxSessions [ 0 ] [ "speakers" ] [ 0 ] } > = ( {
1616 speaker,
@@ -29,47 +29,54 @@ const SessionSpeakerItem: React.FC<{ speaker: APIPretalxSessions[0]["speakers"][
2929 < Markdown > { speaker . biography } </ Markdown >
3030 </ div >
3131 </ SessionSpeakerItemStyled >
32- )
33- }
32+ ) ;
33+ } ;
3434
3535const SessionDetail : React . FC < { session : APIPretalxSessions [ 0 ] } > = ( { session } ) => {
36- const t = useTranslation ( )
36+ const t = useTranslation ( ) ;
3737
38- let locale = "알 수 없음"
38+ let locale = "알 수 없음" ;
3939 switch ( session . content_locale ) {
4040 case "ko" :
41- locale = "한국어"
42- break
41+ locale = "한국어" ;
42+ break ;
4343 case "en" :
44- locale = "영어"
45- break
44+ locale = "영어" ;
45+ break ;
4646 case "ja" :
47- locale = "일본어"
48- break
47+ locale = "일본어" ;
48+ break ;
4949 default :
50- locale = "알 수 없음"
50+ locale = "알 수 없음" ;
5151 }
5252
53- let datetime = t ( "알 수 없음" )
54- let duration = session . duration || 0
55- let room = t ( "알 수 없음" )
56-
57- if ( R . isObjectType ( session . slot ) && R . isString ( session . slot . start ) && R . isString ( session . slot . end ) ) {
58- const startTime = new Date ( session . slot . start )
59- const endTime = new Date ( session . slot . end )
60- const timeFormat = t ( "ko-KR" )
61- const dateOptions = { day : "numeric" as const , month : "short" as const }
62- const timeOptions = { hour : "numeric" as const , minute : "numeric" as const }
63-
64- datetime = `${ startTime . toLocaleString ( timeFormat , { ...dateOptions , ...timeOptions } ) } ~ ${ endTime . toLocaleTimeString ( timeFormat , timeOptions ) } `
65- duration = ( new Date ( session . slot . end ) . getTime ( ) - new Date ( session . slot . start ) . getTime ( ) ) / 1000 / 60
66- room = t ( session . slot . room [ Object . keys ( session . slot . room ) [ 0 ] ] )
53+ let datetime = t ( "알 수 없음" ) ;
54+ let duration = session . duration || 0 ;
55+ let room = t ( "알 수 없음" ) ;
56+
57+ if (
58+ R . isObjectType ( session . slot ) &&
59+ R . isString ( session . slot . start ) &&
60+ R . isString ( session . slot . end )
61+ ) {
62+ const startTime = new Date ( session . slot . start ) ;
63+ const endTime = new Date ( session . slot . end ) ;
64+ const timeFormat = t ( "ko-KR" ) ;
65+ const dateOptions = { day : "numeric" as const , month : "short" as const } ;
66+ const timeOptions = { hour : "numeric" as const , minute : "numeric" as const } ;
67+
68+ datetime = `${ startTime . toLocaleString ( timeFormat , { ...dateOptions , ...timeOptions } ) } ~ ${ endTime . toLocaleTimeString ( timeFormat , timeOptions ) } ` ;
69+ duration =
70+ ( new Date ( session . slot . end ) . getTime ( ) - new Date ( session . slot . start ) . getTime ( ) ) / 1000 / 60 ;
71+ room = t ( session . slot . room [ Object . keys ( session . slot . room ) [ 0 ] ] ) ;
6772 }
6873
6974 return (
7075 < SessionDetailStyled >
7176 < h1 > { session . title } </ h1 >
72- < h4 > < Markdown > { session . abstract } </ Markdown > </ h4 >
77+ < h4 >
78+ < Markdown > { session . abstract } </ Markdown >
79+ </ h4 >
7380 < hr />
7481 < SessionInfoContainerStyled >
7582 < p > { `${ t ( "언어" ) } : ${ t ( locale ) } ` } </ p >
@@ -95,44 +102,44 @@ const SessionDetail: React.FC<{ session: APIPretalxSessions[0] }> = ({ session }
95102 ) ) }
96103 < hr />
97104 </ SessionDetailStyled >
98- )
99- }
105+ ) ;
106+ } ;
100107
101108export const SessionDetailPage : React . FC = ( ) => {
102- const t = useTranslation ( )
103- const { code } = useParams < { code : string } > ( )
104- const navigate = useNavigate ( )
109+ const t = useTranslation ( ) ;
110+ const { code } = useParams < { code : string } > ( ) ;
111+ const navigate = useNavigate ( ) ;
105112
106- React . useEffect ( ( ) => window . scrollTo ( 0 , 0 ) , [ ] )
113+ React . useEffect ( ( ) => window . scrollTo ( 0 , 0 ) , [ ] ) ;
107114
108115 if ( ! ( R . isString ( code ) && ! R . isEmpty ( code ) ) ) {
109- navigate ( "/session" )
110- return null
116+ navigate ( "/session" ) ;
117+ return null ;
111118 }
112119
113120 const SessionDetailWrapper = wrap
114121 . ErrorBoundary ( { fallback : < h4 > { t ( "세션 정보를 불러오는 중 에러가 발생했습니다." ) } </ h4 > } )
115122 . Suspense ( { fallback : < h4 > { t ( "세션 정보를 불러오는 중 입니다." ) } </ h4 > } )
116123 . on ( ( ) => {
117124 // eslint-disable-next-line react-hooks/rules-of-hooks
118- const { data } = useRetrieveSessionQuery ( code )
119- return < SessionDetail session = { data } />
120- } )
125+ const { data } = useRetrieveSessionQuery ( code ) ;
126+ return < SessionDetail session = { data } /> ;
127+ } ) ;
121128
122129 return (
123- < Page >
130+ < Page title = "세션 상세" >
124131 < ReturnToSessionList onClick = { ( ) => navigate ( - 1 ) } >
125132 ⬅️ { t ( "세션 목록으로 돌아가기" ) }
126133 </ ReturnToSessionList >
127134 < SessionDetailWrapper />
128135 </ Page >
129- )
130- }
136+ ) ;
137+ } ;
131138
132139const ReturnToSessionList = styled . small `
133140 color: rgba(255, 255, 255, 0.4);
134141 cursor: pointer;
135- `
142+ ` ;
136143
137144const SessionDetailStyled = styled . div `
138145 h1 {
@@ -154,13 +161,13 @@ const SessionDetailStyled = styled.div`
154161 font-size: 1rem;
155162 }
156163 }
157- `
164+ ` ;
158165
159166const SessionInfoContainerStyled = styled . div `
160167 * {
161168 margin: 0.5rem 0;
162169 }
163- `
170+ ` ;
164171
165172const SessionSpeakerItemStyled = styled . div `
166173 display: flex;
@@ -173,7 +180,7 @@ const SessionSpeakerItemStyled = styled.div`
173180 margin-top: 0;
174181 color: #fff;
175182 }
176- `
183+ ` ;
177184
178185const SessionSpeakerImageContainerStyled = styled . div `
179186 flex: 0 0 auto;
@@ -198,18 +205,18 @@ const SessionSpeakerImageContainerStyled = styled.div`
198205
199206 border-radius: 50%;
200207 }
201- `
208+ ` ;
202209
203210const TagContainer = styled . div `
204211 display: flex;
205212 align-items: center;
206213 justify-content: flex-start;
207214 gap: 0.5rem;
208- `
215+ ` ;
209216
210217const Tag = styled . kbd `
211218 margin: 0;
212219 background-color: #b0a8fe;
213220 font-family: var(--pico-font-family);
214221 font-size: 0.6rem;
215- `
222+ ` ;
0 commit comments