PluginProbe
Packeta / trunk
Packeta vtrunk
2.3.2 2.3.1 trunk 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 1.3.0 1.3.1 1.3.2 1.4 1.4.1 1.4.2 1.4.3 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 All 56 releases
packeta / src / PacketaWidget / useView.js

useView.js in Packeta trunk, at src/PacketaWidget/useView.js

209 lines 5.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
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 showLogo,
26 logo,
27 widgetAutoOpen,
28 adminAjaxUrl,
29 } = settings;
30
31 const filteredShippingRates = usePacketaShippingRate(
32 shippingRates,
33 carrierConfig
34 );
35 const {
36 packetaPickupPointShippingRate = null,
37 packetaHomeDeliveryShippingRate = null,
38 chosenShippingRate = null,
39 } = filteredShippingRates || {};
40
41 const previousRateIdRef = useRef();
42 useEffect( () => {
43 const previousRateId = previousRateIdRef.current;
44
45 if (
46 previousRateId !== undefined &&
47 previousRateId !== chosenShippingRate?.rate_id
48 ) {
49 setViewState( null );
50 }
51
52 previousRateIdRef.current = chosenShippingRate?.rate_id;
53 }, [ chosenShippingRate, setViewState ] );
54
55 const [ dynamicSettings, setDynamicSettings, loading ] = useDynamicSettings( adminAjaxUrl );
56
57 useEffect( () => {
58 if ( ! dynamicSettings ) {
59 return;
60 }
61
62 const activePaymentMethod = paymentStore.getActivePaymentMethod();
63 const rateId = chosenShippingRate?.rate_id || null;
64
65 let shippingSaved = false;
66 let paymentSaved = false;
67 if (
68 ( ! dynamicSettings.shippingSaved && rateId ) ||
69 ( ! dynamicSettings.paymentSaved && activePaymentMethod !== '' )
70 ) {
71 if ( rateId ) {
72 shippingSaved = true;
73 }
74 if ( activePaymentMethod !== '' ) {
75 paymentSaved = true;
76 }
77
78 wp.hooks.doAction( 'packetery_save_shipping_and_payment_methods', rateId, activePaymentMethod );
79
80 setDynamicSettings( {
81 ...dynamicSettings,
82 shippingSaved,
83 paymentSaved,
84 } );
85 }
86 }, [ paymentStore, chosenShippingRate, dynamicSettings, setDynamicSettings, wp ] );
87
88 useEffect( () => {
89 if ( ! dynamicSettings ) {
90 return;
91 }
92
93 const shippingCountry = shippingAddress.country.toLowerCase();
94
95 if ( ! dynamicSettings.lastCountry ) {
96 setDynamicSettings( {
97 ...dynamicSettings,
98 lastCountry: shippingCountry,
99 } );
100 } else if ( dynamicSettings.lastCountry !== shippingCountry ) {
101 if ( viewState ) {
102 setViewState( null );
103 }
104 setDynamicSettings( {
105 ...dynamicSettings,
106 lastCountry: shippingCountry,
107 } );
108 }
109 }, [ dynamicSettings, setDynamicSettings, viewState, setViewState, shippingAddress ] );
110
111 const onWidgetButtonClicked = useOnWidgetButtonClicked(
112 packetaPickupPointShippingRate,
113 settings,
114 dynamicSettings,
115 setViewState,
116 shippingAddress,
117 cartItemsWeight,
118 );
119
120 const onHDWidgetButtonClicked = useOnHDWidgetButtonClicked(
121 packetaHomeDeliveryShippingRate,
122 settings,
123 dynamicSettings,
124 setViewState,
125 shippingAddress,
126 );
127
128 useEffect( () => {
129 if (
130 packetaPickupPointShippingRate &&
131 dynamicSettings &&
132 ! viewState &&
133 widgetAutoOpen
134 ) {
135 onWidgetButtonClicked();
136 }
137 }, [ packetaPickupPointShippingRate, widgetAutoOpen, onWidgetButtonClicked ] );
138
139 const getPickupPointErrorMessage = function ( viewState ) {
140 if ( viewState && viewState.pickupPoint ) {
141 return null;
142 } else {
143 return translations.pickupPointNotChosen;
144 }
145 };
146
147 const getHomeDeliveryErrorMessage = function ( viewState, addressValidationSetting ) {
148 if ( addressValidationSetting === 'optional' || ( viewState && viewState.deliveryAddressInfo ) ) {
149 return null;
150 } else if ( viewState && viewState.deliveryAddressError ) {
151 return viewState.deliveryAddressError;
152 } else {
153 return translations.addressIsNotValidatedAndRequiredByCarrier;
154 }
155 };
156
157 let skipView = false;
158 let inputRequired = true;
159
160 if ( packetaPickupPointShippingRate ) {
161 const buttonPlace =
162 viewState && viewState.pickupPoint.pickupPointType === 'internal' ? viewState.pickupPoint.place : '';
163
164 const buttonInfo = viewState && viewState.pickupPoint
165 ? [viewState.pickupPoint.street, `${viewState.pickupPoint.city} ${viewState.pickupPoint.zip}`].filter(Boolean).join(', ')
166 : '';
167
168 return {
169 buttonCallback: onWidgetButtonClicked,
170 buttonLabel: translations.choosePickupPoint,
171 buttonPlace: buttonPlace,
172 buttonInfo: buttonInfo,
173 inputValue: viewState && viewState.pickupPoint ? viewState.pickupPoint.name : '',
174 inputRequired,
175 errorMessage: getPickupPointErrorMessage( viewState ),
176 showLogo,
177 logo,
178 translations,
179 loading,
180 };
181 }
182
183 if ( packetaHomeDeliveryShippingRate ) {
184 const rateId = getShippingMethodOptionId( packetaHomeDeliveryShippingRate.rate_id );
185 const rateCarrierConfig = carrierConfig[ rateId ];
186 const addressValidationSetting = rateCarrierConfig.address_validation || 'none';
187 if ( addressValidationSetting === 'none' ) {
188 return null;
189 } else if ( addressValidationSetting === 'optional' ) {
190 inputRequired = false;
191 }
192
193 return {
194 buttonCallback: onHDWidgetButtonClicked,
195 buttonLabel: translations.chooseAddress,
196 buttonInfo: viewState && viewState.deliveryAddressInfo,
197 inputValue: viewState && viewState.deliveryAddressInfo ? viewState.deliveryAddressInfo : '',
198 inputRequired,
199 errorMessage: getHomeDeliveryErrorMessage( viewState, addressValidationSetting ),
200 showLogo,
201 logo,
202 translations,
203 loading,
204 };
205 }
206
207 return null;
208 };
209