PluginProbe
Packeta / 2.0.9
Packeta v2.0.9
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 2.0.9, at src/PacketaWidget/useView.js

198 lines 5.4 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 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