Skip to content

Commit 6b43f7a

Browse files
authored
Merge pull request #44 from NUTFes/feat/imaimai/43-prod-update
駐車場情報&マップ新規対応
2 parents 7e33068 + e8b7f00 commit 6b43f7a

6 files changed

Lines changed: 74 additions & 27 deletions

File tree

view/public/images/map.png

-1.2 MB
Loading

view/src/components/common/Header/Header.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ const Header = () => (
1313
}}
1414
className='bg-primary text-textWhite'
1515
>
16-
TrackingParking
16+
駐車場管理システム
1717
</AppBar>
1818
)
1919

view/src/components/common/ParkingCard/ParkingCard.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,6 @@ const ParkingCard = ({ name, maxCapacity, currentCapacity, data, dataLimit }: Pa
7878
gap: '1rem',
7979
minWidth: '300px',
8080
}}
81-
// hoverしたら浮かして影をつける
8281
className='transition-all hover:-translate-y-1 hover:shadow-lg'
8382
>
8483
<h1 className='mr-auto text-xl font-bold'>{name}</h1>

view/src/constants/parkingNames.ts

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,36 @@
1-
export const parkingNames = ['twenty-four']
2-
export const parkingLimit = [24]
1+
export const parkings = [
2+
{
3+
nameJP: '中央',
4+
name: 'central',
5+
limit: 96,
6+
},
7+
{
8+
nameJP: '生物',
9+
name: 'bionics',
10+
limit: 40,
11+
},
12+
{
13+
nameJP: '電気',
14+
name: 'electronics',
15+
limit: 44,
16+
},
17+
{
18+
nameJP: '講義棟西1',
19+
name: 'lecture_west1',
20+
limit: 48,
21+
},
22+
{
23+
nameJP: '講義棟西2',
24+
name: 'lecture_west2',
25+
limit: 44,
26+
},
27+
{
28+
nameJP: '講義棟北',
29+
name: 'lecture_north',
30+
limit: 44 + 159, // 講義棟北2, 3の合計
31+
},
32+
]
333

4-
export type ParkingName = (typeof parkingNames)[number]
34+
export type ParkingName = (typeof parkings)[number]['name']
535

6-
export const isParkingName = (arg: string): arg is ParkingName => parkingNames.includes(arg)
36+
export const isParkingName = (arg: string): arg is ParkingName => parkings.some((parking) => parking.name === arg)

view/src/pages/api/parkings/[parkingName].ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ const handler = async (req: NextApiRequest, res: NextApiResponse) => {
88
const { method } = req
99
const { parkingName } = req.query
1010
if (typeof parkingName !== 'string') throw new Error('parkingName is not string')
11-
if (!isParkingName(parkingName)) throw new Error('parkingName is not valid')
11+
if (!isParkingName(parkingName)) throw new Error('parkingName is not found')
1212

1313
switch (method) {
1414
case 'GET': {
@@ -19,7 +19,7 @@ const handler = async (req: NextApiRequest, res: NextApiResponse) => {
1919
break
2020
}
2121
default:
22-
res.setHeader('Allow', ['GET', 'PUT'])
22+
res.setHeader('Allow', ['GET'])
2323
if (method) res.status(405).end(`Method ${method} Not Allowed`)
2424
else res.status(405).end(`Method Not Allowed`)
2525
}

view/src/pages/index.tsx

Lines changed: 37 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { NextPage } from 'next'
33
import Image from 'next/image'
44

55
import { ParkingCard } from '@/components/common'
6-
import { parkingNames, parkingLimit } from '@/constants/parkingNames'
6+
import { parkings } from '@/constants/parkingNames'
77
import { ParkingData, Parking } from '@/type/parking.type'
88

99
interface Props {
@@ -12,7 +12,7 @@ interface Props {
1212

1313
export const getServerSideProps = async () => {
1414
const parkingData = await Promise.all(
15-
parkingNames.map(async (name) => {
15+
parkings.map(async ({ name, nameJP }) => {
1616
const url = `http://view:3000/api/parkings/${name}`
1717
const res = await fetch(url)
1818

@@ -21,7 +21,7 @@ export const getServerSideProps = async () => {
2121
}
2222
const data = (await res.json()) as Parking[]
2323
return {
24-
name,
24+
name: nameJP,
2525
data,
2626
}
2727
}),
@@ -39,34 +39,52 @@ export const Home: NextPage<Props> = ({ parkingData }: Props) => (
3939
<div className='my-10 flex flex-col items-center'>
4040
<Card
4141
sx={{
42-
width: 'fit-content',
43-
p: '2rem',
44-
mxnWidth: '90%',
42+
width: '90%',
4543
display: 'flex',
4644
flexDirection: 'column',
4745
gap: '2rem',
4846
alignItems: 'center',
4947
boxShadow: '0 0 10px 0 rgba(0, 0, 0, 0.2)',
5048
}}
51-
className='bg-white text-textBlack'
49+
className='bg-white p-4 text-textBlack md:p-8'
5250
>
53-
<div className='w-4/5'>
54-
<Image src='/images/map.png' alt='map' width={500} height={500} className='w-full' />
51+
<div className='flex w-full justify-center'>
52+
<Image src='/images/map.png' alt='map' width={500} height={500} className='w-full md:w-1/2' />
5553
</div>
5654
<Typography variant='h5' fontWeight='bold'>
5755
現在の駐車状況
5856
</Typography>
5957
<div className='gird-cols-1 grid gap-5 md:grid-cols-3'>
60-
{parkingData.map(({ name, data }, index) => (
61-
<ParkingCard
62-
key={name}
63-
name={name}
64-
currentCapacity={data[data.length - 1].count}
65-
maxCapacity={parkingLimit[index]}
66-
data={data}
67-
dataLimit={20}
68-
/>
69-
))}
58+
{parkingData.map(({ name, data }, index) => {
59+
if (!data.length)
60+
return (
61+
<Card
62+
sx={{
63+
p: '1rem',
64+
backgroundColor: 'white',
65+
display: 'flex',
66+
flexDirection: 'column',
67+
gap: '1rem',
68+
minWidth: '300px',
69+
}}
70+
>
71+
<div className='flex flex-col gap-4'>
72+
<p className='text-xl'>{name}</p>
73+
<p className='text-sm'>読み込みに失敗しました</p>
74+
</div>
75+
</Card>
76+
)
77+
return (
78+
<ParkingCard
79+
key={name}
80+
name={name}
81+
currentCapacity={data[data.length - 1].count}
82+
maxCapacity={parkings[index].limit}
83+
data={data}
84+
dataLimit={20}
85+
/>
86+
)
87+
})}
7088
</div>
7189
</Card>
7290
</div>

0 commit comments

Comments
 (0)