Skip to content

Commit 1df26fb

Browse files
author
Marcin Kwiatkowski
committed
refactor: refactored useAddresses (#743)
1 parent cec2d3c commit 1df26fb

File tree

7 files changed

+170
-25
lines changed

7 files changed

+170
-25
lines changed

packages/composables/src/composables/useAddresses/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ type RemoveAddressInput = {
2525
}
2626
} & CustomQueryParams;
2727

28+
/**
29+
* @deprecated since version 1.0.0
30+
*/
2831
const factoryParams: UseAddressesParams<CustomerAddress,
2932
CustomQueryParams,
3033
SaveAddressInput,

packages/composables/src/factories/useAddressesFactory.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ export interface UseAddressesParams<ADDRESS,
2424
remove: (context: Context, params: ComposableFunctionArgs<REMOVE_ADDRESS_PARAMS>) => Promise<boolean>;
2525
}
2626

27+
/**
28+
* @deprecated since version 1.0.0
29+
*/
2730
export const useAddressesFactory = <ADDRESS,
2831
LOAD_ADDRESS_PARAMS extends { customQuery?: CustomQuery },
2932
SAVE_ADDRESS_PARAMS extends { customQuery?: CustomQuery },

packages/theme/components/MyAccount/AddressForm.vue

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -194,8 +194,6 @@ import {
194194
SfCheckbox,
195195
} from '@storefront-ui/vue';
196196
import {
197-
addressGetter,
198-
useAddresses,
199197
useCountrySearch,
200198
} from '@vue-storefront/magento';
201199
import { required, min, oneOf } from 'vee-validate/dist/rules';
@@ -211,6 +209,7 @@ import {
211209
defineComponent,
212210
} from '@nuxtjs/composition-api';
213211
import omitDeep from 'omit-deep';
212+
import { addressGetter } from '~/getters';
214213
215214
extend('required', {
216215
...required,
@@ -274,10 +273,6 @@ export default defineComponent({
274273
country,
275274
} = useCountrySearch('my-account-shipping');
276275
277-
const {
278-
load,
279-
} = useAddresses();
280-
281276
const form = reactive({
282277
apartment: props.address.apartment,
283278
city: props.address.city,
@@ -292,8 +287,8 @@ export default defineComponent({
292287
},
293288
street: props.address.street,
294289
telephone: props.address.telephone,
295-
default_shipping: props.address.default_shipping,
296-
default_billing: props.address.default_billing,
290+
default_shipping: props.address.default_shipping || false,
291+
default_billing: props.address.default_billing || false,
297292
...(props.isNew ? {} : { id: props.address.id }),
298293
});
299294
// @ts-ignore
@@ -308,9 +303,6 @@ export default defineComponent({
308303
309304
emit('submit', {
310305
form: omitDeep(form, ['__typename']),
311-
onComplete: async () => {
312-
await load();
313-
},
314306
// TODO: Handle Error
315307
onError: () => {},
316308
});

packages/theme/composables/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,4 @@ export { default as useShippingProvider } from './useShippingProvider';
2222
export { default as useBilling } from './useBilling';
2323
export { default as useRelatedProducts } from './useRelatedProducts';
2424
export { default as usePaymentProvider } from './usePaymentProvider';
25+
export { default as useAddresses } from './useAddresses';
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
import { Ref, ref, useContext } from '@nuxtjs/composition-api';
2+
import { Logger } from '@vue-storefront/core';
3+
import { transformUserCreateAddressInput, transformUserUpdateAddressInput } from '@vue-storefront/magento';
4+
import { ComposableFunctionArgs } from '~/composables/types';
5+
import { UseAddressesInterface, UseAddressesParamsInput, UseAddressesErrors } from '~/composables/useAddresses/useAddresses';
6+
7+
export const useAddresses = () : UseAddressesInterface => {
8+
const error: Ref<UseAddressesErrors> = ref({
9+
load: null,
10+
save: null,
11+
remove: null,
12+
update: null,
13+
});
14+
const loading: Ref<boolean> = ref(false);
15+
const { app } = useContext();
16+
const context = app.$vsf;
17+
18+
const load = async () => {
19+
Logger.debug('[Magento] load user addresses');
20+
let results = null;
21+
22+
try {
23+
loading.value = true;
24+
const { data } = await context.$magento.api.getCustomerAddresses();
25+
results = data?.customer?.addresses ?? [];
26+
Logger.debug('[Magento] load user addresses results:', results);
27+
error.value.load = null;
28+
} catch (err) {
29+
error.value.load = err;
30+
Logger.error('Magento] load user addresses error', err);
31+
} finally {
32+
loading.value = false;
33+
}
34+
35+
return results;
36+
};
37+
38+
const save = async (saveParams: ComposableFunctionArgs<UseAddressesParamsInput>) => {
39+
Logger.debug('[Magento] save user address:', saveParams.address);
40+
let results = null;
41+
42+
try {
43+
loading.value = true;
44+
const { data } = await context.$magento.api.createCustomerAddress(
45+
transformUserCreateAddressInput(saveParams),
46+
);
47+
results = data?.createCustomerAddress ?? {};
48+
Logger.debug('[Magento] save user address results:', saveParams.address);
49+
error.value.save = null;
50+
} catch (err) {
51+
error.value.save = err;
52+
Logger.error('[Magento] save user address error:', err);
53+
} finally {
54+
loading.value = false;
55+
}
56+
57+
return results;
58+
};
59+
60+
const update = async (updateParams: ComposableFunctionArgs<UseAddressesParamsInput>) => {
61+
Logger.debug('[Magento] update user address:', updateParams.address);
62+
let results = null;
63+
64+
try {
65+
loading.value = true;
66+
const { data } = await context.$magento.api.updateCustomerAddress(
67+
transformUserUpdateAddressInput(updateParams),
68+
);
69+
results = data?.updateCustomerAddress ?? {};
70+
Logger.debug('[Magento] update user address results:', results);
71+
error.value.update = null;
72+
} catch (err) {
73+
error.value.update = err;
74+
Logger.error('[Magento] update user address error:', err);
75+
} finally {
76+
loading.value = false;
77+
}
78+
79+
return results;
80+
};
81+
82+
const remove = async (removeParams: ComposableFunctionArgs<UseAddressesParamsInput>) => {
83+
Logger.debug('[Magento] remove user address:', removeParams.address);
84+
let results = null;
85+
86+
try {
87+
loading.value = true;
88+
const { data } = await context.$magento.api.deleteCustomerAddress(
89+
removeParams.address.id,
90+
);
91+
results = !!data.deleteCustomerAddress;
92+
Logger.debug('[Magento] remove user address results:', results);
93+
error.value.remove = null;
94+
} catch (err) {
95+
error.value.remove = err;
96+
Logger.error('[Magento] remove user address error:', err);
97+
} finally {
98+
loading.value = false;
99+
}
100+
101+
return results;
102+
};
103+
104+
return {
105+
error,
106+
loading,
107+
load,
108+
save,
109+
update,
110+
remove,
111+
};
112+
};
113+
114+
export default useAddresses;
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { Ref } from '@nuxtjs/composition-api';
2+
import { ComposableFunctionArgs } from '@vue-storefront/core';
3+
// eslint-disable-next-line import/no-extraneous-dependencies
4+
import { CustomerAddress } from '@vue-storefront/magento-api';
5+
6+
export type UseAddressesErrors = {
7+
load: Error;
8+
save: Error;
9+
remove: Error;
10+
update: Error;
11+
};
12+
13+
export type UseAddressesParamsInput = {
14+
address: CustomerAddress
15+
};
16+
17+
export interface UseAddressesInterface {
18+
error: Ref<UseAddressesErrors>,
19+
loading: Ref<boolean>,
20+
load: () => Promise<Array<CustomerAddress>>,
21+
save: (saveParams: ComposableFunctionArgs<UseAddressesParamsInput>) => Promise<CustomerAddress>,
22+
update: (updateParams?: ComposableFunctionArgs<UseAddressesParamsInput>) => Promise<CustomerAddress>,
23+
remove: (removeParams?: ComposableFunctionArgs<UseAddressesParamsInput>) => Promise<boolean>,
24+
}

packages/theme/pages/MyAccount/AddressesDetails.vue

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
<AddressForm
1717
:address="activeAddress"
1818
:is-new="isNewAddress"
19+
v-if="activeAddress && activeAddress.id || isNewAddress"
1920
@submit="saveAddress"
2021
/>
2122
</SfTab>
@@ -82,16 +83,17 @@
8283
</template>
8384
<script>
8485
import { SfTabs, SfButton } from '@storefront-ui/vue';
85-
import { useAddresses } from '@vue-storefront/magento';
86-
import { userAddressesGetters } from '~/getters';
8786
import {
8887
computed,
8988
defineComponent,
9089
useRouter,
9190
useRoute,
9291
useContext,
92+
ref,
93+
useFetch,
9394
} from '@nuxtjs/composition-api';
94-
import { onSSR } from '@vue-storefront/core';
95+
import { useAddresses } from '~/composables';
96+
import { userAddressesGetters } from '~/getters';
9597
import AddressForm from '~/components/MyAccount/AddressForm.vue';
9698
import SvgImage from '~/components/General/SvgImage.vue';
9799
import UserAddressDetails from '~/components/UserAddressDetails.vue';
@@ -107,22 +109,20 @@ export default defineComponent({
107109
},
108110
setup() {
109111
const {
110-
addresses, load, remove, update, save,
112+
load, remove, update, save,
111113
} = useAddresses();
112114
113-
const userAddresses = computed(() => userAddressesGetters.getAddresses(addresses.value));
114115
const router = useRouter();
115116
const route = useRoute();
116117
const { app } = useContext();
117-
const activeAddress = computed(() => userAddresses.value
118-
.filter((address) => String(address?.id) === route.value.query.id)
119-
.pop());
120-
118+
const userAddresses = ref([]);
119+
const activeAddress = ref({});
121120
const getTranslatedUrlAddress = (title) => app.i18n.t(`${title}`).toLowerCase().replace(' ', '-');
122-
const isNewAddress = computed(() => !activeAddress.value);
121+
const isNewAddress = computed(() => route.value.query.id === 'new');
123122
const editingAddress = computed(() => !!route.value.query.id);
124123
const changeAddress = async (address) => {
125124
const addressId = address?.id || 'new';
125+
126126
await router.push(
127127
`${app.localePath({
128128
path: `/my-account/${getTranslatedUrlAddress('Addresses details')}`,
@@ -139,23 +139,31 @@ export default defineComponent({
139139
}
140140
};
141141
142-
const saveAddress = async ({ form, onComplete, onError }) => {
142+
const saveAddress = async ({ form, onError }) => {
143143
try {
144144
const actionMethod = isNewAddress.value ? save : update;
145145
const data = await actionMethod({ address: form });
146-
await onComplete(data);
147146
await router.push(
148147
app.localePath(
149148
`/my-account/${getTranslatedUrlAddress('Addresses details')}`,
150149
),
151150
);
151+
addresses.value = data;
152+
userAddresses.value = userAddressesGetters.getAddresses(data);
152153
} catch (error) {
153154
onError(error);
154155
}
155156
};
156157
157-
onSSR(async () => {
158-
await load({});
158+
useFetch(async () => {
159+
const addressesData = await load();
160+
userAddresses.value = userAddressesGetters.getAddresses(addressesData);
161+
162+
const activeAddressData = userAddresses.value
163+
.filter((address) => String(address?.id) === route.value.query.id)
164+
.pop();
165+
166+
activeAddress.value = activeAddressData;
159167
});
160168
161169
return {

0 commit comments

Comments
 (0)