Skip to content

Commit

Permalink
Merge pull request #43 from Tasitaforme/diaryPage
Browse files Browse the repository at this point in the history
Diary page
  • Loading branch information
Tasitaforme authored Dec 25, 2023
2 parents a5e9d4e + 6f719dc commit 79ceab3
Show file tree
Hide file tree
Showing 13 changed files with 676 additions and 308 deletions.
12 changes: 6 additions & 6 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion src/components/ModalMain/ModalMain.jsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import React, { useEffect } from 'react';
import { useEffect } from 'react';
import { createPortal } from 'react-dom';
import { ModalBackdrop, ModalContainer } from './ModalMain.styled';

Expand Down
16 changes: 9 additions & 7 deletions src/helpers/getTotalNutrients.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
export const getTotalNutrients = (data) => {
export const getTotalNutrients = (data = {}) => {
const totalNutrients = {
calories: 0,
carbohydrate: 0,
Expand All @@ -7,12 +7,14 @@ export const getTotalNutrients = (data) => {
};

Object.values(data).forEach((mealTypeArray) => {
mealTypeArray.forEach(({ calories, carbohydrate, protein, fat }) => {
totalNutrients.calories += calories;
totalNutrients.carbohydrate += carbohydrate;
totalNutrients.protein += protein;
totalNutrients.fat += fat;
});
if (Array.isArray(mealTypeArray)) {
mealTypeArray.forEach(({ calories, carbohydrate, protein, fat }) => {
totalNutrients.calories += calories;
totalNutrients.carbohydrate += carbohydrate;
totalNutrients.protein += protein;
totalNutrients.fat += fat;
});
}
});

return totalNutrients;
Expand Down
18 changes: 12 additions & 6 deletions src/helpers/getTotalNutrientsForMeals.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,18 @@ export const getTotalNutrientsForMeals = (diaryData) => {
};
}

const totalNutrientsForMeals = Object.keys(diaryData).map((mealType) => {
return {
mealType,
...getTotalNutrients(diaryData[mealType]),
};
});
const totalNutrientsForMeals = Object.keys(diaryData).reduce(
(acc, mealType) => {
if (Array.isArray(diaryData[mealType])) {
acc.push({
mealType,
...getTotalNutrients(diaryData[mealType]),
});
}
return acc;
},
[]
);

return totalNutrientsForMeals;
};
Expand Down
42 changes: 42 additions & 0 deletions src/pages/DiaryPage/DiaryItem.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import {
ListItem,
List,
RecordBtnLabel,
RecordBtn,
StyledAddMealIcon,
} from './DiaryPage.styled';
import sprite from '../../assets/sprite.svg';
import { DiaryModal } from './DiaryModal';
import { useState } from 'react';
import RecordedMeal from './RecordedMeal';

export default function DiaryItem({ data, type }) {
const [modalData, setModalData] = useState(false);

return (
<>
<List>
{data.map((item, index, arr) => {
return (
<ListItem key={item?.id || index}>
<p>{index + 1}</p>
{item?.id ? (
<RecordedMeal />
) : index === 0 || arr[index - 1].id ? (
<RecordBtn onClick={() => setModalData({ type })}>
<StyledAddMealIcon>
<use href={`${sprite}#add`} />
</StyledAddMealIcon>
<RecordBtnLabel>Record your meal</RecordBtnLabel>
</RecordBtn>
) : (
<RecordedMeal />
)}
</ListItem>
);
})}
</List>
<DiaryModal modalData={modalData} setModalData={setModalData} />
</>
);
}
190 changes: 190 additions & 0 deletions src/pages/DiaryPage/DiaryModal.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,190 @@
import { Formik } from 'formik';
import ModalMain from '../../components/ModalMain/ModalMain';
import {
AddMoreBtn,
AddMoreIcon,
AddMoreLabel,
BtnWrapper,
CaloriesForm,
CancelModalBtn,
CarbonohForm,
ConfirmModalBtn,
FatForm,
FormikWrapper,
FormikWrapperMobile,
FormikWrapperTablet,
MealImg,
MealTitle,
MealTitleWrapper,
ModalTitle,
ModalWrapper,
NameForm,
ProteinForm,
TrashModalIcon,
} from './DiaryPage.styled';
import { MEALS_IMAGES } from './constants';
import sprite from '../../assets/sprite.svg';
import { FormikStyledField } from '../../components/StyledComponents/Formik.styled';
import { diarySchema } from '../../schemas/formikDiary';
import { useCallback } from 'react';
import { createFoodDiary } from '../../redux/diary/operations';
import { useDispatch } from 'react-redux';

export const DiaryModal = ({ modalData, setModalData }) => {
const dispatch = useDispatch();
const {
type,
name = '',
carbohydrate = '',
protein = '',
fat = '',
calories = '',
} = modalData;
const onSubmit = useCallback(
async (formData) => {
console.log(formData);
try {
const res = await dispatch(
createFoodDiary({ ...formData, diary: type })
);
setModalData(false);
console.log('Res', res);
} catch (err) {
console.log('ERR', err);
}
},
[dispatch, setModalData, type]
);

return (
<ModalMain modalActive={!!modalData} setModalActive={setModalData}>
<ModalWrapper>
<ModalTitle>Record your meal</ModalTitle>
<MealTitleWrapper>
<MealImg src={MEALS_IMAGES[type]} alt="breakfast" />
<MealTitle>{type}</MealTitle>
</MealTitleWrapper>
<Formik
initialValues={{
name,
carbohydrate,
protein,
fat,
calories,
}}
validationSchema={diarySchema}
onSubmit={onSubmit}
>
{({ errors, touched, isSubmitting, isValid, dirty }) => {
return (
<FormikWrapper>
<FormikWrapperTablet>
<NameForm>
<FormikStyledField
type="text"
name="name"
placeholder="The name of the product or dish"
autoComplete="off"
className={
touched.name
? errors.name
? 'input-error'
: 'input-success'
: 'input-normal'
}
/>
</NameForm>
<CarbonohForm>
<FormikStyledField
type="number"
name="carbohydrate"
placeholder="Carbonoh."
autoComplete="off"
className={
touched.carbohydrate
? errors.carbohydrate
? 'input-error'
: 'input-success'
: 'input-normal'
}
/>
</CarbonohForm>
<ProteinForm>
<FormikStyledField
type="number"
name="protein"
placeholder="Protein"
autoComplete="off"
className={
touched.protein
? errors.protein
? 'input-error'
: 'input-success'
: 'input-normal'
}
/>
</ProteinForm>
<FormikWrapperMobile>
<FatForm>
<FormikStyledField
type="number"
name="fat"
placeholder="Fat"
autoComplete="off"
className={
touched.fat
? errors.fat
? 'input-error'
: 'input-success'
: 'input-normal'
}
/>
</FatForm>
<CaloriesForm>
<FormikStyledField
type="number"
name="calories"
placeholder="Calories"
autoComplete="off"
className={
touched.calories
? errors.calories
? 'input-error'
: 'input-success'
: 'input-normal'
}
/>
</CaloriesForm>
<TrashModalIcon>
<use href={`${sprite}#trash`} />
</TrashModalIcon>
</FormikWrapperMobile>
</FormikWrapperTablet>
<AddMoreBtn>
<AddMoreIcon>
<use href={`${sprite}#add`} />
</AddMoreIcon>
<AddMoreLabel>Add more</AddMoreLabel>
</AddMoreBtn>
<BtnWrapper>
<ConfirmModalBtn
type="submit"
disabled={!isValid || isSubmitting || !dirty || !touched}
>
Confirm
</ConfirmModalBtn>
<CancelModalBtn
type="button"
onClick={() => setModalData(false)}
>
Cancel
</CancelModalBtn>
</BtnWrapper>
</FormikWrapper>
);
}}
</Formik>
</ModalWrapper>
</ModalMain>
);
};
Loading

0 comments on commit 79ceab3

Please sign in to comment.