burger-online
96 строк · 3.4 Кб
1import {CurrencyIcon, FormattedDate} from '@ya.praktikum/react-developer-burger-ui-components'
2import React from 'react'
3import {useSelector} from 'react-redux'
4import {useParams} from 'react-router-dom'
5import {useAppDispatch, useOrder} from '../../hooks'
6import ErrorPage from '../../pages/error-page'
7import {fetchByClickingOnTheCardOrder} from '../../redux/constructor/actions'
8import {constructorStore} from '../../redux/constructor/slice'
9import {
10feedOrdersConnect as connect,
11feedOrdersDisconnect as disconnect,
12} from '../../redux/feed-orders/actions'
13import {TCorrectCardInfo, TIngredient} from '../../types'
14import {WS_ORDERS_ALL_URL} from '../../utils/constants'
15import Preloader from '../UI/preloader/preloader'
16import OrderComposition from '../order-composition/order-composition'
17import styles from './order-modal.module.css'
18
19const OrderModal = () => {
20const dispatch = useAppDispatch()
21const {number} = useParams()
22const {order, statusOrder} = useSelector(constructorStore)
23
24const correctCardInfo = useOrder(order.ingredients) as TCorrectCardInfo
25
26const correctCardInfoAddCount: TIngredient[] = React.useMemo(() => {
27const uniqueIngredientMap = new Map()
28
29if (typeof correctCardInfo.items === 'object') {
30for (const ingredient of correctCardInfo.items) {
31const ingredientString = JSON.stringify(ingredient)
32
33if (uniqueIngredientMap.has(ingredientString)) {
34const existingIngredient = uniqueIngredientMap.get(ingredientString)
35existingIngredient.count += 1
36} else {
37uniqueIngredientMap.set(ingredientString, {...ingredient, count: 1})
38}
39}
40}
41return Array.from(uniqueIngredientMap.values())
42}, [correctCardInfo])
43
44React.useEffect(() => {
45number && dispatch(fetchByClickingOnTheCardOrder(number))
46dispatch(connect(WS_ORDERS_ALL_URL))
47return () => {
48dispatch(disconnect())
49}
50}, [number, dispatch])
51
52if (statusOrder === 'LOADING')
53return (
54<div className={styles.order}>
55<Preloader />
56</div>
57)
58if (statusOrder === 'ERROR') return <ErrorPage />
59return (
60<div className={styles.order}>
61<span className={`text_type_digits-default ${styles.orderNumber}`}>#{order?.number}</span>
62<h3 className={`text text_type_main-medium ${styles.orderTitle}`}>{order?.name}</h3>
63<p
64className={`text text_type_main-default ${
65order.status === 'done'
66? 'text_color_success'
67: order.status === 'cancelled'
68? 'text_color_error'
69: ''
70} ${styles.orderStatus}`}
71>
72{order?.status === 'done' ? 'Выполнен' : order.status === 'cancelled' ? 'Отменен' : 'Готовится'}
73</p>
74<h3 className={`text text_type_main-medium ${styles.titleListText}`}>Состав:</h3>
75<div className={`custom-scroll ${styles.list}`}>
76{correctCardInfoAddCount.map((item, i) => (
77<OrderComposition key={i} {...item} />
78))}
79</div>
80
81<div className={styles.orderDate}>
82{order && (
83<FormattedDate
84className='text text_type_main-default text_color_inactive'
85date={new Date(order.updatedAt)}
86/>
87)}
88<span className={`text_type_digits-default ${styles.orderFullPrice}`}>
89{correctCardInfo?.totalPrice} <CurrencyIcon type='primary' />
90</span>
91</div>
92</div>
93)
94}
95
96export default OrderModal
97