@@ -13,7 +13,7 @@ import {
1313 ToggleCardEdit ,
1414 ToggleCardSummary
1515} from '@salesforce/retail-react-app/app/components/toggle-card'
16- import { Text } from '@salesforce/retail-react-app/app/components/shared/ui'
16+ import { Text , useDisclosure } from '@salesforce/retail-react-app/app/components/shared/ui'
1717import ShippingAddressSelection from '@salesforce/retail-react-app/app/pages/checkout/partials/shipping-address-selection'
1818import AddressDisplay from '@salesforce/retail-react-app/app/components/address-display'
1919import {
@@ -36,6 +36,7 @@ import {
3636 findExistingDeliveryShipment ,
3737 isPickupShipment
3838} from '@salesforce/retail-react-app/app/utils/shipment-utils'
39+ import SingleAddressToggleModal from '@salesforce/retail-react-app/app/components/single-address-toggle-modal'
3940
4041const submitButtonMessage = defineMessage ( {
4142 defaultMessage : 'Continue to Shipping Method' ,
@@ -77,6 +78,12 @@ export default function ShippingAddress() {
7778
7879 // Initialize multi-shipping state based on existing basket shipments
7980 const [ isMultiShipping , setIsMultiShipping ] = useState ( hasMultipleDeliveryShipments )
81+ const {
82+ isOpen : showWarningModal ,
83+ onOpen : openWarningModal ,
84+ onClose : closeWarningModal
85+ } = useDisclosure ( )
86+ const [ hasUnpersistedGuestAddresses , sethasUnpersistedGuestAddresses ] = useState ( false )
8087 const { step, STEPS , goToStep} = useCheckout ( )
8188 const createCustomerAddress = useShopperCustomersMutation ( 'createCustomerAddress' )
8289 const updateCustomerAddress = useShopperCustomersMutation ( 'updateCustomerAddress' )
@@ -90,6 +97,30 @@ export default function ShippingAddress() {
9097 setIsMultiShipping ( hasMultipleDeliveryShipments )
9198 } , [ hasMultipleDeliveryShipments ] )
9299
100+ // handle unpersisted address status from ShippingMultiAddress
101+ const handleUnsavedGuestAddressesToggleWarning = ( hasUnsaved ) => {
102+ sethasUnpersistedGuestAddresses ( hasUnsaved )
103+ }
104+
105+ // Handle toggle between single and multi-shipping
106+ const handleToggleShippingMode = ( ) => {
107+ if ( isMultiShipping && customer ?. isGuest && hasUnpersistedGuestAddresses ) {
108+ openWarningModal ( )
109+ } else {
110+ setIsMultiShipping ( ! isMultiShipping )
111+ }
112+ }
113+
114+ // handle confirmation to single address
115+ const handleConfirmSwitchToSingle = ( ) => {
116+ setIsMultiShipping ( false )
117+ closeWarningModal ( )
118+ }
119+
120+ const handleCancelSwitch = ( ) => {
121+ closeWarningModal ( )
122+ }
123+
93124 const submitAndContinue = async ( address ) => {
94125 setIsLoading ( true )
95126 try {
@@ -162,72 +193,79 @@ export default function ShippingAddress() {
162193 const isEditingShippingAddress = step === STEPS . SHIPPING_ADDRESS
163194
164195 return (
165- < ToggleCard
166- id = "step-1"
167- title = { formatMessage ( {
168- defaultMessage : 'Shipping Address' ,
169- id : 'shipping_address.title.shipping_address'
170- } ) }
171- editing = { isEditingShippingAddress }
172- isLoading = { isLoading }
173- disabled = { step === STEPS . CONTACT_INFO && ! selectedShippingAddress }
174- onEdit = { ( ) => goToStep ( STEPS . SHIPPING_ADDRESS ) }
175- editLabel = {
176- isMultiShipping
177- ? formatMessage ( {
178- defaultMessage : 'Edit Shipping Addresses' ,
179- id : 'toggle_card.action.editShippingAddresses'
180- } )
181- : formatMessage ( {
182- defaultMessage : 'Edit Shipping Address' ,
183- id : 'toggle_card.action.editShippingAddress'
184- } )
185- }
186- editAction = {
187- multishipEnabled
188- ? isMultiShipping
189- ? formatMessage ( shipToOneAddressLabel )
190- : formatMessage ( deliverToMultipleAddressesLabel )
191- : null
192- }
193- onEditActionClick = {
194- multishipEnabled
195- ? async ( ) => {
196- setIsMultiShipping ( ! isMultiShipping )
197- }
198- : null
199- }
200- >
201- < ToggleCardEdit >
202- { ! isMultiShipping ? (
203- < ShippingAddressSelection
204- selectedAddress = { selectedShippingAddress }
205- submitButtonLabel = { submitButtonMessage }
206- onSubmit = { submitAndContinue }
207- formTitleAriaLabel = { shippingAddressAriaLabel }
208- />
209- ) : (
210- < ShippingMultiAddress
211- basket = { basket }
212- submitButtonLabel = { submitButtonMessage }
213- noItemsInBasketMessage = { noItemsInBasketMessage }
214- />
215- ) }
216- </ ToggleCardEdit >
217- { isAddressFilled && (
218- < ToggleCardSummary >
219- { hasMultipleDeliveryShipments ? (
220- < Text >
221- { formatMessage ( {
222- defaultMessage : 'Your items will be shipped to multiple addresses.' ,
223- id : 'shipping_address.summary.multiple_addresses'
224- } ) }
225- </ Text >
196+ < >
197+ < ToggleCard
198+ id = "step-1"
199+ title = { formatMessage ( {
200+ defaultMessage : 'Shipping Address' ,
201+ id : 'shipping_address.title.shipping_address'
202+ } ) }
203+ editing = { isEditingShippingAddress }
204+ isLoading = { isLoading }
205+ disabled = { step === STEPS . CONTACT_INFO && ! selectedShippingAddress }
206+ onEdit = { ( ) => goToStep ( STEPS . SHIPPING_ADDRESS ) }
207+ editLabel = {
208+ isMultiShipping
209+ ? formatMessage ( {
210+ defaultMessage : 'Edit Shipping Addresses' ,
211+ id : 'toggle_card.action.editShippingAddresses'
212+ } )
213+ : formatMessage ( {
214+ defaultMessage : 'Edit Shipping Address' ,
215+ id : 'toggle_card.action.editShippingAddress'
216+ } )
217+ }
218+ editAction = {
219+ multishipEnabled
220+ ? isMultiShipping
221+ ? formatMessage ( shipToOneAddressLabel )
222+ : formatMessage ( deliverToMultipleAddressesLabel )
223+ : null
224+ }
225+ onEditActionClick = { multishipEnabled ? handleToggleShippingMode : null }
226+ >
227+ < ToggleCardEdit >
228+ { ! isMultiShipping ? (
229+ < ShippingAddressSelection
230+ selectedAddress = { selectedShippingAddress }
231+ submitButtonLabel = { submitButtonMessage }
232+ onSubmit = { submitAndContinue }
233+ formTitleAriaLabel = { shippingAddressAriaLabel }
234+ />
226235 ) : (
227- < AddressDisplay address = { selectedShippingAddress } />
236+ < ShippingMultiAddress
237+ basket = { basket }
238+ submitButtonLabel = { submitButtonMessage }
239+ noItemsInBasketMessage = { noItemsInBasketMessage }
240+ onUnsavedGuestAddressesToggleWarning = {
241+ handleUnsavedGuestAddressesToggleWarning
242+ }
243+ />
228244 ) }
229- </ ToggleCardSummary >
230- ) }
231- </ ToggleCard >
245+ </ ToggleCardEdit >
246+ { isAddressFilled && (
247+ < ToggleCardSummary >
248+ { hasMultipleDeliveryShipments ? (
249+ < Text >
250+ { formatMessage ( {
251+ defaultMessage :
252+ 'Your items will be shipped to multiple addresses.' ,
253+ id : 'shipping_address.summary.multiple_addresses'
254+ } ) }
255+ </ Text >
256+ ) : (
257+ < AddressDisplay address = { selectedShippingAddress } />
258+ ) }
259+ </ ToggleCardSummary >
260+ ) }
261+ </ ToggleCard >
262+
263+ < SingleAddressToggleModal
264+ isOpen = { showWarningModal }
265+ onClose = { closeWarningModal }
266+ onConfirm = { handleConfirmSwitchToSingle }
267+ onCancel = { handleCancelSwitch }
268+ />
269+ </ >
232270 )
233271}
0 commit comments