작성
·
1.4K
·
수정됨
0
errorResponse 에서 타입 에러가 납니다.
이것 저것 다 넣어봤는데 타입스크립트는 처음이라 뭘 고쳐야할 지 잘 모르겠어요ㅜㅜ
SignIn.tsx
import React, {useCallback, useRef, useState} from 'react';
import {
ActivityIndicator,
Alert,
Pressable,
StyleSheet,
Text,
TextInput,
View,
} from 'react-native';
import {NativeStackScreenProps} from '@react-navigation/native-stack';
import {RootStackParamList} from '../../AppInner';
import DismissKeyboardView from '../components/DismissKeyboardView';
import { useAppDispatch } from '../store';
import axios, { AxiosError } from 'axios';
import Config from 'react-native-config';
import userSlice from '../slices/user';
import EncryptedStorage from 'react-native-encrypted-storage';
type SignInScreenProps = NativeStackScreenProps<RootStackParamList, 'SignIn'>;
function SignIn({navigation}: SignInScreenProps) {
const dispatch = useAppDispatch();
const [loading, setLoading] = useState(false);
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
const emailRef = useRef<TextInput | null>(null);
const passwordRef = useRef<TextInput | null>(null);
const onChangeEmail = useCallback((text: string) => {
setEmail(text.trim());
}, []);
const onChangePassword = useCallback((text: string) => {
setPassword(text.trim());
}, []);
const onSubmit = useCallback(async() => {
if (!email || !email.trim()) {
return Alert.alert('알림', '이메일을 입력해주세요.');
}
if (!password || !password.trim()) {
return Alert.alert('알림', '비밀번호를 입력해주세요.');
}
try {
setLoading(true);
const response = await axios.post(`${Config.API_URL}/login`, {
email,
password,
});
console.log(response.data);
Alert.alert('알림', '로그인 되었습니다.');
dispatch(
userSlice.actions.setUser({
name: response.data.data.name,
email: response.data.data.email,
accessToken: response.data.data.accessToken,
refreshToken: response.data.data.refreshToken,
}),
);
await EncryptedStorage.setItem(
'refreshToken',
response.data.data.refreshToken,
);
} catch (error) {
const errorResponse = (error as AxiosError).response;
if (errorResponse) {
Alert.alert('알림', errorResponse.data.message);
}
} finally {
setLoading(false);
}
}, [loading, dispatch, email, password]);
const toSignUp = useCallback(() => {
navigation.navigate('SignUp');
}, [navigation]);
const canGoNext = email && password;
return (
<DismissKeyboardView>
<View style={styles.inputWrapper}>
<Text style={styles.label}>이메일</Text>
<TextInput
style={styles.textInput}
placeholder="이메일을 입력해주세요."
placeholderTextColor="#666"
value={email}
onChangeText={onChangeEmail}
importantForAccessibility="yes"
autoComplete="email"
textContentType="emailAddress" // IOS
keyboardType="email-address"
returnKeyType="next"
clearButtonMode="while-editing"
onSubmitEditing={() => {
passwordRef.current?.focus();
}}
blurOnSubmit={false}
ref={emailRef}
/>
</View>
<View style={styles.inputWrapper}>
<Text style={styles.label}>비밀번호</Text>
<TextInput
style={styles.textInput}
placeholder="비밀번호를 입력해주세요(영문,숫자,특수문자)"
placeholderTextColor="#666"
importantForAutofill="yes"
value={password}
onChangeText={onChangePassword}
importantForAccessibility="yes"
autoComplete="password"
textContentType="password" // IOS
// keyboardType="decimal-pad"
secureTextEntry
returnKeyType="send"
clearButtonMode="while-editing" // IOS
onSubmitEditing={onSubmit}
ref={passwordRef}
/>
</View>
<View style={styles.buttonZone}>
<Pressable
onPress={onSubmit}
style={
!canGoNext
? styles.loginButton
: StyleSheet.compose(styles.loginButton, styles.loginButtonActive)
}
disabled={!canGoNext || loading}>
{loading ? (
<ActivityIndicator color="white" />
) : (
<Text style={styles.loginButtonText}>로그인</Text>
)}
</Pressable>
<Pressable onPress={toSignUp}>
<Text>회원가입하기</Text>
</Pressable>
</View>
</DismissKeyboardView>
);
}
const styles = StyleSheet.create({
textInput: {
padding: 5,
borderBottomWidth: StyleSheet.hairlineWidth,
},
inputWrapper: {
padding: 20,
},
label: {
fontWeight: 'bold',
fontSize: 16,
marginBottom: 20,
},
buttonZone: {
alignItems: 'center',
},
loginButton: {
backgroundColor: 'gray',
paddingHorizontal: 20,
paddingVertical: 10,
borderRadius: 5,
marginBottom: 10,
},
loginButtonActive: {
backgroundColor: 'blue',
},
loginButtonText: {
color: 'white',
fontSize: 16,
},
});
export default SignIn;
const errorResponse: AxiosResponse<unknown, any>
'errorResponse.data'은(는) 'unknown' 형식입니다.ts(18046)