-
Notifications
You must be signed in to change notification settings - Fork 214
Expand file tree
/
Copy pathuse-bonus-product-modal.js
More file actions
105 lines (94 loc) · 3.36 KB
/
use-bonus-product-modal.js
File metadata and controls
105 lines (94 loc) · 3.36 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
/*
* Copyright (c) 2025, Salesforce, Inc.
* All rights reserved.
* SPDX-License-Identifier: BSD-3-Clause
* For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/BSD-3-Clause
*/
import React, {useContext, useState, useEffect} from 'react'
import {useLocation} from 'react-router-dom'
import PropTypes from 'prop-types'
import {useAddToCartModalContext} from '@salesforce/retail-react-app/app/hooks/use-add-to-cart-modal'
import {BonusProductModal} from '@salesforce/retail-react-app/app/components/bonus-product-modal'
import {useCurrentBasket} from '@salesforce/retail-react-app/app/hooks/use-current-basket'
export const BonusProductModalContext = React.createContext()
export const useBonusProductModalContext = () => useContext(BonusProductModalContext)
export const BonusProductModalProvider = ({children}) => {
const {data: basket} = useCurrentBasket()
const bonusProductState = useBonusState(basket)
return (
<BonusProductModalContext.Provider value={bonusProductState}>
{children}
<BonusProductModal />
</BonusProductModalContext.Provider>
)
}
BonusProductModalProvider.propTypes = {
children: PropTypes.node.isRequired
}
export const useBonusState = (basket) => {
const [state, setState] = useState({
isOpen: false,
data: {},
existingBonusProducts: basket?.bonusDiscountLineItems || []
})
const {pathname} = useLocation()
const {onOpen: onAddToCartModalOpen} = useAddToCartModalContext()
useEffect(() => {
if (state.isOpen) {
setState((prev) => ({
...prev,
isOpen: false
}))
}
}, [pathname])
// Update bonusProducts when basket bonusDiscountLineItems changes
useEffect(() => {
const currentBonusItems = basket?.bonusDiscountLineItems || []
setState((prev) => {
// Only update if the bonus items have actually changed
if (JSON.stringify(prev.existingBonusProducts) !== JSON.stringify(currentBonusItems)) {
return {
...prev,
existingBonusProducts: currentBonusItems
}
}
return prev
})
}, [basket?.bonusDiscountLineItems])
const addBonusProducts = (newBonusItems) => {
setState((prev) => {
const updatedBonusProducts = [...prev.existingBonusProducts, ...newBonusItems]
return {
...prev,
existingBonusProducts: updatedBonusProducts
}
})
}
return {
isOpen: state.isOpen,
data: state.data,
bonusProducts: state.existingBonusProducts,
addBonusProducts,
onClose: () => {
setState((prev) => ({
...prev,
isOpen: false,
data: {}
}))
if (state.data.openAddToCartModalIfNeeded && state.data.product) {
onAddToCartModalOpen({
product: state.data.product,
itemsAdded: state.data.itemsAdded,
selectedQuantity: state.data.selectedQuantity
})
}
},
onOpen: (data) => {
setState((prev) => ({
...prev,
isOpen: true,
data
}))
}
}
}