@@ -17,7 +17,8 @@ import { createTheme, ThemeProvider } from '@mui/material/styles';
1717import axios from 'axios' ;
1818import { useState } from 'react' ;
1919import { useNavigate } from 'react-router-dom' ;
20- import type { ApiErrorResponse , AuthResponse } from '../types' ;
20+ // ▼▼▼ SigninRequest を追加 ▼▼▼
21+ import type { ApiErrorResponse , AuthResponse , SigninRequest } from '../types' ;
2122
2223const API_URL = 'https://test.sheeplab.net/api' ;
2324
@@ -34,10 +35,9 @@ const theme = createTheme({
3435 shape : { borderRadius : 16 } ,
3536} ) ;
3637
37- // Propsの定義を更新
3838interface LoginProps {
3939 setToken : ( _token : string ) => void ;
40- setRefreshToken : ( _refreshToken : string ) => void ; // 追加
40+ setRefreshToken : ( _refreshToken : string ) => void ;
4141 setUserId : ( _userId : string ) => void ;
4242}
4343
@@ -54,9 +54,15 @@ export default function Login({ setToken, setRefreshToken, setUserId }: LoginPro
5454 setErrorMsg ( null ) ;
5555
5656 try {
57- const res = await axios . post < AuthResponse > ( `${ API_URL } /auth/signin` , { email, password } ) ;
57+ const req : SigninRequest = {
58+ email,
59+ password,
60+ } ;
61+
62+ const res = await axios . post < AuthResponse > ( `${ API_URL } /auth/signin` , req ) ;
63+
5864 setToken ( res . data . access_token ) ;
59- setRefreshToken ( res . data . refresh_token || '' ) ; // refresh_tokenを保存
65+ setRefreshToken ( res . data . refresh_token || '' ) ;
6066 setUserId ( res . data . user . id ) ;
6167 navigate ( '/' ) ;
6268 } catch ( error ) {
@@ -83,30 +89,27 @@ export default function Login({ setToken, setRefreshToken, setUserId }: LoginPro
8389 alignItems : 'center' ,
8490 justifyContent : 'center' ,
8591 bgcolor : '#f0f2f5' ,
86- p : { xs : 2 , md : 4 } , // スマホとPCで余白を変える
92+ p : { xs : 2 , md : 4 } ,
8793 } }
8894 >
8995 < Paper
9096 elevation = { 12 }
9197 sx = { {
9298 display : 'flex' ,
93- // 【修正】PCフルサイズ対応: 幅を広げ、高さを増やす
9499 maxWidth : 'xl' ,
95100 width : '100%' ,
96- // スマホは中身に合わせて伸縮(auto)、PCは固定高さ(700px)で迫力を出す
97101 minHeight : { xs : 'auto' , md : '80vh' } ,
98102 overflow : 'hidden' ,
99- flexDirection : { xs : 'column' , md : 'row' } , // スマホは縦並び、PCは横並び
103+ flexDirection : { xs : 'column' , md : 'row' } ,
100104 } }
101105 >
102- { /* 左側:ビジュアルエリア (スマホでは非表示) */ }
106+ { /* 左側:ビジュアルエリア */ }
103107 < Grid
104108 container
105109 sx = { {
106- // 【修正】PCの大画面では画像エリアを広め(55-60%)にとる
107110 width : { xs : '100%' , md : '55%' , lg : '60%' } ,
108111 background : 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)' ,
109- display : { xs : 'none' , md : 'flex' } , // スマホでは隠す
112+ display : { xs : 'none' , md : 'flex' } ,
110113 flexDirection : 'column' ,
111114 justifyContent : 'center' ,
112115 alignItems : 'center' ,
@@ -115,7 +118,6 @@ export default function Login({ setToken, setRefreshToken, setUserId }: LoginPro
115118 position : 'relative' ,
116119 } }
117120 >
118- { /* 装飾用の円 (薄く背景に入れる) */ }
119121 < Box
120122 sx = { {
121123 position : 'absolute' ,
@@ -141,7 +143,7 @@ export default function Login({ setToken, setRefreshToken, setUserId }: LoginPro
141143
142144 < MonitorHeartIcon sx = { { fontSize : { md : 100 , lg : 120 } , mb : 3 , opacity : 0.9 } } />
143145 < Typography
144- variant = "h3" // 文字サイズを大きく
146+ variant = "h3"
145147 component = "div"
146148 sx = { { mb : 2 , textShadow : '0 2px 4px rgba(0,0,0,0.2)' , fontWeight : 800 } }
147149 >
@@ -157,13 +159,12 @@ export default function Login({ setToken, setRefreshToken, setUserId }: LoginPro
157159 { /* 右側:入力フォームエリア */ }
158160 < Box
159161 sx = { {
160- // 【修正】残りの幅を使う
161162 width : { xs : '100%' , md : '45%' , lg : '40%' } ,
162163 display : 'flex' ,
163164 flexDirection : 'column' ,
164165 justifyContent : 'center' ,
165166 alignItems : 'center' ,
166- p : { xs : 4 , md : 6 , lg : 8 } , // PCでは内側の余白をたっぷりとる
167+ p : { xs : 4 , md : 6 , lg : 8 } ,
167168 } }
168169 >
169170 < Avatar sx = { { m : 1 , bgcolor : '#667eea' , width : 56 , height : 56 } } >
@@ -192,7 +193,6 @@ export default function Login({ setToken, setRefreshToken, setUserId }: LoginPro
192193 value = { email }
193194 onChange = { ( e ) => setEmail ( e . target . value ) }
194195 autoFocus
195- // PCで見やすいように入力欄の高さを調整
196196 InputProps = { { sx : { height : 56 , fontSize : '1.1rem' } } }
197197 InputLabelProps = { { sx : { fontSize : '1rem' } } }
198198 />
0 commit comments