reactjs - 如何使用弹出对话框和 redux saga 等待成功登录 firebase
问题描述
我有一个弹出对话框,用户可以在其中登录。它可以工作,但是我希望对话框等到登录成功后再关闭。我也在使用 Redux,我尝试在 emailSignInStart(email, password) 之前添加 await 但这不起作用。这是我的登录表格:
const SigninForm = ({ emailSignInStart, handleClose }) => {
const { switchToSignup } = useContext(AccountContext);
const [userCredentials, setCredentials] = useState({
email: '',
password: '',
});
const { email, password } = userCredentials;
const signIn = async event => {
event.preventDefault();
try {
emailSignInStart(email, password);
handleClose(); <---------------------- Don't call this until sign in successful
} catch(error){
}
};
const handleChange = event => {
const { value, name } = event.target;
setCredentials({ ...userCredentials, [name]: value });
};
return <BoxContainer>
<Marginer direction={'vertical'} margin={15} />
<FormContainer>
<Input name={'email'} type={'email'} onChange={handleChange} placeholder={'Email'} />
<Input name={'password'} type={'password'} onChange={handleChange} placeholder={'Password'} />
<Marginer direction={'vertical'} margin={10} />
<MutedLink href={'#'}>Forgot Password?</MutedLink>
<Marginer direction={'vertical'} margin={'1.6em'} />
<Submit type={'submit'} onClick={signIn}>Sign In</Submit>
<Marginer direction={'vertical'} margin={'1em'} />
<MutedLink href={'#'}>
Don't have an account?
<BoldLink href={'#'} onClick={switchToSignup}>Sign Up</BoldLink>
</MutedLink>
</FormContainer>
</BoxContainer>;
};
const mapDispatchToProps = dispatch => ({
emailSignInStart: (email, password) =>
dispatch(emailSignInStart({ email, password })),
});
export default connect(null, mapDispatchToProps)(SigninForm);
在我的用户传奇中,我有:
export function* getSnapshotFromUserAuth(userAuth, additionalData) {
try {
const userRef = yield call(
createUserProfileDocument,
userAuth,
additionalData
);
const userSnapshot = yield userRef.get();
yield put(
signInSuccess({ id: userSnapshot.id, ...userSnapshot.data() })
);
} catch (error) {
yield put(signInFailure(error.message));
}
}
export function* signInWithEmail({ payload: { email, password } }) {
try {
const { user } = yield auth.signInWithEmailAndPassword(email, password);
yield getSnapshotFromUserAuth(user);
return user;
} catch (error) {
yield put(signInFailure(error.message));
}
}
export function* onEmailSignInStart() {
yield takeLatest(UserActionTypes.EMAIL_SIGN_IN_START, signInWithEmail);
}
在我的用户操作中,我有:
export const emailSignInStart = emailAndPassword => ({
type: UserActionTypes.EMAIL_SIGN_IN_START,
payload: emailAndPassword,
});
export const signInSuccess = user => ({
type: UserActionTypes.SIGN_IN_SUCCESS,
payload: user,
});
export const signInFailure = error => ({
type: UserActionTypes.SIGN_IN_FAILURE,
payload: error,
});
解决方案
我不知道为什么,但我得到了这个工作。我所做的只是在 之后删除 handleClose 调用emailSignInStart(email, password);
,一切正常。它不再在哪里调用关闭对话框,但登录成功后它仍然关闭。
推荐阅读
- r - 如何删除不包括否定的标点符号?
- asp.net-core - 我想通过 Ajax call butt 调用控制器我如何使用 JQUERY-UNOBTRUSIVE 而不使用表单标签
- reactjs - [错误]: {"code":"7","message":"No ssrResources.json file"} 部署 SSR Next Js 应用程序时 ~ AMPLIFY
- javascript - 为什么一次播放所有声音而不是一次播放一个?
- blazor - 设置字符串 Blazor WebAssembly 的最大长度限制
- ios - 摆脱辅助功能检查器中的“不支持动态文本字体大小”警告
- text - 应用于 SAPUI5 表的 OData 值(颜色)
- apache-superset - 根据apache超集中的连接类型配置多个队列
- git - git 合并冲突:哪个提交是共同祖先?
- javascript - HTML 表单中的单选按钮无法正常工作