12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- import {createStore, applyMiddleware, combineReducers} from 'redux';
- import thunk from 'redux-thunk';
- //----------------------------PromiseReducer---------------------------
- export function promiseReducer(state={}, {type,name,status,payload,error}){
- if(type === 'PROMISE'){
- return{
- ...state,
- [name]:{status,payload,error}
- }
- }
- return state
- }
- const actionPending = (name) => ({type: 'PROMISE', status: 'PENDING', name})
- const actionFulfilled = (name, payload) => ({type: 'PROMISE', status: 'FULFILLED', name, payload})
- const actionRejected = (name, error) => ({type: 'PROMISE', status: 'REJECTED', name, error})
- export const actionPromise = (name, promise) =>
- async dispatch => {
- dispatch(actionPending(name)) //сигнализируем redux, что промис начался
- try{
- const payload = await promise //ожидаем промиса
- dispatch(actionFulfilled(name, payload)) //сигнализируем redux, что промис успешно выполнен
- return payload //в месте запуска store.dispatch с этим thunk можно так же получить результат промиса
- }
- catch (error){
- dispatch(actionRejected(name, error)) //в случае ошибки - сигнализируем redux, что промис несложился
- }
- }
- //--------------------------------jwtDecode---------------------------------
- function jwtDecode(token){
- try{
- let payload = JSON.parse(atob(token.split('.')[1]));
- return payload;
- } catch(e){
- }
- }
- //--------------------------------authReducer-------------------------------------
- export function authReducer(state,{type, token}){
- if(state === undefined){
- if(localStorage.authToken){
- type = 'AUTH_LOGIN';
- token = localStorage.authToken
- }
- }
- if(type === 'AUTH_LOGIN'){
- let payload = jwtDecode(token);
- if(payload){
- localStorage.authToken = token;
- return {token,payload}
- }
- }
- if(type === 'AUTH_LOGOUT'){
- localStorage.authToken = '';
- return {};
- }
- return state || {};
- }
- const actionAuthLogin = token => ({type: 'AUTH_LOGIN', token})
- const actionAuthLogout = () => ({type: 'AUTH_LOGOUT'})
- const store = createStore(promiseReducer, applyMiddleware(thunk))
- store.subscribe(() => console.log(store.getState()))
- export default store;
|