Skip to content

Commit c01d2b6

Browse files
authored
スポンサー(パートナー)ページの実装 (#170)
* feat: partner page * SAMPLE json / images * fix: `desc` to `description` * fix: simplify prop type name * fix: `desc` to `description` * fix: extract params from context
1 parent 4c6a43e commit c01d2b6

File tree

8 files changed

+133
-1
lines changed

8 files changed

+133
-1
lines changed

data/partners.json

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
{
2+
"platinum": [
3+
{
4+
"id": "platinum-1",
5+
"name": "株式会社 プラチナワン",
6+
"description": "Sea tempor feugait et elit et sanctus kasd eirmod. Praesent amet qui iriure ipsum exerci clita sit et volutpat eos rebum elitr. Autem laoreet labore lorem commodo. At aliquyam sit est kasd diam nostrud adipiscing nonumy sit duo dolores in dolor suscipit. Consetetur quis ea dolore sed in magna facilisi delenit. Erat kasd at sea ex takimata feugiat. Eos tempor diam delenit adipiscing takimata. Autem diam accusam. Et nisl sanctus kasd ipsum diam odio nonumy amet. Nisl sed amet sea et clita autem nostrud dolore autem euismod invidunt. Augue blandit tempor no dolore. Et sit no duo. Diam takimata lobortis erat eos consetetur dolor ut ea amet justo eum eos invidunt ipsum nonummy justo ut."
7+
},
8+
{
9+
"id": "platinum-2",
10+
"name": "株式会社 プラチナツー",
11+
"description": "Sea tempor feugait et elit et sanctus kasd eirmod. Praesent amet qui iriure ipsum exerci clita sit et volutpat eos rebum elitr. Autem laoreet labore lorem commodo. At aliquyam sit est kasd diam nostrud adipiscing nonumy sit duo dolores in dolor suscipit. Consetetur quis ea dolore sed in magna facilisi delenit. Erat kasd at sea ex takimata feugiat. Eos tempor diam delenit adipiscing takimata. Autem diam accusam. Et nisl sanctus kasd ipsum diam odio nonumy amet. Nisl sed amet sea et clita autem nostrud dolore autem euismod invidunt. Augue blandit tempor no dolore. Et sit no duo. Diam takimata lobortis erat eos consetetur dolor ut ea amet justo eum eos invidunt ipsum nonummy justo ut."
12+
}
13+
],
14+
"gold": [
15+
{
16+
"id": "gold-1",
17+
"name": "株式会社 ゴールドワン",
18+
"description": "Hendrerit duis te vel et possim et feugiat. Dolores clita lorem quis nibh no takimata dolores invidunt vero rebum tempor. Nibh sanctus accusam commodo facilisis eirmod no at consetetur feugiat erat et dolores justo labore vel vel et. Et tation euismod vel duo assum ipsum takimata est et vulputate no dolore."
19+
},
20+
{
21+
"id": "gold-2",
22+
"name": "株式会社 ゴールド・ツー",
23+
"description": "Hendrerit duis te vel et possim et feugiat. Dolores clita lorem quis nibh no takimata dolores invidunt vero rebum tempor. Nibh sanctus accusam commodo facilisis eirmod no at consetetur feugiat erat et dolores justo labore vel vel et. Et tation euismod vel duo assum ipsum takimata est et vulputate no dolore."
24+
}
25+
],
26+
"silver": [
27+
"silver-1",
28+
"silver-2",
29+
"silver-3",
30+
"silver-4",
31+
"silver-5",
32+
"silver-6",
33+
"silver-7",
34+
"silver-8"
35+
],
36+
"bronze": [
37+
"bronze-1",
38+
"bronze-2",
39+
"bronze-3",
40+
"bronze-4",
41+
"bronze-5",
42+
"bronze-6",
43+
"bronze-7",
44+
"bronze-8",
45+
"bronze-9",
46+
"bronze-10",
47+
"bronze-11",
48+
"bronze-12"
49+
]
50+
}

public/images/partners/gold-1.png

9.33 KB
Loading

public/images/partners/gold-2.png

9.33 KB
Loading

public/images/partners/platinum-1.png

10.2 KB
Loading

public/images/partners/platinum-2.png

10.2 KB
Loading

src/components/commons/Layout/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ export const Layout: NextPage<LayoutProps> = ({ children }) => {
5656
<Box>
5757
<Header />
5858
</Box>
59-
<Box component="main" sx={{ minHeight: 'calc(100vh - 124px)' }}>
59+
<Box component="main" sx={{ minHeight: 'calc(100vh - 300px)' }}>
6060
{children}
6161
</Box>
6262
<Box>
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { Box, Typography } from '@mui/material'
2+
import { NextPage } from 'next'
3+
import Image from 'next/image'
4+
import { Layout } from 'src/components/commons'
5+
import { Header } from 'src/components/organisms'
6+
7+
export type PartnerRank = 'platinum' | 'gold'
8+
9+
type Props = {
10+
id: string
11+
name: string
12+
description: string
13+
}
14+
15+
export const PagePartner = ({ id, name, description }: Props) => {
16+
return (
17+
<Layout>
18+
<Box sx={{ mx: '160px' }} display="flex" flexDirection="column">
19+
<Box sx={{ mt: '120px', py: '24px' }} display="flex">
20+
<Image src={`/2023/images/partners/${id}.png`} width={'200px'} height={'120px'} alt={id} />
21+
<Typography variant="h1" sx={{ ml: '24px', width: '100%', textAlign: 'center', alignContent: 'center' }}>
22+
{name}
23+
</Typography>
24+
</Box>
25+
<Box>
26+
<Typography variant="body1">{description}</Typography>
27+
</Box>
28+
</Box>
29+
</Layout>
30+
)
31+
}

src/pages/partners/[rank]/[id].tsx

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import { GetStaticPaths, GetStaticProps } from 'next'
2+
import { PagePartner } from 'src/components/pages/PagePartner'
3+
4+
import partners from 'data/partners.json'
5+
6+
export type Rank = keyof typeof partners
7+
8+
type PageProps = {
9+
id: string
10+
name: string
11+
description: string
12+
rank: Extract<Rank, 'platinum' | 'gold'>
13+
}
14+
15+
export const PartnerPage = (props: PageProps) => {
16+
return <PagePartner {...props} />
17+
}
18+
19+
type PathProps = Pick<PageProps, 'id' | 'rank'>
20+
21+
export const getStaticPaths: GetStaticPaths<PathProps> = async () => {
22+
const platinumPartners = partners.platinum.map(p => ({ params: { rank: 'platinum' as const, id: p.id } }))
23+
const goldPartners = partners.gold.map(p => ({ params: { rank: 'gold' as const, id: p.id } }))
24+
25+
return {
26+
paths: [...platinumPartners, ...goldPartners],
27+
fallback: false
28+
}
29+
}
30+
31+
/**
32+
* partners.json から path params に対応した情報の抜き出し page の props として返す
33+
*/
34+
export const getStaticProps: GetStaticProps<PageProps> = async ({ params }) => {
35+
const rank = params?.rank as Rank | undefined
36+
if (!rank) throw new Error(`rank is required : ${params}`)
37+
if (rank !== 'platinum' && rank !== 'gold') throw new Error('invalid rank')
38+
39+
const id = params?.id as string | undefined
40+
if (!id) throw new Error(`id is required : ${params}`)
41+
42+
const { name, description } = partners[rank].find(p => p.id === id) ?? {}
43+
if (!name) throw new Error(`name is required : ${params}`)
44+
if (!description) throw new Error(`description is required : ${params}`)
45+
46+
return {
47+
props: { id, name, rank, description }
48+
}
49+
}
50+
51+
export default PartnerPage

0 commit comments

Comments
 (0)