#reactjs #redux-thunk
#reactjs #redux-thunk
Вопрос:
Я новичок в этом и прочитал много руководств и документов о компонентах Redux Thunk и более высокого порядка. Я пытаюсь соединить это вместе, но я не могу понять, что здесь не так.
Это изображение показывает, что происходит: моя внутренняя функция Thunk save()
по какой-то причине не вызывается.
Это работает, если я меняю return withFirebase(save);
на return save;
, но мне нужен контекст Firebase, так как я могу это решить и почему react-thunk заботится о withFirebase
?
Это действие:
import { userActionTypes } from './user.types';
import { withFirebase } from '../../firebase';
import * as ROLES from '../../constants/roles';
const saveUserStart = () => ({
type: userActionTypes.SAVE_USER_START,
});
const saveUserSuccess = user => ({
type: userActionTypes.SAVE_USER_SUCCESS,
payload: user,
});
const saveUserFailure = errMsg => ({
type: userActionTypes.SAVE_USER_FAILURE,
payload: errMsg,
});
function saveUser() {
return dispatch => {
function save({ firebase }) {
const userRef = firebase.userDoc(firebase.auth.currentUser.uid);
dispatch(saveUserStart());
firebase.db
.runTransaction(transaction => {
// This code may get re-run multiple times if there are conflicts.
return transaction.get(userRef).then(doc => {
if (!doc.exists) {
return Promise.reject('Transaction failed: User dont exist!');
}
const newRoles = doc.data().roles;
// new roll
newRoles.push(ROLES.USER);
// remove roll
newRoles.splice(newRoles.indexOf('ANONYMOUS'), 1);
// save it back
transaction.update(userRef, { roles: newRoles });
return newRoles;
});
})
.then(newRoles => {
dispatch(saveUserSuccess(firebase.auth.currentUser));
console.log(`Transaction successfully committed role(s): ${newRoles}`);
})
.catch(error => {
dispatch(saveUserFailure(error));
console.log(`Transaction failed committed role(s): ${error}`);
});
}
return withFirebase(save);
};
}
export default saveUser;