Skip to content

Commit 353ebe2

Browse files
committed
WIP
1 parent b2c7983 commit 353ebe2

File tree

6 files changed

+160
-8
lines changed

6 files changed

+160
-8
lines changed

frontend/components/service/Program/Speaker.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import React from 'react'
12
import { ISpeaker } from '../../../interfaces/IProgram'
23
import styled from 'styled-components'
34
import { media } from '../../../assets/styles/mixin'
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import React from 'react'
2+
import { ITalkItem, ITalkTableData } from '../../../interfaces/IProgram'
3+
import styled from 'styled-components'
4+
5+
const Table = styled.table`
6+
width: 100%;
7+
`
8+
9+
const TalkTable = (props: {
10+
day: string
11+
headers: string[]
12+
list: ITalkItem[]
13+
}) => {
14+
const headers = ['트랙1(101)', '트랙2(102)']
15+
16+
return (
17+
<div>
18+
<table>
19+
<thead>
20+
<tr>
21+
<th>
22+
시간
23+
<br />
24+
(KST)
25+
</th>
26+
{headers.map((header) => (
27+
<th key={header}>{header}</th>
28+
))}
29+
</tr>
30+
</thead>
31+
<tbody></tbody>
32+
</table>
33+
</div>
34+
)
35+
}
36+
37+
export default TalkTable
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import React, { useState } from 'react'
2+
import styled from 'styled-components'
3+
4+
const ButtonGroup = styled.div`
5+
display: flex;
6+
width: 100%;
7+
align-items: center;
8+
justify-content: center;
9+
`
10+
const Button = styled.button<{ selected: boolean }>`
11+
border-radius: 4px;
12+
font-size: 1rem;
13+
padding: 0 2rem;
14+
background: inherit;
15+
cursor: pointer;
16+
border: 0;
17+
cursor: pointer;
18+
color: ${(props) => props.theme.colors.white};
19+
text-decoration: ${(props) => (props.selected ? 'underline' : 'none')};
20+
`
21+
22+
interface ToggleProps {
23+
handleClick: (day: string) => void
24+
}
25+
26+
const TalkTableToggleButton: React.FC<ToggleProps> = ({ handleClick }) => {
27+
const [checked, setChecked] = useState<string>('day1')
28+
29+
const handleToggle = (day: string): void => {
30+
setChecked(day)
31+
handleClick(day)
32+
}
33+
34+
return (
35+
<ButtonGroup>
36+
<Button
37+
selected={checked === 'day1'}
38+
onClick={() => handleToggle('day1')}
39+
>
40+
10/1 (토)
41+
</Button>
42+
<Button
43+
selected={checked === 'day2'}
44+
onClick={() => handleToggle('day2')}
45+
>
46+
10/2 (일)
47+
</Button>
48+
</ButtonGroup>
49+
)
50+
}
51+
52+
export default TalkTableToggleButton

frontend/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
"@sls-next/serverless-component": "^3.7.0",
1616
"axios": "^0.27.2",
1717
"babel-plugin-styled-components": "^2.0.6",
18+
"date-fns": "^2.29.3",
1819
"env-cmd": "^10.1.0",
1920
"gray-matter": "^4.0.3",
2021
"i18next": "^21.6.14",

frontend/pages/program/talk-schedule.tsx

Lines changed: 64 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,81 @@
1-
import React from 'react'
1+
import React, { useState } from 'react'
22
import type { NextPage, GetServerSideProps } from 'next'
33
import { useTranslation } from 'react-i18next'
44
import { PageName } from '../../data/enums/PageName'
55
import PageTitle from '../../components/core/PageTitle'
66
import { PageProps } from '../../interfaces/PageProps'
7+
import { getTalkList } from '../api/program'
8+
import { GetServerSidePropsContext } from 'next'
9+
import { ITalkItem, ITalkList } from '../../interfaces/IProgram'
10+
import { compareAsc, isSameDay } from 'date-fns'
11+
import TalkTableToggleButton from '../../components/service/Program/TalkTableToggleButton'
12+
import TalkTable from '../../components/service/Program/TalkTable'
713

8-
const TalkSchedule: NextPage = (props: PageProps) => {
14+
interface TalkTableProps extends PageProps {
15+
data: ITalkList
16+
}
17+
18+
const TalkSchedule: NextPage = (props: TalkTableProps) => {
919
const { t } = useTranslation()
20+
const { pageName, data } = props
21+
const [selectedDay, setSelectedDay] = useState<string>('day1')
22+
23+
const updateSelectedDay = (day: string) => {
24+
setSelectedDay(day)
25+
}
26+
27+
const tableData: ITalkItem[] = data.list.sort((a, b) =>
28+
compareAsc(new Date(a.video_open_at), new Date(b.video_open_at))
29+
)
30+
31+
const day1tableList: ITalkItem[] = tableData.filter((item) =>
32+
isSameDay(new Date(item.video_open_at), new Date(2022, 9, 1))
33+
)
34+
const day2tableList: ITalkItem[] = tableData.filter((item) =>
35+
isSameDay(new Date(item.video_open_at), new Date(2022, 10, 1))
36+
)
1037

1138
return (
1239
<div>
13-
<PageTitle title={props.pageName} />
14-
{t('label:preparing')}
40+
<PageTitle title={pageName} />
41+
<TalkTableToggleButton handleClick={updateSelectedDay} />
42+
{selectedDay === 'day1' ? (
43+
<TalkTable
44+
day="day1"
45+
headers={['트랙1(101)', '트랙2(102)']}
46+
list={day1tableList}
47+
/>
48+
) : (
49+
<TalkTable
50+
day="day2"
51+
headers={['트랙1(103)', '트랙2(104)']}
52+
list={day2tableList}
53+
/>
54+
)}
1555
</div>
1656
)
1757
}
1858

19-
export const getServerSideProps: GetServerSideProps = async () => {
20-
return {
21-
props: {
22-
title: PageName.TalkSchedule
59+
export const getServerSideProps: GetServerSideProps = async (
60+
context: GetServerSidePropsContext
61+
) => {
62+
const { locale } = context
63+
try {
64+
const data: ITalkList = await getTalkList()
65+
66+
return {
67+
props: {
68+
title: PageName.TalkSchedule,
69+
locale,
70+
data
71+
}
72+
}
73+
} catch (error) {
74+
// TODO: Add error interface
75+
if (error.notFound) {
76+
return {
77+
notFound: true
78+
}
2379
}
2480
}
2581
}

yarn.lock

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3831,6 +3831,11 @@ [email protected]:
38313831
resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636"
38323832
integrity sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==
38333833

3834+
date-fns@^2.29.3:
3835+
version "2.29.3"
3836+
resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.3.tgz#27402d2fc67eb442b511b70bbdf98e6411cd68a8"
3837+
integrity sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==
3838+
38343839
dayjs@^1.10.4, dayjs@^1.10.7:
38353840
version "1.11.2"
38363841
resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.2.tgz#fa0f5223ef0d6724b3d8327134890cfe3d72fbe5"

0 commit comments

Comments
 (0)