★前回の記事
認証機能を実装します。react-redux-firebaseのAPIを利用します。
ユーザ情報の保存先の設定
始めにindex.js
のcreateStoreWithFirebase
を変更します。
src/index.js
const createStoreWithFirebase = compose( applyMiddleware(thunk.withExtraArgument({getFirebase})), reactReduxFirebase(firebase, {userProfile: 'users'}) // 変更 )(createStore);
reactReduxFirebaseの引数に{userProfile: 'users’}
を追加します。このようにすると、Firebase Realtime Databaseの/user
パスにユーザのデータが保存されます。(/user
のデータはSTEP 3で使用します。)
ログイン・ログアウトactionの作成
ログインとログアウトのactionを作成します。公式のAuthのページ を参考に進めていきます。
src/actions/index.js
下記を追加します。
// auth actions export const LOGIN_SUCCESS = 'LOGIN_SUCCESS' export const LOGIN_ERROR = 'LOGIN_ERROR' export const LOGOUT_SUCCESS = 'LOGOUT_SUCCESS' export const LOGOUT_ERROR = 'LOGOUT_ERROR'
認証actionを実装します。
src/actions/authActions.js
(新規ファイル)
import { LOGIN_SUCCESS, LOGIN_ERROR, LOGOUT_SUCCESS, LOGOUT_ERROR } from './' const loginSuccess = () => ({ type: LOGIN_SUCCESS }) const loginError = (err) => ({ type: LOGIN_ERROR, err }) const logoutSuccess = () => ({ type: LOGOUT_SUCCESS }) const logoutError = (err) => ({ type: LOGOUT_ERROR, err }) export const loginWithGoogle = () => { return (dispatch, getState, {getFirebase}) => { const firebase = getFirebase(); firebase.login({provider: 'google'}) // #1 .then(() => { dispatch(loginSuccess()); }).catch(err => { dispatch(loginError(err)); }); } } export const logout = () => { return (dispatch, getState, {getFirebase}) => { const firebase = getFirebase(); firebase.logout() // #2 .then(() => { dispatch(logoutSuccess()); }).catch(err => { dispatch(logoutError(err)); }); } }
- ログインを行います(#1)。providerにgoogleを指定します。
- ログアウトを行います(#2)。
actionの中心となるのは、上記の2行のコードだけです。非常に短いコードでログイン、ログアウトが実装できました。
reducerの実装
reducerの実装をします。ログアウト時に設定をクリアします。
src/reducers/todos.js
import { LOGOUT_SUCCESS, ADD_TODO_REQUEST, ADD_TODO_SUCCESS, ADD_TODO_ERROR, TOGGLE_TODO_REQUEST, TOGGLE_TODO_SUCCESS, TOGGLE_TODO_ERROR } from '../actions/' const todos = (state = {}, action) => { switch (action.type) { // 中略 case LOGOUT_SUCCESS : // 追加 return {} default: return state } }
src/reducers/visibilityFilter.js
import { LOGOUT_SUCCESS, SET_VISIBILITY_FILTER } from '../actions/' // 変更 // 中略 const visibilityFilter = (state = VisibilityFilters.SHOW_ALL, action) => { switch (action.type) { // 中略 case LOGOUT_SUCCESS: // 追加 return VisibilityFilters.SHOW_ALL default: return state } }
以上でログインのactionとreducerの実装が完了しました。
★次回の記事
★目次