Skip to content
This repository has been archived by the owner on May 7, 2021. It is now read-only.

Commit

Permalink
Calculator updates (major)
Browse files Browse the repository at this point in the history
  • Loading branch information
Jorge Cuadra committed Sep 21, 2018
1 parent 4ad409f commit bb64119
Show file tree
Hide file tree
Showing 3 changed files with 89 additions and 119 deletions.
109 changes: 70 additions & 39 deletions src/calculator/Calculator.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,11 @@ import * as yup from 'yup';
import { Button } from 'rmwc/Button';
import { Checkbox } from 'rmwc/Checkbox';
import { ListDivider } from 'rmwc/List';
import { Select, Grid, GridCell } from 'rmwc';
import { Grid, GridCell } from 'rmwc';
import { TextField, TextFieldHelperText } from 'rmwc/TextField';
import { Typography } from 'rmwc/Typography';

import { computeMacros } from './utils';
import { macroOptions, kinobodyProgramModeOptions } from './constants';
import { withCoreContext } from '../CoreContext';

import Preview from './Preview';
Expand All @@ -24,11 +23,12 @@ class Calculator extends React.Component {
<Formik
initialValues={{
bodyWeight: settings.bodyWeight || 180,
bodyWeightIsInLbs: settings.bodyWeightIsInLbs || 'lbs',
kinobodyProgram: settings.kinobodyProgram || 'GGP',
kinobodyProgramMode: settings.kinobodyProgramMode || 'LEAN_BULK',
kinobodyMacroOption:
settings.kinobodyMacroOption || 'PROTEIN_DEFAULT',
calories: settings.calories || 2200,
caloriesExtraForWorkoutDay:
settings.caloriesExtraForWorkoutDay || 100,
fatCaloriesRatio: settings.fatCaloriesRatio || 25,
proteinGramsPerBodyWeightLb:
settings.proteinGramsPerBodyWeight || 0.8,
workoutOnSunday: settings.workoutOnSunday || false,
workoutOnMonday: settings.workoutOnMonday || false,
workoutOnTuesday: settings.workoutOnTuesday || false,
Expand All @@ -38,19 +38,28 @@ class Calculator extends React.Component {
}}
validationSchema={yup.object().shape({
bodyWeight: yup.number().required(),
bodyWeightIsInLbs: yup.string().required(),
kinobodyProgram: yup.string().required(),
kinobodyProgramMode: yup.string().required(),
kinobodyMacroOption: yup.string().required(),
calories: yup.number().required(),
caloriesExtraForWorkoutDay: yup.number().required(),
fatCaloriesRatio: yup.number().required(),
proteinGramsPerBodyWeightLb: yup.number().required(),
})}
onSubmit={(values, { setSubmitting }) => {
setSubmitting(false);
const macrosRest = computeMacros(values);
const macrosWorkout = computeMacros(values, true);

handleCalculatorSave({
settings: {
...values,
bodyWeight: parseInt(values.bodyWeight),
calories: parseInt(values.calories),
caloriesExtraForWorkoutDay: parseInt(
values.caloriesExtraForWorkoutDay,
),
fatCaloriesRatio: parseInt(values.fatCaloriesRatio),
proteinGramsPerBodyWeightLb: parseFloat(
values.proteinGramsPerBodyWeightLb,
),
},
macrosRest,
macrosWorkout,
Expand Down Expand Up @@ -127,44 +136,61 @@ class Calculator extends React.Component {
/>
</GridCell>
<GridCell span="6">
<Typography use="overline" tag="div">
Kinobody Calories / Macros
</Typography>
<ListDivider />
<Select
className="my-4 mr-4"
label="Kinobody Program"
<div className="mb-4">
<Typography use="overline" tag="div">
Calories / Macros
</Typography>
<ListDivider />
</div>

<TextField
className="mb-4 mr-4"
label="Total Calories"
name="calories"
onBlur={handleBlur}
onChange={handleChange}
options={[
{ label: 'GGP - Greek God Program', value: 'GGP' },
]}
outlined
value={values.kinobodyProgram}
value={values.calories}
/>
<Select
{errors.calories && (
<TextFieldHelperText validationMsg persistent>
{errors.calories}
</TextFieldHelperText>
)}

<TextField
className="mb-4 mr-4"
label="Program Mode"
label="Workoutday Extra Calories"
name="caloriesExtraForWorkoutDay"
onBlur={handleBlur}
onChange={handleChange}
options={kinobodyProgramModeOptions}
outlined
name="kinobodyProgramMode"
value={values.kinobodyProgramMode}
value={values.caloriesExtraForWorkoutDay}
/>
<Select
{errors.caloriesExtraForWorkoutDay && (
<TextFieldHelperText validationMsg persistent>
{errors.caloriesExtraForWorkoutDay}
</TextFieldHelperText>
)}

<TextField
className="mb-4 mr-4"
label="Macro Options"
name="kinobodyMacroOption"
label="Fat % from calories"
name="fatCaloriesRatio"
onBlur={handleBlur}
onChange={handleChange}
options={macroOptions}
outlined
value={values.kinobodyMacroOption}
value={values.fatCaloriesRatio}
/>
{errors.fatCaloriesRatio && (
<TextFieldHelperText validationMsg persistent>
{errors.fatCaloriesRatio}
</TextFieldHelperText>
)}

<TextField
className="mb-4 mr-4"
label="Body weight"
label="Body weight (lbs)"
name="bodyWeight"
onBlur={handleBlur}
onChange={handleChange}
Expand All @@ -176,21 +202,26 @@ class Calculator extends React.Component {
{errors.bodyWeight}
</TextFieldHelperText>
)}
<Select

<TextField
className="mb-4 mr-4"
label="units"
label="Protein (g) per Body (lb)"
name="proteinGramsPerBodyWeightLb"
onBlur={handleBlur}
onChange={handleChange}
options={['lbs']}
outlined
name="bodyWeightIsInLbs"
value={values.bodyWeightIsInLbs}
value={values.proteinGramsPerBodyWeightLb}
/>
{errors.proteinGramsPerBodyWeightLb && (
<TextFieldHelperText validationMsg persistent>
{errors.proteinGramsPerBodyWeightLb}
</TextFieldHelperText>
)}
</GridCell>
</Grid>

<footer className="flex justify-end mt-4 mb-8 pr-4">
<Button className="mr-4" onClick={handleReset}>
<Button type="reset" className="mr-4" onClick={handleReset}>
reset
</Button>
<Button type="submit" raised disabled={isSubmitting}>
Expand Down
51 changes: 3 additions & 48 deletions src/calculator/constants.js
Original file line number Diff line number Diff line change
@@ -1,48 +1,3 @@
const PROTEIN_DEFAULT = 'PROTEIN_DEFAULT';
const PROTEIN_LESS = 'PROTEIN_LESS';
const PROTEIN_MORE = 'PROTEIN_MORE';
// const PROTEIN_BALANCED = 'PROTEIN_BALANCED';

export const macroValues = {
[PROTEIN_DEFAULT]: 0.9,
[PROTEIN_LESS]: 0.8,
[PROTEIN_MORE]: 1,
};

export const macroOptions = [
{
label: 'Default Protein (0.9 g/lbs)',
value: PROTEIN_DEFAULT,
},
{
label: 'Less Protein (0.8 g/lbs)',
value: PROTEIN_LESS,
},
{
label: 'More Protein (1 g/lbs)',
value: PROTEIN_MORE,
},
// {
// label: '30% protein, 30% fat, 40% carbs',
// value: PROTEIN_BALANCED,
// },
];

const LEAN_BULK = 'LEAN_BULK';
const RECOMP = 'RECOMP';

export const kinobodyProgramModeValues = {
[LEAN_BULK]: 15,
[RECOMP]: 15,
};

export const kinobodyProgramModeOptions = [
{
label: 'Lean Bulk',
value: LEAN_BULK,
},
// {
// label: 'Recomp',
// value: RECOMP,
// },
];
export const FAT_CALORIES_PER_GRAM = 9;
export const CARBS_CALORIES_PER_GRAM = 4;
export const PROTEIN_CALORIES_PER_GRAM = 4;
48 changes: 16 additions & 32 deletions src/calculator/utils.js
Original file line number Diff line number Diff line change
@@ -1,33 +1,13 @@
import { kinobodyProgramModeValues, macroValues } from './constants';

function calculateWeightCoeficient(bodyWeightIsInLbs) {
return bodyWeightIsInLbs ? 1 : 0.45;
}

export function calculateCalories(
{ bodyWeight, bodyWeightIsInLbs, kinobodyProgramMode },
forWorkout = false,
) {
const coeficient = calculateWeightCoeficient(bodyWeightIsInLbs);
const caloriesPerLbs = kinobodyProgramModeValues[kinobodyProgramMode];
const baseCalories = coeficient * parseInt(bodyWeight, 10) * caloriesPerLbs;
const surplus = forWorkout ? 500 : 100;
return Math.round(baseCalories + surplus);
import {
FAT_CALORIES_PER_GRAM,
CARBS_CALORIES_PER_GRAM,
PROTEIN_CALORIES_PER_GRAM,
} from './constants';

export function calculateProtein({ bodyWeight, proteinGramsPerBodyWeightLb }) {
return parseInt(bodyWeight, 10) * parseFloat(proteinGramsPerBodyWeightLb, 10);
}

export function calculateProtein(
{ bodyWeight, bodyWeightIsInLbs, kinobodyMacroOption },
calories,
) {
const coeficient = calculateWeightCoeficient(bodyWeightIsInLbs);
const proteinFactor = macroValues[kinobodyMacroOption] || calories * 0.3;
return parseInt(bodyWeight, 10) * coeficient * proteinFactor;
}

export const FAT_CALORIES_PER_GRAM = 9;
export const CARBS_CALORIES_PER_GRAM = 4;
export const PROTEIN_CALORIES_PER_GRAM = 4;

export function convertMacroGramToCalories({ macro, value }) {
switch (macro) {
case 'carbs':
Expand All @@ -49,14 +29,18 @@ export function calculateCarbs({ calories, fat, protein }) {
return Math.round(carbs);
}

export function calculateFat(calories) {
const fat = (calories * 0.25) / FAT_CALORIES_PER_GRAM;
export function calculateFat(calories, fatCaloriesRatio) {
const fat =
(parseInt(calories) * (parseInt(fatCaloriesRatio, 10) / 100)) /
FAT_CALORIES_PER_GRAM;
return Math.round(fat);
}

export function computeMacros(values, forWorkout) {
const calories = calculateCalories(values, forWorkout);
const fat = calculateFat(calories);
const calories = forWorkout
? +values.calories + +values.caloriesExtraForWorkoutDay
: +values.calories;
const fat = calculateFat(calories, values.fatCaloriesRatio);
const protein = calculateProtein(values, calories);
const carbs = calculateCarbs({ calories, fat, protein });
return { calories, carbs, fat, protein };
Expand Down

0 comments on commit bb64119

Please sign in to comment.