6-2. 리덕스 액션 준비하기

액션을 통해 API 호출을 할 수 있도록 액션들을 미리 준비하겠습니다.

이메일 / 아이디 중복 확인

우선, 회원가입의 이메일 / 아이디 중복확인 관련 부분을 구현해보겠습니다.

src/redux/modules/auth.js

import { createAction, handleActions } from 'redux-actions';
import { pender } from 'redux-pender';
import * as AuthAPI from 'lib/api/auth';

(...)

const CHECK_EMAIL_EXISTS = 'auth/CHECK_EMAIL_EXISTS'; // 이메일 중복 확인
const CHECK_USERNAME_EXISTS = 'auth/CHECK_USERNAME_EXISTS'; // 아이디 중복 확인

(...)

export const checkEmailExists = createAction(CHECK_EMAIL_EXISTS, AuthAPI.checkEmailExists); // email
export const checkUsernameExists = createAction(CHECK_USERNAME_EXISTS, AuthAPI.checkUsernameExists); // username

const initialState = Map({
    register: Map({
        form: Map({
            email: '',
            username: '',
            password: '',
            passwordConfirm: ''
        }),
        exists: Map({
            email: false,
            password: false
        })
    }),
    login: Map({
        form: Map({
            email: '',
            password: ''
        })
    })
});

// reducer
export default handleActions({
    (...)
    ...pender({
        type: CHECK_EMAIL_EXISTS,
        onSuccess: (state, action) => state.setIn(['register', 'exists', 'email'], action.payload.data.exists)
    }),
    ...pender({
        type: CHECK_USERNAME_EXISTS,
        onSuccess: (state, action) => state.setIn(['register', 'exists', 'username'], action.payload.data.exists)
    })
}, initialState);

checkEmailExists 와 checkUsernameExists 의 응답 데이터는 { exists: true } 형식입니다. 여기서 알려주는 값을, register.exists 안에서 설정하도록 코드를 작성하였습니다.

추후, 우리는 이 API 를 회원가입 할 때 아이디와 이메일 인풋이 변경 될 때마다 호출을 하도록 하겠습니다.

회원가입 / 로그인 / 로그아웃

이번엔 회원가입, 로그인, 로그아웃 API를 위한 액션을 만들겠습니다. 로그인과 회원가입의 경우엔, 성공을 했을 때 받는 응답 데이터를 result 안에 넣도록 하겠습니다. 그리고 로그아웃 API 의 경우엔, API 호출을 하고 별도 추가 작업 없이 페이지를 새로고침을 하므로 따로 액션 핸들러를 만들어줄 필요가 없습니다.

src/redux/modules/auth.js

import { createAction, handleActions } from 'redux-actions';
import { pender } from 'redux-pender';
import * as AuthAPI from 'lib/api/auth';

(...)

const LOCAL_REGISTER = 'auth/LOCAL_REGISTER'; // 이메일 가입
const LOCAL_LOGIN = 'auth/LOCAL_LOGIN'; // 이메일 로그인

const LOGOUT = 'auth/LOGOUT'; // 로그아웃

(...)

export const localRegister = createAction(LOCAL_REGISTER, AuthAPI.localRegister); // { email, username, password }
export const localLogin = createAction(LOCAL_LOGIN, AuthAPI.localLogin); // { email, password }

export const logout = createAction(LOGOUT, AuthAPI.logout);


const initialState = Map({
    register: Map({
        form: Map({
            email: '',
            username: '',
            password: '',
            passwordConfirm: ''
        }),
        exists: Map({
            email: false,
            password: false
        })
    }),
    login: Map({
        form: Map({
            email: '',
            password: ''
        })
    }),
    result: Map({})
});

// reducer
export default handleActions({
    (...)
    ...pender({
        type: LOCAL_LOGIN,
        onSuccess: (state, action) => state.set('result', Map(action.payload.data))
    }),
    ...pender({
        type: LOCAL_REGISTER,
        onSuccess: (state, action) => state.set('result', Map(action.payload.data))
    }),
}, initialState);

리덕스 관련 코드는 어느정도 완성이 되었습니다. 다음 섹션에서는 위 액션들을 디스패치 하기전에, 문자열들을 검증하는 작업을 진행하겠습니다.

results matching ""

    No results matching ""