Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { useCallback, useEffect, useMemo, useState, useRef } from 'react';
import { useMutation, useQuery } from '@apollo/client';
import { useMutation, useQuery, useLazyQuery } from '@apollo/client';
import DEFAULT_OPERATIONS from './shippingInformation.gql';
import mergeOperations from '@magento/peregrine/lib/util/shallowMerge';

Expand Down Expand Up @@ -32,15 +32,19 @@ export const useShippingInformation = props => {
loading: getShippingInformationLoading
} = useQuery(getShippingInformationQuery, {
skip: !cartId,
variables: {
cartId
}
variables: { cartId }
});

const {
data: defaultShippingData,
loading: getDefaultShippingLoading
} = useQuery(getDefaultShippingQuery, { skip: !isSignedIn });
const [
fetchDefaultShipping,
{ data: defaultShippingData, loading: getDefaultShippingLoading }
] = useLazyQuery(getDefaultShippingQuery);

useEffect(() => {
if (isSignedIn) {
fetchDefaultShipping();
}
}, [isSignedIn, fetchDefaultShipping]);

const [
setDefaultAddressOnCart,
Expand All @@ -53,50 +57,39 @@ export const useShippingInformation = props => {
setDefaultAddressLoading;

const shippingData = useMemo(() => {
let filteredData;
if (shippingInformationData) {
const { cart } = shippingInformationData;
const { email, shipping_addresses: shippingAddresses } = cart;
if (shippingAddresses.length) {
const primaryAddress = { ...shippingAddresses[0] };
for (const field in MOCKED_ADDRESS) {
if (primaryAddress[field] === MOCKED_ADDRESS[field]) {
primaryAddress[field] = '';
}

if (
field === 'street' &&
primaryAddress[field][0] === MOCKED_ADDRESS[field][0]
) {
primaryAddress[field] = [''];
}
}
if (!shippingInformationData) return undefined;

const { cart } = shippingInformationData;
const { email, shipping_addresses: shippingAddresses } = cart;

if (!shippingAddresses.length) return undefined;

const primaryAddress = { ...shippingAddresses[0] };

for (const field in MOCKED_ADDRESS) {
if (primaryAddress[field] === MOCKED_ADDRESS[field]) {
primaryAddress[field] = '';
}

const {
region_id,
label: region,
code: region_code
} = primaryAddress.region;

primaryAddress.region = {
region_code,
region_id,
region
};

filteredData = {
email,
...primaryAddress
};
if (
field === 'street' &&
primaryAddress[field][0] === MOCKED_ADDRESS[field][0]
) {
primaryAddress[field] = [''];
}
}

return filteredData;
const regionData = primaryAddress.region || {};
const { region_id, label: region, code: region_code } = regionData;

primaryAddress.region = { region_code, region_id, region };

return {
email,
...primaryAddress
};
}, [shippingInformationData]);

// Simple heuristic to check shipping data existed prior to this render.
// On first submission, when we have data, we should tell the checkout page
// so that we set the next step correctly.
const doneEditing = !!shippingData && !!shippingData.city;
const [, { dispatch }] = useEventingContext();

Expand All @@ -108,41 +101,35 @@ export const useShippingInformation = props => {

useEffect(() => {
let updateTimer;
if (shippingData !== undefined) {

if (shippingData) {
if (hasLoadedData.current) {
setHasUpdate(true);
updateTimer = setTimeout(() => {
setHasUpdate(false);
}, 2000);
updateTimer = setTimeout(() => setHasUpdate(false), 2000);
} else {
hasLoadedData.current = true;
}
}

return () => {
if (updateTimer) {
clearTimeout(updateTimer);
}
};
}, [hasLoadedData, shippingData]);
return () => clearTimeout(updateTimer);
}, [shippingData]);

useEffect(() => {
const defaultAddressId =
defaultShippingData?.customer?.default_shipping;

if (
shippingInformationData &&
!doneEditing &&
cartId &&
defaultShippingData
defaultAddressId
) {
const { customer } = defaultShippingData;
const { default_shipping: defaultAddressId } = customer;
if (defaultAddressId) {
setDefaultAddressOnCart({
variables: {
cartId,
addressId: parseInt(defaultAddressId)
}
});
}
setDefaultAddressOnCart({
variables: {
cartId,
addressId: parseInt(defaultAddressId)
}
});
}
}, [
cartId,
Expand All @@ -164,9 +151,7 @@ export const useShippingInformation = props => {
if (doneEditing && hasUpdate) {
dispatch({
type: 'CHECKOUT_SHIPPING_INFORMATION_UPDATED',
payload: {
cart_id: cartId
}
payload: { cart_id: cartId }
});
}
}, [cartId, doneEditing, dispatch, hasUpdate]);
Expand Down