Skip to content

Commit 430e4ec

Browse files
refactor(composable): refactor useUserShipping (#751)
- move useUserShipping to the theme - mark useUserShipping in composable package as deprecated
1 parent c7905e6 commit 430e4ec

File tree

12 files changed

+241
-35
lines changed

12 files changed

+241
-35
lines changed

packages/composables/src/composables/useUserShipping/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
/**
2+
* @deprecated since version 1.0.0
3+
*/
14
import {
25
Context,
36
Logger,

packages/theme/components/Checkout/UserShippingAddresses.vue

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@
2828

2929
<script>
3030
import { SfCheckbox, SfAddressPicker } from '@storefront-ui/vue';
31-
import { useUserShipping } from '@vue-storefront/magento';
31+
import { defineComponent } from '@nuxtjs/composition-api';
32+
3233
import { userShippingGetters } from '~/getters';
33-
import { computed, defineComponent } from '@nuxtjs/composition-api';
3434
import UserAddressDetails from '~/components/UserAddressDetails.vue';
3535
3636
export default defineComponent({
@@ -49,29 +49,24 @@ export default defineComponent({
4949
type: Boolean,
5050
required: true,
5151
},
52+
shippingAddresses: {
53+
type: Array,
54+
required: true,
55+
},
5256
},
5357
emits: ['setCurrentAddress'],
54-
setup(props, { emit }) {
55-
const { shipping: userShipping } = useUserShipping();
56-
58+
setup({ shippingAddresses }, { emit }) {
5759
const setCurrentAddress = (addressId) => {
58-
const selectedAddress = userShippingGetters.getAddresses(
59-
userShipping.value,
60-
{ id: Number.parseInt(addressId, 10) },
61-
);
62-
60+
const selectedAddress = shippingAddresses.find((address) => address.id === Number(addressId));
6361
if (!selectedAddress) {
6462
return;
6563
}
6664
67-
emit('setCurrentAddress', selectedAddress[0]);
65+
emit('setCurrentAddress', selectedAddress);
6866
};
6967
70-
const shippingAddresses = computed(() => userShippingGetters.getAddresses(userShipping.value));
71-
7268
return {
7369
setCurrentAddress,
74-
shippingAddresses,
7570
userShippingGetters,
7671
};
7772
},

packages/theme/composables/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,4 @@ export { default as usePaymentProvider } from './usePaymentProvider';
2626
export { default as useAddresses } from './useAddresses';
2727
export { default as useMakeOrder } from './useMakeOrder';
2828
export { default as useUserOrder } from './useUserOrder';
29+
export { default as useUserShipping } from './useUserShipping';

packages/theme/composables/useUser/index.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,6 @@ export const useUser = (): UseUser => {
9595

9696
try {
9797
loading.value = true;
98-
// user.value = await _factoryParams.load({customQuery});
99-
10098
const apiState = app.context.$vsf.$magento.config.state;
10199

102100
if (!apiState.getCustomerToken()) {
@@ -108,8 +106,6 @@ export const useUser = (): UseUser => {
108106
Logger.debug('[Result]:', { data });
109107

110108
customerStore.user = data?.customer ?? {};
111-
112-
return customerStore.user;
113109
} catch {
114110
// eslint-disable-next-line no-void
115111
// @ts-ignore
@@ -122,6 +118,8 @@ export const useUser = (): UseUser => {
122118
} finally {
123119
loading.value = false;
124120
}
121+
122+
return customerStore.user;
125123
};
126124

127125
// eslint-disable-next-line @typescript-eslint/require-await,no-empty-pattern
@@ -178,14 +176,14 @@ export const useUser = (): UseUser => {
178176

179177
error.value.login = null;
180178
customerStore.user = load();
181-
182-
return customerStore.user;
183179
} catch (err) {
184180
error.value.login = err;
185181
Logger.error('useUser/login', err);
186182
} finally {
187183
loading.value = false;
188184
}
185+
186+
return customerStore.user;
189187
};
190188

191189
// eslint-disable-next-line consistent-return

packages/theme/composables/useUser/useUser.d.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export interface UseUserErrors {
1111
}
1212

1313
export interface Customer {
14+
id: string
1415
email: string
1516
firstname: string
1617
password: string
@@ -52,6 +53,6 @@ export type UseUser = {
5253
}>
5354
) => Promise<void>
5455
load: (
55-
params: ComposableFunctionArgs<{}>
56+
params?: ComposableFunctionArgs<{}>
5657
) => Promise<Customer>
5758
};
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { CustomerAddressInput } from '~/modules/GraphQL/types';
2+
3+
export const createCustomerAddressCommand = {
4+
execute: async (context, params: CustomerAddressInput) => {
5+
const { data } = await context.$vsf.$magento.api.createCustomerAddress(params);
6+
7+
return data?.createCustomerAddress ?? {};
8+
},
9+
};
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { CustomerAddress } from '~/modules/GraphQL/types';
2+
3+
export const deleteCustomerAddressCommand = {
4+
execute: async (context, address: CustomerAddress) => {
5+
const { data } = await context.$vsf.$magento.api.deleteCustomerAddress(address.id);
6+
7+
return data?.deleteCustomerAddress ?? {};
8+
},
9+
};
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { CustomerAddressInput } from '~/modules/GraphQL/types';
2+
3+
export const updateCustomerAddressCommand = {
4+
execute: async (context, params: {
5+
addressId: number;
6+
input: CustomerAddressInput;
7+
}) => {
8+
const { data } = await context.$vsf.$magento.api.updateCustomerAddress(params);
9+
10+
return data?.updateCustomerAddress ?? {};
11+
},
12+
};
Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
import { Ref, ref, useContext } from '@nuxtjs/composition-api';
2+
import { Logger } from '@vue-storefront/core';
3+
import { UseUserShippingErrors } from '~/composables/useUserShipping/useUserShipping';
4+
import { useUser } from '~/composables';
5+
import { transformUserCreateAddressInput, transformUserUpdateAddressInput } from '~/helpers/userAddressManipulator';
6+
import { createCustomerAddressCommand } from '~/composables/useUserShipping/commands/createCustomerAddressCommand';
7+
import { deleteCustomerAddressCommand } from '~/composables/useUserShipping/commands/deleteCustomerAddressCommand';
8+
import { updateCustomerAddressCommand } from '~/composables/useUserShipping/commands/updateCustomerAddressCommand';
9+
import { CustomerAddress } from '~/modules/GraphQL/types';
10+
import mask from '../utils/mask';
11+
12+
export const useUserShipping = () => {
13+
const loading = ref(false);
14+
const shipping = ref({});
15+
const error: Ref<UseUserShippingErrors> = ref({
16+
addAddress: null,
17+
deleteAddress: null,
18+
updateAddress: null,
19+
load: null,
20+
setDefaultAddress: null,
21+
});
22+
const { user, load: loadUser } = useUser();
23+
const context = useContext();
24+
25+
const addAddress = async ({ address, customQuery }: { address: CustomerAddress, customQuery: any }) => {
26+
Logger.debug('useUserShipping.addAddress', mask(address));
27+
let result = {};
28+
try {
29+
loading.value = true;
30+
const customerAddressInput = transformUserCreateAddressInput({
31+
address,
32+
shipping: shipping.value,
33+
customQuery,
34+
});
35+
result = await createCustomerAddressCommand.execute(context, customerAddressInput);
36+
error.value.addAddress = null;
37+
} catch (err) {
38+
error.value.addAddress = err;
39+
Logger.error('useUserShipping/addAddress', err);
40+
} finally {
41+
loading.value = false;
42+
}
43+
44+
Logger.debug('[Result]:', { result: mask(result) });
45+
46+
return result;
47+
};
48+
49+
const deleteAddress = async (address: CustomerAddress) => {
50+
Logger.debug('useUserShipping.deleteAddress', address);
51+
let result = {};
52+
53+
try {
54+
loading.value = true;
55+
result = await deleteCustomerAddressCommand.execute(context, address);
56+
error.value.deleteAddress = null;
57+
} catch (err) {
58+
error.value.deleteAddress = err;
59+
Logger.error('useUserShipping/deleteAddress', err);
60+
} finally {
61+
loading.value = false;
62+
}
63+
64+
Logger.debug('[Result]:', { result: mask(result) });
65+
66+
return result;
67+
};
68+
69+
const updateAddress = async ({ address, customQuery }: { address: CustomerAddress, customQuery: any }) => {
70+
Logger.debug('useUserShipping.updateAddress', mask(address));
71+
let result = {};
72+
73+
try {
74+
loading.value = true;
75+
const customerAddressInput = transformUserUpdateAddressInput({
76+
address,
77+
shipping: shipping.value,
78+
customQuery,
79+
});
80+
result = await updateCustomerAddressCommand.execute(context, customerAddressInput);
81+
error.value.updateAddress = null;
82+
} catch (err) {
83+
error.value.updateAddress = err;
84+
Logger.error('useUserShipping/updateAddress', err);
85+
} finally {
86+
loading.value = false;
87+
}
88+
89+
Logger.debug('[Result]:', { result: mask(result) });
90+
91+
return result;
92+
};
93+
94+
const load = async (force: false) => {
95+
Logger.debug('useUserShipping.load');
96+
97+
try {
98+
loading.value = true;
99+
if (force || !user?.value?.id) {
100+
await loadUser();
101+
}
102+
} catch (err) {
103+
error.value.load = err;
104+
Logger.error('useUserShipping/load', err);
105+
} finally {
106+
loading.value = false;
107+
}
108+
109+
return user?.value;
110+
};
111+
112+
const setDefaultAddress = async ({ address, customQuery }: { address: CustomerAddress, customQuery: any }) => {
113+
Logger.debug('useUserShipping.setDefaultAddress', mask(address));
114+
let result = {};
115+
116+
try {
117+
loading.value = true;
118+
const updateAddressInput = transformUserUpdateAddressInput({
119+
address,
120+
shipping: shipping.value,
121+
customQuery,
122+
});
123+
124+
result = await updateCustomerAddressCommand.execute(context, updateAddressInput);
125+
error.value.setDefaultAddress = null;
126+
} catch (err) {
127+
error.value.setDefaultAddress = err;
128+
Logger.error('useUserShipping/setDefaultAddress', err);
129+
} finally {
130+
loading.value = false;
131+
}
132+
133+
Logger.debug('[Result]:', { result: mask(result) });
134+
135+
return result;
136+
};
137+
138+
return {
139+
loading,
140+
error,
141+
addAddress,
142+
deleteAddress,
143+
updateAddress,
144+
load,
145+
setDefaultAddress,
146+
};
147+
};
148+
149+
export default useUserShipping;
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export interface UseUserShippingErrors {
2+
addAddress: Error;
3+
deleteAddress: Error;
4+
updateAddress: Error;
5+
load: Error;
6+
setDefaultAddress: Error;
7+
}

0 commit comments

Comments
 (0)