Skip to content

Commit ad8f262

Browse files
committed
fix: 제어 컴포넌트와 react-hook-form 혼합 사용 문제 해결
1 parent 8f13ecd commit ad8f262

File tree

3 files changed

+24
-11
lines changed

3 files changed

+24
-11
lines changed

src/pages/join/InfoInputPage.tsx

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,24 +6,28 @@ import { useNavigate } from 'react-router-dom';
66
import { FormData, zodValidation } from '../../shared/lib/formValidation';
77
import { useUserInfo, useUserUpdate } from '../../features/join/hooks/useUserHook';
88
import useAuthStore from '../../app/provider/authStore';
9+
import { useEffect } from 'react';
910

1011
const InfoInputPage = () => {
1112
const { data, isLoading } = useUserInfo();
12-
const { login, setName} = useAuthStore();
13+
const { login, setName } = useAuthStore();
1314
const { mutate: updateUser } = useUserUpdate();
1415
const {
1516
register,
1617
handleSubmit,
1718
formState: { errors, isValid },
19+
reset,
1820
} = useForm<FormData>({
1921
mode: 'onChange',
22+
defaultValues: {
23+
name: '',
24+
email: '',
25+
phone: '',
26+
},
2027
...zodValidation,
2128
});
2229
const navigate = useNavigate();
2330

24-
const nameValue = data?.name;
25-
const emailValue = data?.email;
26-
2731
const onSubmit: SubmitHandler<FormData> = formData => {
2832
const updatedData = {
2933
id: data?.id || 0,
@@ -44,7 +48,15 @@ const InfoInputPage = () => {
4448
},
4549
});
4650
};
47-
51+
useEffect(() => {
52+
if (data) {
53+
reset({
54+
name: data.name || '',
55+
email: data.email || '',
56+
phone: '',
57+
});
58+
}
59+
}, [data, reset]);
4860
if (isLoading) {
4961
return <div>로딩 중...</div>;
5062
}
@@ -62,7 +74,6 @@ const InfoInputPage = () => {
6274
<UnderlineTextField
6375
label="이름"
6476
placeholder="이름"
65-
value={nameValue}
6677
errorMessage={errors.name?.message}
6778
className="text-xl"
6879
{...register('name')}
@@ -82,7 +93,6 @@ const InfoInputPage = () => {
8293
<UnderlineTextField
8394
label="이메일"
8495
placeholder="이메일"
85-
value={emailValue}
8696
type="email"
8797
errorMessage={errors.email?.message}
8898
className="text-xl"

src/pages/join/LogoutPage.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,24 @@
11
import { useEffect } from 'react';
22
import { useNavigate } from 'react-router-dom';
33
import { axiosClient } from '../../shared/types/api/http-client';
4+
import useAuthStore from '../../app/provider/authStore';
45

56
const LogoutPage = () => {
67
const navigate = useNavigate();
8+
const { logout } = useAuthStore();
79

810
useEffect(() => {
9-
const logout = async () => {
11+
const handleLogout = async () => {
1012
try {
1113
await axiosClient.post('/oauth/logout');
14+
logout();
1215
navigate('/');
1316
} catch (error) {
1417
console.error('로그아웃 실패:', error);
1518
alert('로그아웃에 실패했습니다. 다시 시도해주세요.');
1619
}
1720
};
18-
logout();
21+
handleLogout();
1922
}, [navigate]);
2023

2124
return <div>로그아웃 중...</div>;

src/shared/types/api/http-client.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import axios, { AxiosError, AxiosResponse } from 'axios';
1+
import axios, { AxiosError, AxiosRequestConfig, AxiosResponse } from 'axios';
22
import { ApiErrorResponse } from './apiResponse';
33
import Cookies from 'js-cookie';
44
import useAuthStore from '../../../app/provider/authStore';
@@ -36,7 +36,7 @@ axiosClient.interceptors.response.use(
3636
message: error.response?.data?.message || error.message,
3737
};
3838

39-
const originalRequest = error.config as any;
39+
const originalRequest = error.config as AxiosRequestConfig & { _retry?: boolean };
4040

4141
// 401(토큰 만료)일 경우 로그아웃 처리 or 토큰 갱신 가능
4242
if (errorInfo.status === 401) {

0 commit comments

Comments
 (0)