| 1 |
import { useEffect, useState, useRef } from 'react'; |
| 2 |
|
| 3 |
import { useSelect } from '@wordpress/data'; |
| 4 |
import { getSetting } from '@woocommerce/settings'; |
| 5 |
|
| 6 |
import { usePacketaShippingRate } from "./usePacketaShippingRate"; |
| 7 |
import { useDynamicSettings } from "./useDynamicSettings"; |
| 8 |
import { useOnWidgetButtonClicked } from "./useOnWidgetButtonClicked"; |
| 9 |
import { useOnHDWidgetButtonClicked } from "./useOnHDWidgetButtonClicked"; |
| 10 |
import { getShippingMethodOptionId } from "./getShippingMethodOptionId"; |
| 11 |
|
| 12 |
const { PAYMENT_STORE_KEY } = window.wc.wcBlocksData; |
| 13 |
|
| 14 |
export const useView = ( cart ) => { |
| 15 |
const [ viewState, setViewState ] = useState( null ); |
| 16 |
const { shippingRates, shippingAddress, cartItemsWeight } = cart; |
| 17 |
const paymentStore = useSelect( ( select ) => { |
| 18 |
return select( PAYMENT_STORE_KEY ); |
| 19 |
}, [] ); |
| 20 |
|
| 21 |
const settings = getSetting( 'packeta-widget_data' ); |
| 22 |
const { |
| 23 |
carrierConfig, |
| 24 |
translations, |
| 25 |
logo, |
| 26 |
widgetAutoOpen, |
| 27 |
adminAjaxUrl, |
| 28 |
} = settings; |
| 29 |
|
| 30 |
const filteredShippingRates = usePacketaShippingRate( |
| 31 |
shippingRates, |
| 32 |
carrierConfig |
| 33 |
); |
| 34 |
const { |
| 35 |
packetaPickupPointShippingRate = null, |
| 36 |
packetaHomeDeliveryShippingRate = null, |
| 37 |
chosenShippingRate = null, |
| 38 |
} = filteredShippingRates || {}; |
| 39 |
|
| 40 |
const previousRateIdRef = useRef(); |
| 41 |
useEffect( () => { |
| 42 |
const previousRateId = previousRateIdRef.current; |
| 43 |
|
| 44 |
if ( |
| 45 |
previousRateId !== undefined && |
| 46 |
previousRateId !== chosenShippingRate?.rate_id |
| 47 |
) { |
| 48 |
setViewState( null ); |
| 49 |
} |
| 50 |
|
| 51 |
previousRateIdRef.current = chosenShippingRate?.rate_id; |
| 52 |
}, [ chosenShippingRate, setViewState ] ); |
| 53 |
|
| 54 |
const [ dynamicSettings, setDynamicSettings, loading ] = useDynamicSettings( adminAjaxUrl ); |
| 55 |
|
| 56 |
useEffect( () => { |
| 57 |
if ( ! dynamicSettings ) { |
| 58 |
return; |
| 59 |
} |
| 60 |
|
| 61 |
const activePaymentMethod = paymentStore.getActivePaymentMethod(); |
| 62 |
const rateId = chosenShippingRate?.rate_id || null; |
| 63 |
|
| 64 |
let shippingSaved = false; |
| 65 |
let paymentSaved = false; |
| 66 |
if ( |
| 67 |
( ! dynamicSettings.shippingSaved && rateId ) || |
| 68 |
( ! dynamicSettings.paymentSaved && activePaymentMethod !== '' ) |
| 69 |
) { |
| 70 |
if ( rateId ) { |
| 71 |
shippingSaved = true; |
| 72 |
} |
| 73 |
if ( activePaymentMethod !== '' ) { |
| 74 |
paymentSaved = true; |
| 75 |
} |
| 76 |
|
| 77 |
wp.hooks.doAction( 'packetery_save_shipping_and_payment_methods', rateId, activePaymentMethod ); |
| 78 |
|
| 79 |
setDynamicSettings( { |
| 80 |
...dynamicSettings, |
| 81 |
shippingSaved, |
| 82 |
paymentSaved, |
| 83 |
} ); |
| 84 |
} |
| 85 |
}, [ paymentStore, chosenShippingRate, dynamicSettings, setDynamicSettings, wp ] ); |
| 86 |
|
| 87 |
useEffect( () => { |
| 88 |
if ( ! dynamicSettings ) { |
| 89 |
return; |
| 90 |
} |
| 91 |
|
| 92 |
const shippingCountry = shippingAddress.country.toLowerCase(); |
| 93 |
|
| 94 |
if ( ! dynamicSettings.lastCountry ) { |
| 95 |
setDynamicSettings( { |
| 96 |
...dynamicSettings, |
| 97 |
lastCountry: shippingCountry, |
| 98 |
} ); |
| 99 |
} else if ( dynamicSettings.lastCountry !== shippingCountry ) { |
| 100 |
if ( viewState ) { |
| 101 |
setViewState( null ); |
| 102 |
} |
| 103 |
setDynamicSettings( { |
| 104 |
...dynamicSettings, |
| 105 |
lastCountry: shippingCountry, |
| 106 |
} ); |
| 107 |
} |
| 108 |
}, [ dynamicSettings, setDynamicSettings, viewState, setViewState, shippingAddress ] ); |
| 109 |
|
| 110 |
const onWidgetButtonClicked = useOnWidgetButtonClicked( |
| 111 |
packetaPickupPointShippingRate, |
| 112 |
settings, |
| 113 |
dynamicSettings, |
| 114 |
setViewState, |
| 115 |
shippingAddress, |
| 116 |
cartItemsWeight, |
| 117 |
); |
| 118 |
|
| 119 |
const onHDWidgetButtonClicked = useOnHDWidgetButtonClicked( |
| 120 |
packetaHomeDeliveryShippingRate, |
| 121 |
settings, |
| 122 |
dynamicSettings, |
| 123 |
setViewState, |
| 124 |
shippingAddress, |
| 125 |
); |
| 126 |
|
| 127 |
useEffect( () => { |
| 128 |
if ( |
| 129 |
packetaPickupPointShippingRate && |
| 130 |
dynamicSettings && |
| 131 |
! viewState && |
| 132 |
widgetAutoOpen |
| 133 |
) { |
| 134 |
onWidgetButtonClicked(); |
| 135 |
} |
| 136 |
}, [ packetaPickupPointShippingRate, widgetAutoOpen, onWidgetButtonClicked ] ); |
| 137 |
|
| 138 |
const getPickupPointErrorMessage = function ( viewState ) { |
| 139 |
if ( viewState && viewState.pickupPoint ) { |
| 140 |
return null; |
| 141 |
} else { |
| 142 |
return translations.pickupPointNotChosen; |
| 143 |
} |
| 144 |
}; |
| 145 |
|
| 146 |
const getHomeDeliveryErrorMessage = function ( viewState, addressValidationSetting ) { |
| 147 |
if ( addressValidationSetting === 'optional' || ( viewState && viewState.deliveryAddressInfo ) ) { |
| 148 |
return null; |
| 149 |
} else if ( viewState && viewState.deliveryAddressError ) { |
| 150 |
return viewState.deliveryAddressError; |
| 151 |
} else { |
| 152 |
return translations.addressIsNotValidatedAndRequiredByCarrier; |
| 153 |
} |
| 154 |
}; |
| 155 |
|
| 156 |
let skipView = false; |
| 157 |
let inputRequired = true; |
| 158 |
|
| 159 |
if ( packetaPickupPointShippingRate ) { |
| 160 |
return { |
| 161 |
buttonCallback: onWidgetButtonClicked, |
| 162 |
buttonLabel: translations.choosePickupPoint, |
| 163 |
buttonInfo: viewState && viewState.pickupPoint && viewState.pickupPoint.name, |
| 164 |
inputValue: viewState && viewState.pickupPoint ? viewState.pickupPoint.name : '', |
| 165 |
inputRequired, |
| 166 |
errorMessage: getPickupPointErrorMessage( viewState ), |
| 167 |
logo, |
| 168 |
translations, |
| 169 |
loading, |
| 170 |
}; |
| 171 |
} |
| 172 |
|
| 173 |
if ( packetaHomeDeliveryShippingRate ) { |
| 174 |
const rateId = getShippingMethodOptionId( packetaHomeDeliveryShippingRate.rate_id ); |
| 175 |
const rateCarrierConfig = carrierConfig[ rateId ]; |
| 176 |
const addressValidationSetting = rateCarrierConfig.address_validation || 'none'; |
| 177 |
if ( addressValidationSetting === 'none' ) { |
| 178 |
return null; |
| 179 |
} else if ( addressValidationSetting === 'optional' ) { |
| 180 |
inputRequired = false; |
| 181 |
} |
| 182 |
|
| 183 |
return { |
| 184 |
buttonCallback: onHDWidgetButtonClicked, |
| 185 |
buttonLabel: translations.chooseAddress, |
| 186 |
buttonInfo: viewState && viewState.deliveryAddressInfo, |
| 187 |
inputValue: viewState && viewState.deliveryAddressInfo ? viewState.deliveryAddressInfo : '', |
| 188 |
inputRequired, |
| 189 |
errorMessage: getHomeDeliveryErrorMessage( viewState, addressValidationSetting ), |
| 190 |
logo, |
| 191 |
translations, |
| 192 |
loading, |
| 193 |
}; |
| 194 |
} |
| 195 |
|
| 196 |
return null; |
| 197 |
}; |
| 198 |
|