import * as Analytics from "expo-firebase-analytics"; import { all, call, put, takeLatest } from "redux-saga/effects"; import { auth, getCurrentUser, logImEXEvent, updateCurrentUser, } from "../../firebase/firebase.utils"; import { QUERY_BODYSHOP } from "../../graphql/bodyshop.queries"; import { client } from "../../graphql/client"; import { sendPasswordResetFailure, sendPasswordResetSuccess, setBodyshop, signInFailure, signInSuccess, signOutFailure, signOutSuccess, unauthorizedUser, updateUserDetailsSuccess, validatePasswordResetFailure, validatePasswordResetSuccess, } from "./user.actions"; import UserActionTypes from "./user.types"; export function* onEmailSignInStart() { yield takeLatest(UserActionTypes.EMAIL_SIGN_IN_START, signInWithEmail); } export function* signInWithEmail({ payload: { email, password } }) { try { logImEXEvent("imexmobile_sign_in_attempt", { user: email }); const { user } = yield auth.signInWithEmailAndPassword(email, password); yield put( signInSuccess({ uid: user.uid, email: user.email, displayName: user.displayName, photoURL: user.photoURL, authorized: true, }) ); } catch (error) { yield put(signInFailure(error)); //logImEXEvent("redux_sign_in_failure", { user: email, error }); } } export function* onCheckUserSession() { yield takeLatest(UserActionTypes.CHECK_USER_SESSION, isUserAuthenticated); } export function* isUserAuthenticated() { try { //logImEXEvent("redux_auth_check"); const user = yield getCurrentUser(); if (!user) { yield put(unauthorizedUser()); return; } yield put( signInSuccess({ uid: user.uid, email: user.email, displayName: user.displayName, photoURL: user.photoURL, authorized: true, }) ); } catch (error) { yield put(signInFailure(error)); } } export function* onSignOutStart() { yield takeLatest(UserActionTypes.SIGN_OUT_START, signOutStart); } export function* signOutStart() { try { logImEXEvent("imexmobile_sign_out"); yield auth.signOut(); yield put(signOutSuccess()); } catch (error) { yield put(signOutFailure(error.message)); } } export function* onUpdateUserDetails() { yield takeLatest(UserActionTypes.UPDATE_USER_DETAILS, updateUserDetails); } export function* updateUserDetails(userDetails) { try { yield updateCurrentUser(userDetails.payload); yield put(updateUserDetailsSuccess(userDetails.payload)); } catch (error) { //yield put(signOutFailure(error.message)); //TODO error handling } } export function* onSignInSuccess() { yield takeLatest(UserActionTypes.SIGN_IN_SUCCESS, signInSuccessSaga); } export function* signInSuccessSaga({ payload }) { try { Analytics.setUserId(payload.email); const shop = yield client.query({ query: QUERY_BODYSHOP }); logImEXEvent("imexmobile_sign_in_success", payload); yield put(setBodyshop(shop.data.bodyshops[0])); } catch (error) { console.log("UH-OH. Couldn't get shop details.", error); } } export function* onSendPasswordResetStart() { yield takeLatest( UserActionTypes.SEND_PASSWORD_RESET_EMAIL_START, sendPasswordResetEmail ); } export function* sendPasswordResetEmail({ payload }) { try { yield auth.sendPasswordResetEmail(payload, { url: "https://imex.online/passwordreset", }); yield put(sendPasswordResetSuccess()); } catch (error) { yield put(sendPasswordResetFailure(error.message)); } } export function* onValidatePasswordResetStart() { yield takeLatest( UserActionTypes.VALIDATE_PASSWORD_RESET_START, validatePasswordResetStart ); } export function* validatePasswordResetStart({ payload: { password, code } }) { try { yield auth.confirmPasswordReset(code, password); yield put(validatePasswordResetSuccess()); } catch (error) { yield put(validatePasswordResetFailure(error.message)); } } export function* userSagas() { yield all([ call(onEmailSignInStart), call(onCheckUserSession), call(onSignOutStart), call(onUpdateUserDetails), call(onSignInSuccess), call(onSendPasswordResetStart), call(onValidatePasswordResetStart), ]); }