burger-online
102 строки · 3.0 Кб
1import {PayloadAction, createSlice} from '@reduxjs/toolkit'
2import {TIngredient, TOrderNumber} from '../../types'
3import {RootState} from '../store'
4import {fetchByClickingOnTheCardOrder, fetchOrder} from './actions'
5import {IConstructorState, TDragAndDropIndex} from './types'
6
7const initialState: IConstructorState = {
8bun: {
9calories: 0,
10carbohydrates: 0,
11fat: 0,
12image: '',
13image_large: '',
14image_mobile: '',
15name: '',
16price: 0,
17proteins: 0,
18type: '',
19__v: 0,
20_id: '',
21count: 0,
22},
23addedIngredients: [],
24countIngredient: 0,
25totalPrice: 0,
26
27createdOrder: {number: 0},
28statusCreatedOrder: '',
29
30order: {
31createdAt: '',
32ingredients: [],
33name: '',
34number: 0,
35status: '',
36updatedAt: '',
37_id: '',
38},
39statusOrder: '',
40}
41
42const constructorSlice = createSlice({
43name: 'constructor',
44initialState,
45reducers: {
46addBun: (state, action: PayloadAction<TIngredient>) => {
47state.bun = {
48...action.payload,
49isLocked: true,
50}
51state.totalPrice = action.payload.price * 2
52},
53addIngredient: (state, {payload}: PayloadAction<TIngredient>) => {
54state.addedIngredients.push(payload)
55},
56removeIngredient: (state, {payload}: PayloadAction<TIngredient>) => {
57state.addedIngredients = state.addedIngredients.filter(item => item.uuid !== payload.uuid)
58},
59setOrder: (state, action: PayloadAction<TOrderNumber>) => {
60state.createdOrder = action.payload
61},
62sortedIngredients: (state, {payload}: PayloadAction<TDragAndDropIndex>) => {
63let newItems = [...state.addedIngredients]
64const removedDragItem = newItems.splice(payload.dragIndex, 1)
65newItems.splice(payload.hoverIndex, 0, ...removedDragItem)
66state.addedIngredients = newItems
67},
68setTotalPrice: (state, action: PayloadAction<number>) => {
69state.totalPrice = action.payload
70},
71},
72extraReducers: builder => {
73builder
74.addCase(fetchOrder.pending, state => {
75state.statusCreatedOrder = 'LOADING'
76})
77.addCase(fetchOrder.fulfilled, (state, {payload}) => {
78state.createdOrder = payload.order
79state.statusCreatedOrder = 'SUCCESS'
80state.addedIngredients = []
81})
82.addCase(fetchOrder.rejected, state => {
83state.statusOrder = 'ERROR'
84state.createdOrder = {number: 0}
85})
86.addCase(fetchByClickingOnTheCardOrder.pending, state => {
87state.statusOrder = 'LOADING'
88})
89.addCase(fetchByClickingOnTheCardOrder.fulfilled, (state, {payload}) => {
90state.statusOrder = 'SUCCESS'
91state.order = payload.orders[0]
92})
93.addCase(fetchByClickingOnTheCardOrder.rejected, state => {
94state.statusOrder = 'ERROR'
95})
96},
97})
98
99export const constructorStore = (store: RootState) => store.burger
100export const {addBun, addIngredient, setTotalPrice, setOrder, removeIngredient, sortedIngredients} =
101constructorSlice.actions
102export default constructorSlice.reducer
103