import { effects } from "redux-saga"; import { setSelfUserToken } from "../actions/auth/reducer.actions"; import { isSendingUserRequest, setUserRequestError, setUserRequestSuccess, clearUserRequestError, clearUserRequestSuccess, setSelfUser, setCompleteRegistrationStep } from "../actions/user/reducer.actions"; import { getSelfUserRequest } from "../actions/user/saga.actions"; import { CLIENT_OR_PROVIDER_STEP } from "../constants/user.constants"; import { getSelfUser, createUserInfo, updateUserInfo, createClient, updateClient, createProvider, updateProvider } from "../api/user.api"; function* getSelfUserCall() { yield effects.put(isSendingUserRequest(true)); try { const wasSuccessful = yield effects.call(getSelfUser); yield effects.put(clearUserRequestError()); // Check if the user exists, if yes set the user, otherwise force logout if (wasSuccessful.results && wasSuccessful.results.length) { yield effects.put(setSelfUser(wasSuccessful.results[0])); } else { yield effects.put(setSelfUserToken("")); yield effects.put(setSelfUser({})); } return wasSuccessful; } catch (exception) { yield effects.put(setUserRequestError(exception)); return false; } finally { yield effects.put(isSendingUserRequest(false)); } } function* createUserInfoCall(postBody) { yield effects.put(isSendingUserRequest(true)); const { phone_number } = postBody; try { return yield effects.call(createUserInfo, phone_number); } catch (exception) { yield effects.put(setUserRequestError(exception)); return false; } finally { yield effects.put(isSendingUserRequest(false)); } } function* updateUserInfoCall(payload) { yield effects.put(isSendingUserRequest(true)); const { username, phone_number } = payload; try { return yield effects.call(updateUserInfo, username, phone_number); } catch (exception) { yield effects.put(setUserRequestError(exception)); return false; } finally { yield effects.put(isSendingUserRequest(false)); } } function* createClientCall(postBody) { yield effects.put(isSendingUserRequest(true)); const { business_number } = postBody; try { return yield effects.call(createClient, business_number); } catch (exception) { yield effects.put(setUserRequestError(exception)); return false; } finally { yield effects.put(isSendingUserRequest(false)); } } function* updateClientCall(payload) { yield effects.put(isSendingUserRequest(true)); const { username, business_number } = payload; try { return yield effects.call(updateClient, username, business_number); } catch (exception) { yield effects.put(setUserRequestError(exception)); return false; } finally { yield effects.put(isSendingUserRequest(false)); } } function* createProviderCall(postBody) { yield effects.put(isSendingUserRequest(true)); const { sin } = postBody; try { return yield effects.call(createProvider, sin); } catch (exception) { yield effects.put(setUserRequestError(exception)); return false; } finally { yield effects.put(isSendingUserRequest(false)); } } function* updateProviderCall(payload) { yield effects.put(isSendingUserRequest(true)); const { username, sin } = payload; try { return yield effects.call(updateProvider, username, sin); } catch (exception) { yield effects.put(setUserRequestError(exception)); return false; } finally { yield effects.put(isSendingUserRequest(false)); } } export function* getSelfUserFlow(request) { const wasSuccessful = yield effects.call(getSelfUserCall); if (!wasSuccessful) { yield effects.put(setSelfUserToken("")); yield effects.put(setSelfUser({})); } } export function* createUserInfoFlow(request) { yield effects.put(clearUserRequestSuccess()); yield effects.put(clearUserRequestError()); const wasSuccessful = yield effects.call(createUserInfoCall, request.data); if (wasSuccessful) { yield effects.put(clearUserRequestError()); yield effects.put(setCompleteRegistrationStep(CLIENT_OR_PROVIDER_STEP)); yield effects.put(getSelfUserRequest()); } } export function* updateUserInfoFlow(request) { yield effects.put(clearUserRequestSuccess()); yield effects.put(clearUserRequestError()); const wasSuccessful = yield effects.call(updateUserInfoCall, request.data); if (wasSuccessful) { yield effects.put(setUserRequestSuccess(wasSuccessful)); yield effects.put(clearUserRequestError()); yield effects.put(setCompleteRegistrationStep(CLIENT_OR_PROVIDER_STEP)); yield effects.put(getSelfUserRequest()); } } export function* createClientFlow(request) { yield effects.put(clearUserRequestSuccess()); yield effects.put(clearUserRequestError()); const wasSuccessful = yield effects.call(createClientCall, request.data); if (wasSuccessful) { yield effects.put(clearUserRequestError()); yield effects.put(getSelfUserRequest()); } } export function* updateClientFlow(request) { yield effects.put(clearUserRequestSuccess()); yield effects.put(clearUserRequestError()); const wasSuccessful = yield effects.call(updateClientCall, request.data); if (wasSuccessful) { yield effects.put(setUserRequestSuccess(wasSuccessful)); yield effects.put(clearUserRequestError()); yield effects.put(getSelfUserRequest()); } } export function* createProviderFlow(request) { yield effects.put(clearUserRequestSuccess()); yield effects.put(clearUserRequestError()); const wasSuccessful = yield effects.call(createProviderCall, request.data); if (wasSuccessful) { yield effects.put(clearUserRequestError()); yield effects.put(getSelfUserRequest()); } } export function* updateProviderFlow(request) { yield effects.put(clearUserRequestSuccess()); yield effects.put(clearUserRequestError()); const wasSuccessful = yield effects.call(updateProviderCall, request.data); if (wasSuccessful) { yield effects.put(setUserRequestSuccess(wasSuccessful)); yield effects.put(clearUserRequestError()); yield effects.put(getSelfUserRequest()); } }