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" ;
14
14
15
15
const SessionSpeakerItem : React . FC < { speaker : APIPretalxSessions [ 0 ] [ "speakers" ] [ 0 ] } > = ( {
16
16
speaker,
@@ -29,47 +29,54 @@ const SessionSpeakerItem: React.FC<{ speaker: APIPretalxSessions[0]["speakers"][
29
29
< Markdown > { speaker . biography } </ Markdown >
30
30
</ div >
31
31
</ SessionSpeakerItemStyled >
32
- )
33
- }
32
+ ) ;
33
+ } ;
34
34
35
35
const SessionDetail : React . FC < { session : APIPretalxSessions [ 0 ] } > = ( { session } ) => {
36
- const t = useTranslation ( )
36
+ const t = useTranslation ( ) ;
37
37
38
- let locale = "알 수 없음"
38
+ let locale = "알 수 없음" ;
39
39
switch ( session . content_locale ) {
40
40
case "ko" :
41
- locale = "한국어"
42
- break
41
+ locale = "한국어" ;
42
+ break ;
43
43
case "en" :
44
- locale = "영어"
45
- break
44
+ locale = "영어" ;
45
+ break ;
46
46
case "ja" :
47
- locale = "일본어"
48
- break
47
+ locale = "일본어" ;
48
+ break ;
49
49
default :
50
- locale = "알 수 없음"
50
+ locale = "알 수 없음" ;
51
51
}
52
52
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 ] ] ) ;
67
72
}
68
73
69
74
return (
70
75
< SessionDetailStyled >
71
76
< h1 > { session . title } </ h1 >
72
- < h4 > < Markdown > { session . abstract } </ Markdown > </ h4 >
77
+ < h4 >
78
+ < Markdown > { session . abstract } </ Markdown >
79
+ </ h4 >
73
80
< hr />
74
81
< SessionInfoContainerStyled >
75
82
< p > { `${ t ( "언어" ) } : ${ t ( locale ) } ` } </ p >
@@ -95,44 +102,44 @@ const SessionDetail: React.FC<{ session: APIPretalxSessions[0] }> = ({ session }
95
102
) ) }
96
103
< hr />
97
104
</ SessionDetailStyled >
98
- )
99
- }
105
+ ) ;
106
+ } ;
100
107
101
108
export 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 ( ) ;
105
112
106
- React . useEffect ( ( ) => window . scrollTo ( 0 , 0 ) , [ ] )
113
+ React . useEffect ( ( ) => window . scrollTo ( 0 , 0 ) , [ ] ) ;
107
114
108
115
if ( ! ( R . isString ( code ) && ! R . isEmpty ( code ) ) ) {
109
- navigate ( "/session" )
110
- return null
116
+ navigate ( "/session" ) ;
117
+ return null ;
111
118
}
112
119
113
120
const SessionDetailWrapper = wrap
114
121
. ErrorBoundary ( { fallback : < h4 > { t ( "세션 정보를 불러오는 중 에러가 발생했습니다." ) } </ h4 > } )
115
122
. Suspense ( { fallback : < h4 > { t ( "세션 정보를 불러오는 중 입니다." ) } </ h4 > } )
116
123
. on ( ( ) => {
117
124
// 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
+ } ) ;
121
128
122
129
return (
123
- < Page >
130
+ < Page title = "세션 상세" >
124
131
< ReturnToSessionList onClick = { ( ) => navigate ( - 1 ) } >
125
132
⬅️ { t ( "세션 목록으로 돌아가기" ) }
126
133
</ ReturnToSessionList >
127
134
< SessionDetailWrapper />
128
135
</ Page >
129
- )
130
- }
136
+ ) ;
137
+ } ;
131
138
132
139
const ReturnToSessionList = styled . small `
133
140
color: rgba(255, 255, 255, 0.4);
134
141
cursor: pointer;
135
- `
142
+ ` ;
136
143
137
144
const SessionDetailStyled = styled . div `
138
145
h1 {
@@ -154,13 +161,13 @@ const SessionDetailStyled = styled.div`
154
161
font-size: 1rem;
155
162
}
156
163
}
157
- `
164
+ ` ;
158
165
159
166
const SessionInfoContainerStyled = styled . div `
160
167
* {
161
168
margin: 0.5rem 0;
162
169
}
163
- `
170
+ ` ;
164
171
165
172
const SessionSpeakerItemStyled = styled . div `
166
173
display: flex;
@@ -173,7 +180,7 @@ const SessionSpeakerItemStyled = styled.div`
173
180
margin-top: 0;
174
181
color: #fff;
175
182
}
176
- `
183
+ ` ;
177
184
178
185
const SessionSpeakerImageContainerStyled = styled . div `
179
186
flex: 0 0 auto;
@@ -198,18 +205,18 @@ const SessionSpeakerImageContainerStyled = styled.div`
198
205
199
206
border-radius: 50%;
200
207
}
201
- `
208
+ ` ;
202
209
203
210
const TagContainer = styled . div `
204
211
display: flex;
205
212
align-items: center;
206
213
justify-content: flex-start;
207
214
gap: 0.5rem;
208
- `
215
+ ` ;
209
216
210
217
const Tag = styled . kbd `
211
218
margin: 0;
212
219
background-color: #b0a8fe;
213
220
font-family: var(--pico-font-family);
214
221
font-size: 0.6rem;
215
- `
222
+ ` ;
0 commit comments