From 51f74f21f44f36aed9e21f935b18f12773bf8452 Mon Sep 17 00:00:00 2001
From: Aleksey Obukhov
Date: Thu, 19 Jan 2023 20:39:38 +0300
Subject: [PATCH 1/4] =?UTF-8?q?=D1=80=D0=B5=D0=B0=D0=BA=D1=82-=D0=BA=D0=BE?=
=?UTF-8?q?=D0=BD=D1=82=D0=B5=D0=BA=D1=81=D1=82=20=D0=B8=20=D1=81=D0=BE?=
=?UTF-8?q?=D1=85=D1=80=D0=B0=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B7=D0=B0?=
=?UTF-8?q?=D0=BA=D0=B0=D0=B7=D0=B0=20=D0=BD=D0=B0=20=D1=81=D0=B5=D1=80?=
=?UTF-8?q?=D0=B2=D0=B5=D1=80=D0=B5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/components/app/app.jsx | 50 +++++++++++--------
.../burger-constructor-order.jsx | 25 ++++++----
.../burger-constructor/burger-constructor.jsx | 33 ++++++++----
.../burger-constructor.module.css | 4 +-
.../burger-ingredients-item.jsx | 32 +++++++++---
.../burger-ingredients/burger-ingredients.jsx | 2 +-
.../order-details/order-details.jsx | 2 +-
src/services/order-context.js | 3 ++
src/services/sum-reducer.js | 12 +++++
src/utils/api-constants.js | 4 ++
src/utils/dataLoad.js | 11 ++--
src/utils/orderCreate.js | 30 +++++++++++
12 files changed, 150 insertions(+), 58 deletions(-)
create mode 100644 src/services/order-context.js
create mode 100644 src/services/sum-reducer.js
create mode 100644 src/utils/api-constants.js
create mode 100644 src/utils/orderCreate.js
diff --git a/src/components/app/app.jsx b/src/components/app/app.jsx
index 6945fb6..45f9bc9 100644
--- a/src/components/app/app.jsx
+++ b/src/components/app/app.jsx
@@ -1,6 +1,9 @@
-import { useEffect, useState } from 'react';
-import styles from './app.module.css';
+import { useEffect, useState, useReducer } from 'react';
import { dataLoad } from '../../utils/dataLoad';
+import { sumReducer, sumInitialValue } from '../../services/sum-reducer';
+import { OrderContext } from '../../services/order-context';
+
+import styles from './app.module.css';
import AppHeader from '../app-header/app-header';
import BurgerConstructor from '../burger-constructor/burger-constructor';
import BurgerIngredients from '../burger-ingredients/burger-ingredients';
@@ -14,15 +17,19 @@ function App() {
useEffect(() => {
dataLoad()
- .then(data => {
- setState({ data: data, isLoading: false, isError: false });
- })
- .catch(err => {
- console.log('ошибка получения данных', err);
- setState({ data: null, isLoading: false, isError: true });
- });
+ .then(data => {
+ setState({ data: data, isLoading: false, isError: false });
+ })
+ .catch(err => {
+ console.log('ошибка получения данных', err);
+ setState({ data: null, isLoading: false, isError: true });
+ });
}, []);
+ const [bun, setBun] = useState(null);
+ const [ingredients, setIngredients] = useState([]);
+ const [sumState, sumDispatcher] = useReducer(sumReducer, sumInitialValue);
+
return (
<>
{(state.isLoading || state.isError) ? (
@@ -32,17 +39,20 @@ function App() {
) :
- state.data && (
- <>
-
-
-
-
-
-
-
- >
- )}
+ state.data && (
+ <>
+
+
+
+
+
+
+
+
+
+ >
+ )}
>
);
}
diff --git a/src/components/burger-constructor-order/burger-constructor-order.jsx b/src/components/burger-constructor-order/burger-constructor-order.jsx
index f70af62..2d899aa 100644
--- a/src/components/burger-constructor-order/burger-constructor-order.jsx
+++ b/src/components/burger-constructor-order/burger-constructor-order.jsx
@@ -1,14 +1,24 @@
-import { useState } from 'react';
-import PropTypes from 'prop-types';
+import { useState, useContext } from 'react';
import { CurrencyIcon, Button } from "@ya.praktikum/react-developer-burger-ui-components";
import styles from './burger-constructor-order.module.css';
import OrderDetails from '../order-details/order-details';
+import { OrderContext } from '../../services/order-context';
+import { orderCreate } from '../../utils/orderCreate';
-function BurgerConstructorOrder({ sum, number }) {
+function BurgerConstructorOrder() {
const [show, setShow] = useState(false);
+ const [number, setNumber] = useState('');
+ const { ingredients, sumState } = useContext(OrderContext);
function showOrder() {
- setShow(true);
+ orderCreate(ingredients)
+ .then(num => {
+ setNumber(num);
+ setShow(true);
+ })
+ .catch(error => {
+ console.log(error);
+ });
}
function hideOrder() {
@@ -17,7 +27,7 @@ function BurgerConstructorOrder({ sum, number }) {
return (
-
{sum}
+
{sumState.sum}
{show &&
}
@@ -25,9 +35,4 @@ function BurgerConstructorOrder({ sum, number }) {
);
}
-BurgerConstructorOrder.propTypes = {
- sum: PropTypes.number.isRequired,
- number: PropTypes.string.isRequired
-}
-
export default BurgerConstructorOrder;
\ No newline at end of file
diff --git a/src/components/burger-constructor/burger-constructor.jsx b/src/components/burger-constructor/burger-constructor.jsx
index 3331856..8b13e5b 100644
--- a/src/components/burger-constructor/burger-constructor.jsx
+++ b/src/components/burger-constructor/burger-constructor.jsx
@@ -1,18 +1,33 @@
-import { useMemo } from 'react';
+import { useContext, useEffect } from 'react';
import PropTypes from 'prop-types';
import styles from './burger-constructor.module.css';
import { dataPropTypes } from '../../utils/dataPropTypes';
import { BUN } from '../../utils/dataNames';
import { ConstructorElement, DragIcon } from '@ya.praktikum/react-developer-burger-ui-components';
import BurgerConstructorOrder from '../burger-constructor-order/burger-constructor-order';
-
+import { OrderContext } from '../../services/order-context';
function BurgerConstructor({ data }) {
- const list = useMemo(() => data.filter(item => item.type !== BUN), [data]);
- const bun = useMemo(() => data.find(item => item.type === BUN), [data]);
- const sum = useMemo(() => bun.price * 2 + list.reduce((sum, item) => sum += item.price, 0), [list, bun]);
- return (
+ const { bun, setBun, ingredients, setIngredients, sumDispatcher } = useContext(OrderContext);
+
+ useEffect(() => {
+ const buns = data.filter(item => item.type === BUN);
+ setBun(buns[Math.floor(Math.random() * buns.length)]);
+
+ const list = data.filter(item => item.type !== BUN &&
+ Math.round(Math.random()) === 1);
+ setIngredients(list);
+ }, [data, setBun, setIngredients]);
+
+ useEffect(() => {
+ if (bun) {
+ const sum = bun.price * 2 + ingredients.reduce((sum, item) => sum += item.price, 0);
+ sumDispatcher({ type: 'set', value: sum });
+ }
+ }, [bun, ingredients, sumDispatcher]);
+
+ return bun && (
- {list.map((item, index) => (
+ {ingredients.map((item, index) => (
-
-
+
-
+
);
}
diff --git a/src/components/burger-constructor/burger-constructor.module.css b/src/components/burger-constructor/burger-constructor.module.css
index db08878..79fe08a 100644
--- a/src/components/burger-constructor/burger-constructor.module.css
+++ b/src/components/burger-constructor/burger-constructor.module.css
@@ -55,12 +55,10 @@
.list-item {
display: flex;
align-items: center;
+ cursor: move;
}
.ingredient {
background: var(--background);
}
-.draggable {
- cursor: grabbing;
-}
diff --git a/src/components/burger-ingredients-item/burger-ingredients-item.jsx b/src/components/burger-ingredients-item/burger-ingredients-item.jsx
index 1a14721..5226636 100644
--- a/src/components/burger-ingredients-item/burger-ingredients-item.jsx
+++ b/src/components/burger-ingredients-item/burger-ingredients-item.jsx
@@ -1,12 +1,31 @@
-import { useState } from 'react';
-import PropTypes from 'prop-types';
+import { useState, useContext, useMemo } from 'react';
import { dataPropTypes } from '../../utils/dataPropTypes';
+import { OrderContext } from '../../services/order-context';
+
import styles from './burger-ingredients-item.module.css';
import { CurrencyIcon, Counter } from '@ya.praktikum/react-developer-burger-ui-components';
import IngredientDetails from '../ingredient-details/ingredient-details';
+import { BUN } from '../../utils/dataNames';
+
+function BurgerIngredientItem({ item }) {
+ const [ show, setShow ] = useState(false);
+ const { ingredients, bun } = useContext(OrderContext);
+
+ const count = useMemo(() => {
+ if (item.type === BUN && bun) {
+ return bun._id === item._id ? 1 : 0;
+ }
+ else {
+ const list = ingredients.filter(i => i._id === item._id);
+ return list.length;
+ }
+ }, [item, bun, ingredients]);
-function BurgerIngredientItem({ item, count }) {
- const [show, setShow] = useState(false);
+// useEffect(() => {
+// const list = ingredients.filter(i => i._id = item._id);
+// console.log(`item: ${item.name}, list: ${list.length}, ing: ${ingredients.length}`);
+// setCount(list.length);
+ // }, [item, ingredients, setCount]);
function showDialog() {
setShow(true);
@@ -25,15 +44,14 @@ function BurgerIngredientItem({ item, count }) {
{item.name}
- {count && count > 0 ? : undefined}
+ {count > 0 && }
{show && }
);
}
BurgerIngredientItem.propTypes = {
- item: dataPropTypes.isRequired,
- count: PropTypes.number
+ item: dataPropTypes.isRequired
}
export default BurgerIngredientItem;
\ No newline at end of file
diff --git a/src/components/burger-ingredients/burger-ingredients.jsx b/src/components/burger-ingredients/burger-ingredients.jsx
index 98cdad3..7005dab 100644
--- a/src/components/burger-ingredients/burger-ingredients.jsx
+++ b/src/components/burger-ingredients/burger-ingredients.jsx
@@ -35,7 +35,7 @@ function BurgerIngredients({ data }) {
{names[type]}
{groups[type].map((item, index) => (
-
+
))}
diff --git a/src/components/order-details/order-details.jsx b/src/components/order-details/order-details.jsx
index 8a740a0..e8a0878 100644
--- a/src/components/order-details/order-details.jsx
+++ b/src/components/order-details/order-details.jsx
@@ -16,7 +16,7 @@ function OrderDetails({ number, onClose }) {
}
OrderDetails.propTypes = {
- number: PropTypes.string.isRequired,
+ number: PropTypes.number.isRequired,
onClose: PropTypes.func.isRequired
}
diff --git a/src/services/order-context.js b/src/services/order-context.js
new file mode 100644
index 0000000..4406ea0
--- /dev/null
+++ b/src/services/order-context.js
@@ -0,0 +1,3 @@
+import { createContext } from 'react';
+
+export const OrderContext = createContext();
\ No newline at end of file
diff --git a/src/services/sum-reducer.js b/src/services/sum-reducer.js
new file mode 100644
index 0000000..cdfd315
--- /dev/null
+++ b/src/services/sum-reducer.js
@@ -0,0 +1,12 @@
+export const sumInitialValue = { sum: 0 };
+
+export function sumReducer(state, action) {
+ switch (action.type) {
+ case 'set':
+ return { sum: action.value };
+ case 'reset':
+ return sumInitialValue;
+ default:
+ throw Error(`Неверное действие: ${action.type}`);
+ }
+}
diff --git a/src/utils/api-constants.js b/src/utils/api-constants.js
new file mode 100644
index 0000000..436ecf1
--- /dev/null
+++ b/src/utils/api-constants.js
@@ -0,0 +1,4 @@
+export const DOMAIN = "https://norma.nomoreparties.space";
+export const API_LOAD = "/api/ingredients";
+export const API_ORDER = "/api/orders";
+export const STATUS_OK = 200;
diff --git a/src/utils/dataLoad.js b/src/utils/dataLoad.js
index 99032bc..73dcf46 100644
--- a/src/utils/dataLoad.js
+++ b/src/utils/dataLoad.js
@@ -1,9 +1,7 @@
-const DOMAIN = "https://norma.nomoreparties.space";
-const API = "/api/ingredients";
-const STATUS_OK = 200;
+import { DOMAIN, API_LOAD, STATUS_OK } from './api-constants';
export function dataLoad() {
- return fetch(`${DOMAIN}${API}`)
+ return fetch(`${DOMAIN}${API_LOAD}`)
.then(res => {
if (res.status !== STATUS_OK) {
throw Error(`Неверный html-статус ответа: ${res.status}: ${res.statusText}`);
@@ -17,9 +15,8 @@ export function dataLoad() {
if (res.data && res.data.length > 0) {
return res.data;
- }
- else {
- throw Error('возвращен пустой или некорректный набор данных');
+ } else {
+ throw Error('Возвращен пустой или некорректный набор данных');
}
});
}
diff --git a/src/utils/orderCreate.js b/src/utils/orderCreate.js
new file mode 100644
index 0000000..3d56ce6
--- /dev/null
+++ b/src/utils/orderCreate.js
@@ -0,0 +1,30 @@
+import { DOMAIN, API_ORDER, STATUS_OK } from './api-constants';
+
+export function orderCreate(ingredients) {
+ return fetch(`${DOMAIN}${API_ORDER}`, {
+ method: "POST",
+ headers: {
+ 'Content-Type': 'application/json;charset=utf-8'
+ },
+ body: JSON.stringify({ ingredients: ingredients.map(item => item._id) })
+ })
+ .then(res => {
+ if (res.status !== STATUS_OK) {
+ console.log(`Неверный html-статус ответа: ${res.status}: ${res.statusText}`);
+ }
+ return res.json();
+ })
+ .then(res => {
+ if (res.success) {
+
+ if (res.order && typeof res.order.number === "number") {
+ return res.order.number;
+ } else {
+ throw Error('Не найден order.number внутри ответа');
+ }
+ }
+ else {
+ throw Error(`Ошибка от сервера: ${res.message}`);
+ }
+ });
+}
From 485c8c0fd13d1177f5bb28743687e34b0527aca3 Mon Sep 17 00:00:00 2001
From: Aleksey Obukhov
Date: Fri, 20 Jan 2023 12:25:19 +0300
Subject: [PATCH 2/4] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?=
=?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF=D0=BE=20=D1=80=D0=B5=D0=B7?=
=?UTF-8?q?=D1=83=D0=BB=D1=8C=D1=82=D0=B0=D1=82=D0=B0=D0=BC=20=D1=80=D0=B5?=
=?UTF-8?q?=D0=B2=D1=8C=D1=8E?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/components/app/app.jsx | 6 ++--
.../burger-constructor-order.jsx | 7 +++-
.../burger-constructor/burger-constructor.jsx | 10 ++----
.../burger-ingredients-item.jsx | 17 +++++-----
.../burger-ingredients/burger-ingredients.jsx | 16 ++++-----
.../ingredient-details/ingredient-details.jsx | 11 +++---
src/components/modal/modal.jsx | 2 +-
.../order-details/order-details.jsx | 12 +++----
src/utils/dataLoad.js | 11 ++----
src/utils/orderCreate.js | 34 ++++++++-----------
src/utils/request.js | 12 +++++++
11 files changed, 64 insertions(+), 74 deletions(-)
create mode 100644 src/utils/request.js
diff --git a/src/components/app/app.jsx b/src/components/app/app.jsx
index 45f9bc9..7705015 100644
--- a/src/components/app/app.jsx
+++ b/src/components/app/app.jsx
@@ -44,10 +44,10 @@ function App() {
-
-
-
+
+
diff --git a/src/components/burger-constructor-order/burger-constructor-order.jsx b/src/components/burger-constructor-order/burger-constructor-order.jsx
index 2d899aa..95f2b25 100644
--- a/src/components/burger-constructor-order/burger-constructor-order.jsx
+++ b/src/components/burger-constructor-order/burger-constructor-order.jsx
@@ -4,6 +4,7 @@ import styles from './burger-constructor-order.module.css';
import OrderDetails from '../order-details/order-details';
import { OrderContext } from '../../services/order-context';
import { orderCreate } from '../../utils/orderCreate';
+import Modal from '../modal/modal';
function BurgerConstructorOrder() {
const [show, setShow] = useState(false);
@@ -30,7 +31,11 @@ function BurgerConstructorOrder() {
{sumState.sum}
- {show && }
+ {show && (
+
+
+
+ )}
);
}
diff --git a/src/components/burger-constructor/burger-constructor.jsx b/src/components/burger-constructor/burger-constructor.jsx
index 8b13e5b..b00c163 100644
--- a/src/components/burger-constructor/burger-constructor.jsx
+++ b/src/components/burger-constructor/burger-constructor.jsx
@@ -1,15 +1,13 @@
import { useContext, useEffect } from 'react';
-import PropTypes from 'prop-types';
import styles from './burger-constructor.module.css';
-import { dataPropTypes } from '../../utils/dataPropTypes';
import { BUN } from '../../utils/dataNames';
import { ConstructorElement, DragIcon } from '@ya.praktikum/react-developer-burger-ui-components';
import BurgerConstructorOrder from '../burger-constructor-order/burger-constructor-order';
import { OrderContext } from '../../services/order-context';
-function BurgerConstructor({ data }) {
+function BurgerConstructor() {
- const { bun, setBun, ingredients, setIngredients, sumDispatcher } = useContext(OrderContext);
+ const { data, bun, setBun, ingredients, setIngredients, sumDispatcher } = useContext(OrderContext);
useEffect(() => {
const buns = data.filter(item => item.type === BUN);
@@ -66,8 +64,4 @@ function BurgerConstructor({ data }) {
);
}
-BurgerConstructor.propTypes = {
- data: PropTypes.arrayOf(dataPropTypes.isRequired).isRequired
-}
-
export default BurgerConstructor;
\ No newline at end of file
diff --git a/src/components/burger-ingredients-item/burger-ingredients-item.jsx b/src/components/burger-ingredients-item/burger-ingredients-item.jsx
index 5226636..9793350 100644
--- a/src/components/burger-ingredients-item/burger-ingredients-item.jsx
+++ b/src/components/burger-ingredients-item/burger-ingredients-item.jsx
@@ -1,14 +1,15 @@
import { useState, useContext, useMemo } from 'react';
import { dataPropTypes } from '../../utils/dataPropTypes';
import { OrderContext } from '../../services/order-context';
+import { BUN } from '../../utils/dataNames';
import styles from './burger-ingredients-item.module.css';
import { CurrencyIcon, Counter } from '@ya.praktikum/react-developer-burger-ui-components';
import IngredientDetails from '../ingredient-details/ingredient-details';
-import { BUN } from '../../utils/dataNames';
+import Modal from '../modal/modal';
function BurgerIngredientItem({ item }) {
- const [ show, setShow ] = useState(false);
+ const [show, setShow] = useState(false);
const { ingredients, bun } = useContext(OrderContext);
const count = useMemo(() => {
@@ -21,12 +22,6 @@ function BurgerIngredientItem({ item }) {
}
}, [item, bun, ingredients]);
-// useEffect(() => {
-// const list = ingredients.filter(i => i._id = item._id);
-// console.log(`item: ${item.name}, list: ${list.length}, ing: ${ingredients.length}`);
-// setCount(list.length);
- // }, [item, ingredients, setCount]);
-
function showDialog() {
setShow(true);
}
@@ -45,7 +40,11 @@ function BurgerIngredientItem({ item }) {
{item.name}
{count > 0 && }
- {show && }
+ {show && (
+
+
+
+ )}
);
}
diff --git a/src/components/burger-ingredients/burger-ingredients.jsx b/src/components/burger-ingredients/burger-ingredients.jsx
index 7005dab..7fdbd34 100644
--- a/src/components/burger-ingredients/burger-ingredients.jsx
+++ b/src/components/burger-ingredients/burger-ingredients.jsx
@@ -1,12 +1,12 @@
-import { useMemo, useRef } from 'react';
-import PropTypes from 'prop-types';
+import { useContext, useMemo, useRef } from 'react';
import styles from './burger-ingredients.module.css';
import { BUN, SAUCE, MAIN, names } from '../../utils/dataNames';
-import { dataPropTypes } from '../../utils/dataPropTypes';
import BurgerIngredientsTabs from '../burger-ingredients-tabs/burger-ingredients-tabs';
import BurgerIngredientsItem from '../burger-ingredients-item/burger-ingredients-item';
+import { OrderContext } from '../../services/order-context';
-function BurgerIngredients({ data }) {
+function BurgerIngredients() {
+ const { data } = useContext(OrderContext);
const groups = useMemo(() => {
let res = {};
res[BUN] = data.filter(i => i.type === BUN);
@@ -34,8 +34,8 @@ function BurgerIngredients({ data }) {
{names[type]}
- {groups[type].map((item, index) => (
-
+ {groups[type].map((item) => (
+
))}
@@ -45,8 +45,4 @@ function BurgerIngredients({ data }) {
);
}
-BurgerIngredients.propTypes = {
- data: PropTypes.arrayOf(dataPropTypes.isRequired).isRequired
-}
-
export default BurgerIngredients;
\ No newline at end of file
diff --git a/src/components/ingredient-details/ingredient-details.jsx b/src/components/ingredient-details/ingredient-details.jsx
index e043651..c13812c 100644
--- a/src/components/ingredient-details/ingredient-details.jsx
+++ b/src/components/ingredient-details/ingredient-details.jsx
@@ -1,11 +1,9 @@
-import PropTypes from 'prop-types';
import styles from './ingredient-details.module.css';
-import Modal from '../modal/modal';
import { dataPropTypes } from '../../utils/dataPropTypes';
-function IngredientDetails({ item, onClose }) {
+function IngredientDetails({ item }) {
return (
-
+ <>
{item.name}
@@ -26,13 +24,12 @@ function IngredientDetails({ item, onClose }) {
{item.carbohydrates}
-
+ >
);
}
IngredientDetails.propTypes = {
- item: dataPropTypes.isRequired,
- onClose: PropTypes.func.isRequired
+ item: dataPropTypes.isRequired
}
export default IngredientDetails;
\ No newline at end of file
diff --git a/src/components/modal/modal.jsx b/src/components/modal/modal.jsx
index 2d4cdf9..a140042 100644
--- a/src/components/modal/modal.jsx
+++ b/src/components/modal/modal.jsx
@@ -38,7 +38,7 @@ function Modal({ caption, children, onClose }) {
Modal.propTypes = {
caption: PropTypes.string,
- children: PropTypes.arrayOf(PropTypes.element),
+ children: PropTypes.element.isRequired,
onClose: PropTypes.func.isRequired
}
diff --git a/src/components/order-details/order-details.jsx b/src/components/order-details/order-details.jsx
index e8a0878..57fe094 100644
--- a/src/components/order-details/order-details.jsx
+++ b/src/components/order-details/order-details.jsx
@@ -1,23 +1,21 @@
import PropTypes from 'prop-types';
import img from '../../images/done.png';
-import Modal from '../modal/modal';
import styles from './order-details.module.css';
-function OrderDetails({ number, onClose }) {
+function OrderDetails({ number }) {
return (
-
- {number}
+ <>
+ {number}
идентификатор заказа
Ваш заказ начали готовить
Дождитесь готовности на орбитальной станции
-
+ >
);
}
OrderDetails.propTypes = {
- number: PropTypes.number.isRequired,
- onClose: PropTypes.func.isRequired
+ number: PropTypes.number.isRequired
}
export default OrderDetails;
\ No newline at end of file
diff --git a/src/utils/dataLoad.js b/src/utils/dataLoad.js
index 73dcf46..1f4065f 100644
--- a/src/utils/dataLoad.js
+++ b/src/utils/dataLoad.js
@@ -1,13 +1,8 @@
-import { DOMAIN, API_LOAD, STATUS_OK } from './api-constants';
+import { DOMAIN, API_LOAD } from './api-constants';
+import { request } from './request';
export function dataLoad() {
- return fetch(`${DOMAIN}${API_LOAD}`)
- .then(res => {
- if (res.status !== STATUS_OK) {
- throw Error(`Неверный html-статус ответа: ${res.status}: ${res.statusText}`);
- }
- return res.json();
- })
+ return request(`${DOMAIN}${API_LOAD}`)
.then(res => {
if (!res.success) {
throw Error('В json-ответе success !== true');
diff --git a/src/utils/orderCreate.js b/src/utils/orderCreate.js
index 3d56ce6..ef24661 100644
--- a/src/utils/orderCreate.js
+++ b/src/utils/orderCreate.js
@@ -1,30 +1,24 @@
-import { DOMAIN, API_ORDER, STATUS_OK } from './api-constants';
+import { DOMAIN, API_ORDER } from './api-constants';
+import { request } from './request';
export function orderCreate(ingredients) {
- return fetch(`${DOMAIN}${API_ORDER}`, {
+ return request(`${DOMAIN}${API_ORDER}`, {
method: "POST",
headers: {
'Content-Type': 'application/json;charset=utf-8'
},
body: JSON.stringify({ ingredients: ingredients.map(item => item._id) })
})
- .then(res => {
- if (res.status !== STATUS_OK) {
- console.log(`Неверный html-статус ответа: ${res.status}: ${res.statusText}`);
+ .then(res => {
+ if (res.success) {
+ if (res.order && typeof res.order.number === "number") {
+ return res.order.number;
+ } else {
+ throw Error('Не найден order.number внутри ответа');
}
- return res.json();
- })
- .then(res => {
- if (res.success) {
-
- if (res.order && typeof res.order.number === "number") {
- return res.order.number;
- } else {
- throw Error('Не найден order.number внутри ответа');
- }
- }
- else {
- throw Error(`Ошибка от сервера: ${res.message}`);
- }
- });
+ }
+ else {
+ throw Error(`Ошибка от сервера: ${res.message}`);
+ }
+ });
}
diff --git a/src/utils/request.js b/src/utils/request.js
new file mode 100644
index 0000000..73a29b5
--- /dev/null
+++ b/src/utils/request.js
@@ -0,0 +1,12 @@
+import { STATUS_OK } from "./api-constants";
+
+export function request(url, options) {
+ return fetch(url, options).then(checkResponse);
+}
+
+function checkResponse(res) {
+ if (res.status !== STATUS_OK) {
+ console.log(`Неверный html-статус ответа: ${res.status}: ${res.statusText}`);
+ }
+ return res.json();
+}
\ No newline at end of file
From 9142506ea0633b80c66169ee455d4126a21aa80e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Alexey=20Obukhov=20=28=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5?=
=?UTF-8?q?=D0=B9=20=D0=9E=D0=B1=D1=83=D1=85=D0=BE=D0=B2=29?=
Date: Fri, 20 Jan 2023 12:29:48 +0300
Subject: [PATCH 3/4] Update README.md
---
README.md | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/README.md b/README.md
index 3c9b181..b7544e0 100644
--- a/README.md
+++ b/README.md
@@ -34,3 +34,11 @@ git checkout sprint-1/step-1
git checkout sprint-1/step-2
```
Были [замечания](https://github.com/miptleha/react-burger/pull/4) по загрузке данных с сервера, успешно их исправил, работу приняли и я смержил все в main ветку.
+
+## Спринт 2
+### Шаг 1
+Данные перенесены в Context. Заказ отправляется на сервер.
+```
+git checkout sprint-2/step-1
+```
+[Замечания](https://github.com/miptleha/react-burger/pull/6) по изменениям в ветке
From 7b26fe7a9f13567fd39ee236d00d6db8c2785f38 Mon Sep 17 00:00:00 2001
From: Aleksey Obukhov
Date: Fri, 20 Jan 2023 17:05:19 +0300
Subject: [PATCH 4/4] =?UTF-8?q?=D0=B4=D0=B8=D0=B0=D0=BB=D0=BE=D0=B3=20?=
=?UTF-8?q?=D1=81=20=D0=B4=D0=B5=D1=82=D0=B0=D0=BB=D1=8F=D0=BC=D0=B8=20?=
=?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=BD=D0=B5=D1=81=D0=B5=D0=BD=20=D0=BD?=
=?UTF-8?q?=D0=B0=20=D1=83=D1=80=D0=BE=D0=B2=D0=B5=D0=BD=D1=8C=20=D0=B2?=
=?UTF-8?q?=D1=8B=D1=88=D0=B5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../burger-ingredients-item.jsx | 31 ++++++-------------
.../burger-ingredients/burger-ingredients.jsx | 29 ++++++++++++++---
2 files changed, 35 insertions(+), 25 deletions(-)
diff --git a/src/components/burger-ingredients-item/burger-ingredients-item.jsx b/src/components/burger-ingredients-item/burger-ingredients-item.jsx
index 9793350..dfd8fd7 100644
--- a/src/components/burger-ingredients-item/burger-ingredients-item.jsx
+++ b/src/components/burger-ingredients-item/burger-ingredients-item.jsx
@@ -1,15 +1,13 @@
-import { useState, useContext, useMemo } from 'react';
+import { useContext, useMemo } from 'react';
+import PropTypes from 'prop-types';
import { dataPropTypes } from '../../utils/dataPropTypes';
import { OrderContext } from '../../services/order-context';
import { BUN } from '../../utils/dataNames';
import styles from './burger-ingredients-item.module.css';
import { CurrencyIcon, Counter } from '@ya.praktikum/react-developer-burger-ui-components';
-import IngredientDetails from '../ingredient-details/ingredient-details';
-import Modal from '../modal/modal';
-function BurgerIngredientItem({ item }) {
- const [show, setShow] = useState(false);
+function BurgerIngredientsItem({ item, onShowDetails }) {
const { ingredients, bun } = useContext(OrderContext);
const count = useMemo(() => {
@@ -22,17 +20,12 @@ function BurgerIngredientItem({ item }) {
}
}, [item, bun, ingredients]);
- function showDialog() {
- setShow(true);
- }
-
- function hideDialog(e) {
- setShow(false);
- e.stopPropagation();
+ function showDialogItem() {
+ onShowDetails(item);
}
return (
-
+
{item.price}
@@ -40,17 +33,13 @@ function BurgerIngredientItem({ item }) {
{item.name}
{count > 0 && }
- {show && (
-
-
-
- )}
);
}
-BurgerIngredientItem.propTypes = {
- item: dataPropTypes.isRequired
+BurgerIngredientsItem.propTypes = {
+ item: dataPropTypes.isRequired,
+ onShowDetails: PropTypes.func.isRequired
}
-export default BurgerIngredientItem;
\ No newline at end of file
+export default BurgerIngredientsItem;
\ No newline at end of file
diff --git a/src/components/burger-ingredients/burger-ingredients.jsx b/src/components/burger-ingredients/burger-ingredients.jsx
index 7fdbd34..41156b1 100644
--- a/src/components/burger-ingredients/burger-ingredients.jsx
+++ b/src/components/burger-ingredients/burger-ingredients.jsx
@@ -1,12 +1,18 @@
-import { useContext, useMemo, useRef } from 'react';
-import styles from './burger-ingredients.module.css';
+import { useContext, useMemo, useRef, useState } from 'react';
import { BUN, SAUCE, MAIN, names } from '../../utils/dataNames';
+import { OrderContext } from '../../services/order-context';
+
+import styles from './burger-ingredients.module.css';
import BurgerIngredientsTabs from '../burger-ingredients-tabs/burger-ingredients-tabs';
import BurgerIngredientsItem from '../burger-ingredients-item/burger-ingredients-item';
-import { OrderContext } from '../../services/order-context';
+import Modal from '../modal/modal';
+import IngredientDetails from '../ingredient-details/ingredient-details';
function BurgerIngredients() {
+ const [itemShow, setItemShow] = useState(null);
+
const { data } = useContext(OrderContext);
+
const groups = useMemo(() => {
let res = {};
res[BUN] = data.filter(i => i.type === BUN);
@@ -24,6 +30,15 @@ function BurgerIngredients() {
headers[value].current.scrollIntoView({ behavior: "smooth" });
}
+ function showDialog(item) {
+ setItemShow(item);
+ }
+
+ function hideDialog(e) {
+ setItemShow(null);
+ e.stopPropagation();
+ }
+
return (
Соберите бургер
@@ -35,12 +50,18 @@ function BurgerIngredients() {
{names[type]}
{groups[type].map((item) => (
-
+
))}
))}
+
+ {itemShow && (
+
+
+
+ )}
);
}