@@ -10,22 +10,28 @@ import { APIPretalxSessions } from 'models/api/session'
10
10
import { useListSessionsQuery } from 'utils/hooks/useAPI'
11
11
import useTranslation from "utils/hooks/useTranslation"
12
12
13
+ const ENABLE_PROFILE_IMG_AND_DETAILS = false
14
+
13
15
const SessionItem : React . FC < { session : APIPretalxSessions [ 0 ] } > = ( { session } ) => {
14
16
const t = useTranslation ( )
15
17
const navigate = useNavigate ( )
16
18
19
+ const h4Props = ENABLE_PROFILE_IMG_AND_DETAILS ? { onClick : ( ) => navigate ( `/session/${ session . code } ` ) } : { }
20
+
17
21
return < SessionItemEl >
18
- < SessionItemImgContainer >
19
- < FallbackImg src = { session . image || '' } alt = { session . title } errorFallback = { < SloganShort /> } />
20
- </ SessionItemImgContainer >
22
+ {
23
+ ENABLE_PROFILE_IMG_AND_DETAILS && < SessionItemImgContainer >
24
+ < FallbackImg src = { session . image || '' } alt = { session . title } errorFallback = { < SloganShort /> } />
25
+ </ SessionItemImgContainer >
26
+ }
21
27
< SessionItemInfoContainer >
22
- < h3 onClick = { ( ) => navigate ( `/session/ ${ session . code } ` ) } > { session . title } </ h3 >
23
- < h6 > { session . abstract } </ h6 >
28
+ < h4 { ... h4Props } > { session . title } </ h4 >
29
+ < p > { session . abstract } </ p >
24
30
< SessionSpeakerContainer > by { session . speakers . map ( ( speaker ) => < kbd key = { speaker . code } > { speaker . name } </ kbd > ) } </ SessionSpeakerContainer >
25
- < SmallTagContainer >
26
- { session . tags . map ( tag => < SmallTag key = { tag } > { tag } </ SmallTag > ) }
27
- { session . do_not_record && < SmallTag > { t ( '녹화 불가' ) } </ SmallTag > }
28
- </ SmallTagContainer >
31
+ < TagContainer >
32
+ { session . tags . map ( tag => < Tag key = { tag } > { tag } </ Tag > ) }
33
+ { session . do_not_record && < Tag > { t ( '녹화 불가' ) } </ Tag > }
34
+ </ TagContainer >
29
35
</ SessionItemInfoContainer >
30
36
</ SessionItemEl >
31
37
}
@@ -39,7 +45,25 @@ export const SessionListPage = () => {
39
45
. on ( ( ) => {
40
46
// eslint-disable-next-line react-hooks/rules-of-hooks
41
47
const { data } = useListSessionsQuery ( )
42
- return < > { data . map ( ( session ) => < SessionItem key = { session . code } session = { session } /> ) } </ >
48
+ // eslint-disable-next-line react-hooks/rules-of-hooks
49
+ const [ currentTag , setTag ] = React . useState < string | null > ( null )
50
+ const setOrUnsetTag = ( tag : string ) => setTag ( currentTag === tag ? null : tag )
51
+ const sessionOnlyData = data
52
+ . filter ( ( d ) => d . submission_type . en === 'Session' )
53
+ . filter ( ( d ) => currentTag === null || d . tags . includes ( currentTag ) )
54
+
55
+ const tags = Array . from ( new Set ( data . flatMap ( ( session ) => session . tags ) ) ) . sort ( )
56
+ return < >
57
+ < hr style = { { margin : 0 } } />
58
+ < TagFilterBtnContainer >
59
+ < div >
60
+ { tags . map ( ( tag ) => < TagFilterBtn key = { tag } onClick = { ( ) => setOrUnsetTag ( tag ) } className = { tag === currentTag ? 'selected' : '' } >
61
+ { tag }
62
+ </ TagFilterBtn > ) }
63
+ </ div >
64
+ </ TagFilterBtnContainer >
65
+ { sessionOnlyData . map ( ( session ) => < SessionItem key = { session . code } session = { session } /> ) }
66
+ </ >
43
67
} )
44
68
45
69
return (
@@ -52,11 +76,36 @@ export const SessionListPage = () => {
52
76
)
53
77
}
54
78
79
+ const TagFilterBtnContainer = styled . div `
80
+ display: flex;
81
+ align-items: center;
82
+ justify-content: center;
83
+ `
84
+
85
+ const TagFilterBtn = styled . button `
86
+ background-color: rgba(0, 0, 0, 0);
87
+ border: none;
88
+ outline: none;
89
+ padding: 0.25rem 0.5rem;
90
+ margin: 0.25rem;
91
+ font-size: 0.8rem;
92
+
93
+ &:focus, button::-moz-focus-inner {
94
+ outline: none !important;
95
+ }
96
+
97
+ &.selected {
98
+ background-color: #b0a8fe;
99
+ color: black;
100
+ font-weight: bold;
101
+ }
102
+ `
103
+
55
104
const SessionItemEl = styled . div `
56
105
display: flex;
57
106
align-items: center;
58
107
justify-content: flex-start;
59
- padding: 1rem ;
108
+ padding: 0.75rem ;
60
109
gap: 1rem;
61
110
62
111
color: var(--pico-h6-color);
@@ -71,9 +120,9 @@ const SessionItemEl = styled.div`
71
120
`
72
121
73
122
const SessionItemImgContainer = styled . div `
74
- width: 7.5rem ;
75
- height: 7.5rem ;
76
- margin: 0.75rem ;
123
+ width: 6rem ;
124
+ height: 6rem ;
125
+ margin: 0.6rem ;
77
126
flex-shrink: 0;
78
127
flex-grow: 0;
79
128
@@ -98,29 +147,32 @@ const SessionItemImgContainer = styled.div`
98
147
`
99
148
100
149
const SessionItemInfoContainer = styled . div `
101
- padding-top: 0.75rem ;
102
- padding-bottom: 0.75rem ;
150
+ padding-top: 0.5rem ;
151
+ padding-bottom: 0.5rem ;
103
152
104
153
flex-grow: 1;
105
154
106
- h3 {
155
+ h4 {
107
156
color: #FEBD99;
108
- margin-bottom: 0.5rem ;
109
- cursor: pointer;
157
+ margin-bottom: 0.2rem ;
158
+ cursor: ${ ENABLE_PROFILE_IMG_AND_DETAILS ? ' pointer' : 'default' } ;
110
159
}
111
160
112
- h6 {
161
+ p {
162
+ margin-bottom: 0.3rem;
113
163
color: var(--pico-h3-color);
114
- margin-bottom: 0.5rem;
164
+ font-size: 0.8rem;
165
+ font-weight: bold;
115
166
}
116
167
117
168
@media only screen and (max-width: 809px) {
118
169
h3 {
119
170
font-size: 1.5rem;
120
171
}
121
172
122
- h6 {
173
+ p {
123
174
font-size: 0.8rem;
175
+ font-weight: bold;
124
176
}
125
177
}
126
178
`
@@ -131,6 +183,7 @@ const SessionSpeakerContainer = styled.div`
131
183
justify-content: flex-start;
132
184
gap: 0.5rem;
133
185
color: var(--pico-h6-color);
186
+ font-size: 0.6rem;
134
187
135
188
img {
136
189
width: 0.75rem;
@@ -145,26 +198,25 @@ const SessionSpeakerContainer = styled.div`
145
198
146
199
kbd {
147
200
background-color: #def080;
148
- padding: 0.25rem 0.5rem ;
201
+ padding: 0.2rem 0.4rem ;
149
202
border-radius: 0.25rem;
150
203
151
- font-size: 0.75rem ;
204
+ font-size: 0.6rem ;
152
205
}
153
206
`
154
207
155
- const SmallTagContainer = styled . div `
208
+ const TagContainer = styled . div `
156
209
display: flex;
157
210
align-items: center;
158
211
justify-content: flex-start;
159
212
padding: 0.25rem 0;
160
213
gap: 0.25rem;
161
214
`
162
215
163
- const SmallTag = styled . kbd `
216
+ const Tag = styled . kbd `
164
217
background-color: #b0a8fe;
165
- padding: 0.1rem 0.25rem ;
218
+ padding: 0.2rem 0.4rem ;
166
219
border-radius: 0.25rem;
167
- font-family: var(--pico-font-family);
168
220
169
- font-size: 0.75rem ;
221
+ font-size: 0.6rem ;
170
222
`
0 commit comments