Added log rocket + analytics to ensure functionality

This commit is contained in:
Patrick Fic
2020-10-22 12:38:33 -07:00
parent 295b51267b
commit ad7cbb308b
26 changed files with 434 additions and 134 deletions

View File

@@ -1,4 +1,4 @@
import { all, call, takeLatest, select, put } from "redux-saga/effects";
import { all, call, put, select, takeLatest } from "redux-saga/effects";
import GetJobTarget from "../../util/GetJobTarget";
import { setSelectedJobTargetPcSuccess } from "./application.actions";
import ApplicationActionTypes from "./application.types";

View File

@@ -1,20 +1,21 @@
import { all, call, takeLatest, select, put } from "redux-saga/effects";
import Dinero from "dinero.js";
import { all, call, put, select, takeLatest } from "redux-saga/effects";
import client from "../../graphql/GraphQLClient";
import { REPORTING_GET_JOBS } from "../../graphql/reporting.queries";
import ipcTypes from "../../ipc.types";
import {
CalculateJobRpsDollars,
CalculateJobRpsPc
} from "../../util/CalculateJobRps";
import GetJobTarget from "../../util/GetJobTarget";
import {
calculateScorecard,
setReportingData,
setScoreCard,
setScoreCard
} from "./reporting.actions";
import ReportingApplicationTypes from "./reporting.types";
import client from "../../graphql/GraphQLClient";
import { REPORTING_GET_JOBS } from "../../graphql/reporting.queries";
import Dinero from "dinero.js";
import {
CalculateJobRpsDollars,
CalculateJobRpsPc,
} from "../../util/CalculateJobRps";
import GetJobTarget from "../../util/GetJobTarget";
const { log } = window;
const { log, ipcRenderer } = window;
export function* onQueryReportData() {
yield takeLatest(
@@ -52,71 +53,81 @@ export function* onCalculateScoreCard() {
);
}
export function* handleCalculateScoreCard({ payload: jobs }) {
console.log("jobs", jobs);
const targets = yield select((state) => state.user.bodyshop.targets);
try {
ipcRenderer.send(ipcTypes.default.app.toMain.track, {
event: "CALCULATE_SCORECARD",
});
const scoreCard = {
shopRpsTotalDollars: Dinero(),
shopRpsExpectedDollars: Dinero(),
varianceDollars: null,
variancePc: 0,
allJobsSumDbPrice: Dinero(),
allJobsSumActPrice: Dinero(),
currentRpsPc: 0,
targetRpsPc: 0,
};
const targets = yield select((state) => state.user.bodyshop.targets);
//Get the RPS on a per job basis.
jobs = jobs.map((job) => {
const { actPriceSum, jobRpsDollars } = CalculateJobRpsDollars(job, true);
const { dbPriceSum, jobRpsPc } = CalculateJobRpsPc(
job,
jobRpsDollars,
true
);
const jobTarget = GetJobTarget(job.group, job.v_age, targets);
scoreCard.shopRpsTotalDollars = scoreCard.shopRpsTotalDollars.add(
jobRpsDollars
);
const expectedRpsDollars = dbPriceSum.percentage(jobTarget * 100);
scoreCard.shopRpsExpectedDollars = scoreCard.shopRpsExpectedDollars.add(
expectedRpsDollars
);
scoreCard.allJobsSumDbPrice = scoreCard.allJobsSumDbPrice.add(dbPriceSum);
scoreCard.allJobsSumActPrice = scoreCard.allJobsSumActPrice.add(
actPriceSum
);
//sum db price * percentage expected.
return {
...job,
actPriceSum,
jobRpsDollars,
dbPriceSum,
jobRpsPc,
jobTarget,
expectedRpsDollars,
const scoreCard = {
shopRpsTotalDollars: Dinero(),
shopRpsExpectedDollars: Dinero(),
varianceDollars: null,
variancePc: 0,
allJobsSumDbPrice: Dinero(),
allJobsSumActPrice: Dinero(),
currentRpsPc: 0,
targetRpsPc: 0,
};
});
scoreCard.varianceDollars = scoreCard.shopRpsTotalDollars.subtract(
scoreCard.shopRpsExpectedDollars
);
//Get the RPS on a per job basis.
jobs = jobs.map((job) => {
const { actPriceSum, jobRpsDollars } = CalculateJobRpsDollars(job, true);
const { dbPriceSum, jobRpsPc } = CalculateJobRpsPc(
job,
jobRpsDollars,
true
);
const jobTarget = GetJobTarget(job.group, job.v_age, targets);
scoreCard.shopRpsTotalDollars = scoreCard.shopRpsTotalDollars.add(
jobRpsDollars
);
const expectedRpsDollars = dbPriceSum.percentage(jobTarget * 100);
scoreCard.shopRpsExpectedDollars = scoreCard.shopRpsExpectedDollars.add(
expectedRpsDollars
);
scoreCard.variancePc =
scoreCard.varianceDollars.getAmount() /
scoreCard.shopRpsExpectedDollars.getAmount();
scoreCard.allJobsSumDbPrice = scoreCard.allJobsSumDbPrice.add(dbPriceSum);
scoreCard.allJobsSumActPrice = scoreCard.allJobsSumActPrice.add(
actPriceSum
);
scoreCard.currentRpsPc =
scoreCard.shopRpsTotalDollars.getAmount() /
scoreCard.allJobsSumDbPrice.getAmount();
scoreCard.targetRpsPc =
scoreCard.shopRpsExpectedDollars.getAmount() /
scoreCard.allJobsSumDbPrice.getAmount();
//Set the data.
yield put(setScoreCard(scoreCard));
yield put(setReportingData(jobs));
//sum db price * percentage expected.
return {
...job,
actPriceSum,
jobRpsDollars,
dbPriceSum,
jobRpsPc,
jobTarget,
expectedRpsDollars,
};
});
scoreCard.varianceDollars = scoreCard.shopRpsTotalDollars.subtract(
scoreCard.shopRpsExpectedDollars
);
scoreCard.variancePc =
scoreCard.varianceDollars.getAmount() /
scoreCard.shopRpsExpectedDollars.getAmount();
scoreCard.currentRpsPc =
scoreCard.shopRpsTotalDollars.getAmount() /
scoreCard.allJobsSumDbPrice.getAmount();
scoreCard.targetRpsPc =
scoreCard.shopRpsExpectedDollars.getAmount() /
scoreCard.allJobsSumDbPrice.getAmount();
//Set the data.
yield put(setScoreCard(scoreCard));
yield put(setReportingData(jobs));
} catch (error) {
ipcRenderer.send(ipcTypes.default.app.toMain.track, {
event: "CALCULATE_SCORE_CARD_ERROR",
error: error,
});
}
}
export function* reportingSagas() {

View File

@@ -47,7 +47,7 @@ const userReducer = (state = INITIAL_STATE, action) => {
return {
...state,
currentUser: action.payload,
loingLoading: false,
loginLoading: false,
error: null,
};
case UserActionTypes.SIGN_OUT_SUCCESS:

View File

@@ -1,3 +1,5 @@
import { message } from "antd";
import LogRocket from "logrocket";
import { all, call, put, takeLatest } from "redux-saga/effects";
import {
auth,
@@ -18,8 +20,6 @@ import {
signOutSuccess,
unauthorizedUser,
updateUserDetailsSuccess,
validatePasswordResetFailure,
validatePasswordResetSuccess,
} from "./user.actions";
import UserActionTypes from "./user.types";
@@ -30,6 +30,10 @@ export function* onEmailSignInStart() {
}
export function* signInWithEmail({ payload: { email, password } }) {
try {
ipcRenderer.send(ipcTypes.default.app.toMain.track, {
event: "SIGN_IN_ATTEMPT",
email: email,
});
const { user } = yield auth.signInWithEmailAndPassword(email, password);
const result = yield client.mutate({
@@ -50,13 +54,16 @@ export function* signInWithEmail({ payload: { email, password } }) {
yield put(signInFailure(JSON.stringify(result.errors)));
}
} catch (error) {
yield put(signInFailure(error));
yield put(
signInFailure({ ...error, messagePretty: ErrorFormatter(error.code) })
);
}
}
export function* onCheckUserSession() {
yield takeLatest(UserActionTypes.CHECK_USER_SESSION, isUserAuthenticated);
}
export function* isUserAuthenticated() {
try {
const user = yield getCurrentUser();
@@ -78,9 +85,11 @@ export function* isUserAuthenticated() {
yield put(signInFailure(error));
}
}
export function* onSignOutStart() {
yield takeLatest(UserActionTypes.SIGN_OUT_START, signOutStart);
}
export function* signOutStart() {
try {
ipcRenderer.send(ipcTypes.default.fileWatcher.toMain.stop);
@@ -112,7 +121,15 @@ export function* onSignInSuccess() {
export function* signInSuccessSaga({ payload }) {
//Query for the Correct Bodyshop
ipcRenderer.send(ipcTypes.default.app.toMain.setUserName, payload.email);
LogRocket.identify(payload.email, {
email: payload.email,
});
ipcRenderer.send(ipcTypes.default.app.toMain.track, {
event: "SIGN_IN_SUCCESS",
email: payload.email,
});
const shop = yield client.query({ query: QUERY_BODYSHOP });
if (shop.data.bodyshops.length > 0) {
yield put(setBodyshop(shop.data.bodyshops[0]));
@@ -138,32 +155,14 @@ export function* onSendPasswordResetStart() {
}
export function* sendPasswordResetEmail({ payload }) {
try {
yield auth.sendPasswordResetEmail(payload, {
url: "https://imex.online/passwordreset",
});
yield auth.sendPasswordResetEmail(payload);
yield put(sendPasswordResetSuccess());
message.success("Password reset sent succesfully.");
} 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) {
console.log("function*validatePasswordResetStart -> error", error);
yield put(validatePasswordResetFailure(error.message));
}
}
export function* userSagas() {
yield all([
call(onEmailSignInStart),
@@ -172,6 +171,18 @@ export function* userSagas() {
call(onUpdateUserDetails),
call(onSignInSuccess),
call(onSendPasswordResetStart),
call(onValidatePasswordResetStart),
]);
}
const ErrorFormatter = (code) => {
switch (code) {
case "auth/invalid-email":
return "Please enter a valid email.";
case "auth/user-not-found":
return "A user does not exist with that email.";
case "auth/wrong-password":
return "The email or password is incorrect.";
default:
return code;
}
};