Skip to content

Commit bcec32f

Browse files
committed
태그 필터 추가 및 세션만 나오도록 목록 수정
1 parent bffeb98 commit bcec32f

File tree

1 file changed

+81
-29
lines changed

1 file changed

+81
-29
lines changed

src/pages/Session/list.tsx

Lines changed: 81 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,28 @@ import { APIPretalxSessions } from 'models/api/session'
1010
import { useListSessionsQuery } from 'utils/hooks/useAPI'
1111
import useTranslation from "utils/hooks/useTranslation"
1212

13+
const ENABLE_PROFILE_IMG_AND_DETAILS = false
14+
1315
const SessionItem: React.FC<{ session: APIPretalxSessions[0] }> = ({ session }) => {
1416
const t = useTranslation()
1517
const navigate = useNavigate()
1618

19+
const h4Props = ENABLE_PROFILE_IMG_AND_DETAILS ? { onClick: () => navigate(`/session/${session.code}`) } : {}
20+
1721
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+
}
2127
<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>
2430
<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>
2935
</SessionItemInfoContainer>
3036
</SessionItemEl>
3137
}
@@ -39,7 +45,25 @@ export const SessionListPage = () => {
3945
.on(() => {
4046
// eslint-disable-next-line react-hooks/rules-of-hooks
4147
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+
</>
4367
})
4468

4569
return (
@@ -52,11 +76,36 @@ export const SessionListPage = () => {
5276
)
5377
}
5478

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+
55104
const SessionItemEl = styled.div`
56105
display: flex;
57106
align-items: center;
58107
justify-content: flex-start;
59-
padding: 1rem;
108+
padding: 0.75rem;
60109
gap: 1rem;
61110
62111
color: var(--pico-h6-color);
@@ -71,9 +120,9 @@ const SessionItemEl = styled.div`
71120
`
72121

73122
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;
77126
flex-shrink: 0;
78127
flex-grow: 0;
79128
@@ -98,29 +147,32 @@ const SessionItemImgContainer = styled.div`
98147
`
99148

100149
const SessionItemInfoContainer = styled.div`
101-
padding-top: 0.75rem;
102-
padding-bottom: 0.75rem;
150+
padding-top: 0.5rem;
151+
padding-bottom: 0.5rem;
103152
104153
flex-grow: 1;
105154
106-
h3 {
155+
h4 {
107156
color: #FEBD99;
108-
margin-bottom: 0.5rem;
109-
cursor: pointer;
157+
margin-bottom: 0.2rem;
158+
cursor: ${ENABLE_PROFILE_IMG_AND_DETAILS ? 'pointer' : 'default'};
110159
}
111160
112-
h6 {
161+
p {
162+
margin-bottom: 0.3rem;
113163
color: var(--pico-h3-color);
114-
margin-bottom: 0.5rem;
164+
font-size: 0.8rem;
165+
font-weight: bold;
115166
}
116167
117168
@media only screen and (max-width: 809px) {
118169
h3 {
119170
font-size: 1.5rem;
120171
}
121172
122-
h6 {
173+
p {
123174
font-size: 0.8rem;
175+
font-weight: bold;
124176
}
125177
}
126178
`
@@ -131,6 +183,7 @@ const SessionSpeakerContainer = styled.div`
131183
justify-content: flex-start;
132184
gap: 0.5rem;
133185
color: var(--pico-h6-color);
186+
font-size: 0.6rem;
134187
135188
img {
136189
width: 0.75rem;
@@ -145,26 +198,25 @@ const SessionSpeakerContainer = styled.div`
145198
146199
kbd {
147200
background-color: #def080;
148-
padding: 0.25rem 0.5rem;
201+
padding: 0.2rem 0.4rem;
149202
border-radius: 0.25rem;
150203
151-
font-size: 0.75rem;
204+
font-size: 0.6rem;
152205
}
153206
`
154207

155-
const SmallTagContainer = styled.div`
208+
const TagContainer = styled.div`
156209
display: flex;
157210
align-items: center;
158211
justify-content: flex-start;
159212
padding: 0.25rem 0;
160213
gap: 0.25rem;
161214
`
162215

163-
const SmallTag = styled.kbd`
216+
const Tag = styled.kbd`
164217
background-color: #b0a8fe;
165-
padding: 0.1rem 0.25rem;
218+
padding: 0.2rem 0.4rem;
166219
border-radius: 0.25rem;
167-
font-family: var(--pico-font-family);
168220
169-
font-size: 0.75rem;
221+
font-size: 0.6rem;
170222
`

0 commit comments

Comments
 (0)