Skip to content

Commit

Permalink
fix: addresses (#463)
Browse files Browse the repository at this point in the history
* fix: addresses

* refactor: address default logic

* refactor: make new checkout work with composable logic

* fix: improve address calls

* fix: refactor

* fix: hf

* fix: refactor

* fix: refactor

* code refactor

* code refactor

* feat: use new address v2 calls

* feat: add address basic unit test

* feat: add some more tests

* refactor: fix edit address

* chore: format

* chore: sdk bump

---------

Co-authored-by: Bedeoan Raul <bedeoan.raul@gmail.com>
Co-authored-by: rbedeoan-plenty <121931658+rbedeoan-plenty@users.noreply.github.com>
Co-authored-by: cristian sandru <cristian.sandru@plentysystems.com>
Co-authored-by: Cristian Sandru <149154151+csandru-plenty@users.noreply.github.com>
  • Loading branch information
5 people committed Jun 19, 2024
1 parent 3091dad commit 2e8e772
Show file tree
Hide file tree
Showing 29 changed files with 318 additions and 174 deletions.
8 changes: 7 additions & 1 deletion apps/web/components/Address/Address.vue
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,12 @@
<SfIconCheckCircle v-if="isSelected" class="flex justify-end text-primary-700 shrink-0 default-address" />
</div>
<div class="actions flex justify-end">
<SfButton variant="tertiary" size="sm" class="self-start" @click.stop="$emit('on-edit')">
<SfButton
variant="tertiary"
size="sm"
class="self-start"
@click.stop="$emit('on-edit', userAddressGetters.getId(address))"
>
{{ $t('account.accountSettings.edit') }}
</SfButton>
<SfButton variant="tertiary" size="sm" class="self-start" @click.stop="$emit('on-delete')">
Expand All @@ -30,6 +35,7 @@
import { SfIconCheckCircle } from '@storefront-ui/vue';
import { SfButton } from '@storefront-ui/vue';
import type { AddressProps } from './types';
import { userAddressGetters } from '@plentymarkets/shop-api';
defineProps<AddressProps>();
defineEmits(['on-edit', 'on-delete', 'make-default']);
Expand Down
3 changes: 1 addition & 2 deletions apps/web/components/AddressForm/AddressForm.vue
Original file line number Diff line number Diff line change
Expand Up @@ -98,8 +98,7 @@
</template>

<script setup lang="ts">
import { type Address, AddressType } from '@plentymarkets/shop-api';
import { userAddressGetters } from '@plentymarkets/shop-api';
import { type Address, AddressType, userAddressGetters } from '@plentymarkets/shop-api';
import { SfButton, SfCheckbox, SfInput, SfLoaderCircular, SfSelect } from '@storefront-ui/vue';
import type { AddressFormProps } from '~/components/AddressForm/types';
Expand Down
4 changes: 1 addition & 3 deletions apps/web/components/AddressFormNew/AddressFormNew.vue
Original file line number Diff line number Diff line change
Expand Up @@ -103,10 +103,8 @@ import { type Address, AddressType } from '@plentymarkets/shop-api';
import { userAddressGetters } from '@plentymarkets/shop-api';
import { SfButton, SfCheckbox, SfInput, SfLoaderCircular, SfSelect } from '@storefront-ui/vue';
import type { AddressFormProps } from '~/components/AddressForm/types';
const { loading: loadBilling } = useAddress(AddressType.Billing);
const { useAsShippingAddress } = useCart();
const { loading: loadBilling, useAsShippingAddress } = useAddress(AddressType.Billing);
const { loading: loadShipping } = useAddress(AddressType.Shipping);
const props = withDefaults(defineProps<AddressFormProps>(), {});
const isCartUpdateLoading = computed(() => loadBilling.value || loadShipping.value);
Expand Down
4 changes: 2 additions & 2 deletions apps/web/components/AddressesList/AddressesList.vue
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,7 @@
</div>
</template>
<script lang="ts" setup>
import { type Address, AddressType } from '@plentymarkets/shop-api';
import { userAddressGetters } from '@plentymarkets/shop-api';
import { type Address, AddressType, userAddressGetters } from '@plentymarkets/shop-api';
import { SfButton, SfIconClose, SfLoaderCircular, useDisclosure } from '@storefront-ui/vue';
import type { AddressesListProps } from '~/components/AddressesList/types';
Expand Down Expand Up @@ -90,6 +89,7 @@ const onSave = async (address: Address, useAsShippingAddress: boolean) => {
if (useAsShippingAddress) {
await saveShippingAddress(address);
}
getAddresses();
};
const makeDefault = (address: Address) => {
Expand Down
4 changes: 1 addition & 3 deletions apps/web/components/CategoryFilters/Filter.vue
Original file line number Diff line number Diff line change
Expand Up @@ -81,9 +81,7 @@
</template>

<script setup lang="ts">
import { useRoute } from 'nuxt/app';
import type { Filter, FilterGroup } from '@plentymarkets/shop-api';
import { facetGetters } from '@plentymarkets/shop-api';
import { type Filter, type FilterGroup, facetGetters } from '@plentymarkets/shop-api';
import {
SfInput,
SfIconCheck,
Expand Down
51 changes: 19 additions & 32 deletions apps/web/components/CheckoutAddress/CheckoutAddress.vue
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,26 @@
<div data-testid="checkout-address" class="md:px-4 py-6">
<div class="flex justify-between items-center">
<h2 class="text-neutral-900 text-lg font-bold mb-4">{{ heading }}</h2>
<div v-if="!disabled && addresses.length > 0" class="flex items-center">
<div v-if="!disabled && addressList.length > 0" class="flex items-center">
<SfButton v-if="type === AddressType.Billing" size="sm" variant="tertiary" @click="pick">
{{ $t('savedBillingAddress') }}
</SfButton>
<SfButton v-if="type === AddressType.Shipping" size="sm" variant="tertiary" @click="pick">
{{ $t('savedShippingAddress') }}
</SfButton>
<div class="h-5 w-px bg-primary-700 mx-2"></div>
<SfButton size="sm" variant="tertiary" @click="edit">
<SfButton size="sm" variant="tertiary" @click="edit(userAddressGetters.getId(displayAddress))">
{{ $t('contactInfo.edit') }}
</SfButton>
</div>
</div>

<div v-if="selectedAddress" class="mt-2 md:w-[520px]">
<AddressDisplay :address="selectedAddress" />
<div v-if="displayAddress" class="mt-2 md:w-[520px]">
<AddressDisplay :key="displayAddress.id" :address="displayAddress" />
</div>

<div class="w-full md:max-w-[520px]" v-if="!disabled && (isAuthorized || addresses.length === 0)">
<p v-if="addresses.length === 0">{{ description }}</p>
<div class="w-full md:max-w-[520px]" v-if="!disabled && (isAuthorized || addressList.length === 0)">
<p v-if="!displayAddress.id">{{ description }}</p>
<SfButton :data-testid="`add-${type}-button`" class="mt-4 w-full md:w-auto" variant="secondary" @click="create">
{{ buttonText }}
</SfButton>
Expand All @@ -44,12 +44,12 @@
</h3>
<h1 class="my-2 mb-6 font-semibold">{{ $t('pickSavedAddressSubtitle') }}</h1>
</header>
<div class="hover:bg-primary-50" v-for="address in addresses" :key="userAddressGetters.getId(address)">
<div class="hover:bg-primary-50" v-for="address in addressList" :key="userAddressGetters.getId(address)">
<Address
:address="address"
:is-selected="selectedAddress.id === Number(userAddressGetters.getId(address))"
:is-selected="displayAddress.id === Number(userAddressGetters.getId(address))"
:is-default="defaultAddressId === Number(userAddressGetters.getId(address))"
@click="setNewSelectedAddress(address)"
@click="setDisplayAddress(address, true)"
@on-delete="onDelete(address)"
@make-default="makeDefault(address)"
@on-edit="edit"
Expand Down Expand Up @@ -84,9 +84,7 @@
</header>
<AddressForm
:countries="activeShippingCountries"
:saved-address="
editMode ? addresses.find((address) => address.id?.toString() === selectedAddress?.id?.toString()) : undefined
"
:saved-address="addressToEdit"
:type="type"
@on-save="saveAddress"
@on-close="closeEdit"
Expand All @@ -95,8 +93,7 @@
</div>
</template>
<script setup lang="ts">
import { type Address, AddressType } from '@plentymarkets/shop-api';
import { cartGetters, userAddressGetters } from '@plentymarkets/shop-api';
import { type Address, AddressType, userAddressGetters } from '@plentymarkets/shop-api';
import { SfButton, SfIconClose, useDisclosure } from '@storefront-ui/vue';
import type { CheckoutAddressProps } from '~/components/CheckoutAddress/types';
Expand All @@ -109,35 +106,25 @@ const { data: activeShippingCountries, getActiveShippingCountries } = useActiveS
const props = withDefaults(defineProps<CheckoutAddressProps>(), {
disabled: false,
});
const { data: cart } = useCart();
const editMode = ref(false);
const { data: addresses, setDefault, deleteAddress, defaultAddressId } = useAddress(props.type);
const cartAddress = computed(() =>
props.type === AddressType.Billing
? cartGetters.getCustomerInvoiceAddressId(cart.value)
: cartGetters.getCustomerShippingAddressId(cart.value),
);
const selectedAddress = ref(
props.addresses.find((address) => userAddressGetters.getId(address) === cartAddress?.value?.toString()) ??
({} as Address),
);
const addressToEdit = ref();
const emit = defineEmits(['on-saved']);
const setNewSelectedAddress = (selectedAddressNew: Address) => {
selectedAddress.value = selectedAddressNew;
};
const editMode = ref(false);
const { setDefault, deleteAddress, defaultAddressId, data, displayAddress, setDisplayAddress } = useAddress(props.type);
const emit = defineEmits(['on-saved']);
const addressList = computed(() => data.value ?? []);
getActiveShippingCountries();
const create = () => {
addressToEdit.value = null;
editMode.value = false;
openEdit();
};
const edit = () => {
const edit = (addressId: string) => {
addressToEdit.value = addressList.value.find((address) => userAddressGetters.getId(address) === addressId);
editMode.value = true;
openEdit();
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ describe('<CheckoutAddress />', () => {
const { getByTestId } = mount(CheckoutAddress, {
props: {
type: AddressType.Billing,
addresses: [],
heading: '',
description: '',
buttonText: '',
Expand Down
3 changes: 1 addition & 2 deletions apps/web/components/CheckoutAddress/types.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import type { Address, AddressType } from '@plentymarkets/shop-api';
import type { AddressType } from '@plentymarkets/shop-api';

export type CheckoutAddressProps = {
type: AddressType;
addresses: Address[];
heading: string;
description: string;
buttonText: string;
Expand Down
41 changes: 7 additions & 34 deletions apps/web/components/CheckoutAddressNew/CheckoutAddressNew.vue
Original file line number Diff line number Diff line change
Expand Up @@ -6,68 +6,41 @@
{{ $t('contactInfo.edit') }}
</SfButton>
</div>
<div v-if="selectedAddress && !editMode" class="mt-2 md:w-[520px]">
<AddressDisplay :address="selectedAddress" />
<div v-if="displayAddress && !editMode" class="mt-2 md:w-[520px]">
<AddressDisplay :address="displayAddress" />
</div>

<div v-if="editMode">
<AddressFormNew
ref="addressFormNewReference"
:countries="activeShippingCountries"
:saved-address="
editMode ? addresses.find((address) => address.id?.toString() === selectedAddress?.id?.toString()) : undefined
editMode ? addresses.find((address) => address.id?.toString() === displayAddress?.id?.toString()) : undefined
"
:type="type"
@on-save="saveAddress"
/>
</div>
</div>
</template>
<script setup lang="ts">
import AddressFormNew from '~/components/AddressFormNew/AddressFormNew.vue';
import { type Address, AddressType } from '@plentymarkets/shop-api';
import { cartGetters, userAddressGetters } from '@plentymarkets/shop-api';
import { SfButton } from '@storefront-ui/vue';
import type { CheckoutAddressProps } from '~/components/CheckoutAddress/types';
const { data: activeShippingCountries, getActiveShippingCountries } = useActiveShippingCountries();
const props = withDefaults(defineProps<CheckoutAddressProps>(), {
disabled: false,
});
const { saveAddress: updateAddress, setCheckoutAddress } = useAddress(props.type);
const { data: cart, useAsShippingAddress } = useCart();
const noPreviousAddressWasSet = computed(() => props.addresses.length === 0);
const { data: addresses, displayAddress } = useAddress(props.type);
const noPreviousAddressWasSet = computed(() => addresses.value.length === 0);
const editMode = ref(noPreviousAddressWasSet.value);
const addressFormNewReference = ref<InstanceType<typeof AddressFormNew> | null>(null);
const cartAddress = computed(() =>
props.type === AddressType.Billing
? cartGetters.getCustomerInvoiceAddressId(cart.value)
: cartGetters.getCustomerShippingAddressId(cart.value),
);
const selectedAddress = computed(
() =>
props.addresses.find((address) => userAddressGetters.getId(address) === cartAddress?.value?.toString()) ??
({} as Address),
);
const emit = defineEmits(['on-saved']);
getActiveShippingCountries();
const edit = () => (editMode.value = !editMode.value);
const saveAddress = async (address: Address) => {
const result = await updateAddress(address);
if (props.type === AddressType.Billing && useAsShippingAddress.value) {
setCheckoutAddress(AddressType.Shipping, -99);
} else if (result?.id) {
setCheckoutAddress(AddressType.Shipping, result.id);
}
emit('on-saved');
editMode.value = false;
const edit = () => {
editMode.value = !editMode.value;
};
const disableEditMode = async () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ describe('<CheckoutAddress />', () => {
const { getByTestId } = mount(CheckoutAddress, {
props: {
type: AddressType.Billing,
addresses: [],
heading: '',
description: '',
buttonText: '',
Expand Down
3 changes: 1 addition & 2 deletions apps/web/components/CheckoutAddressNew/types.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import type { Address, AddressType } from '@plentymarkets/shop-api';
import type { AddressType } from '@plentymarkets/shop-api';

export type CheckoutAddressProps = {
type: AddressType;
addresses: Address[];
heading: string;
description: string;
buttonText: string;
Expand Down
3 changes: 1 addition & 2 deletions apps/web/components/MegaMenu/MegaMenu.vue
Original file line number Diff line number Diff line change
Expand Up @@ -175,8 +175,7 @@
</template>

<script lang="ts" setup>
import type { CategoryTreeItem } from '@plentymarkets/shop-api';
import { categoryTreeGetters } from '@plentymarkets/shop-api';
import { type CategoryTreeItem, categoryTreeGetters } from '@plentymarkets/shop-api';
import {
SfIconClose,
SfButton,
Expand Down
3 changes: 1 addition & 2 deletions apps/web/components/ui/Badges/Badges.vue
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,8 @@

<script setup lang="ts">
import { SfListItem } from '@storefront-ui/vue';
import { productGetters, tagGetters } from '@plentymarkets/shop-api';
import { type ProductTag, productGetters, tagGetters } from '@plentymarkets/shop-api';
import type { BadgesProps } from '~/components/ui/Badges/types';
import type { ProductTag } from '@plentymarkets/shop-api';
const localePath = useLocalePath();
Expand Down
8 changes: 6 additions & 2 deletions apps/web/components/ui/Review/Review.vue
Original file line number Diff line number Diff line change
Expand Up @@ -181,8 +181,12 @@ import {
import type { ReviewProps } from './types';
import ReviewForm from '~/components/ReviewForm/ReviewForm.vue';
import ReplyForm from '~/components/ReplyForm/ReplyForm.vue';
import type { CreateReviewParams, ReviewItem, UpdateReviewParams } from '@plentymarkets/shop-api';
import { reviewGetters } from '@plentymarkets/shop-api';
import {
type CreateReviewParams,
type ReviewItem,
type UpdateReviewParams,
reviewGetters,
} from '@plentymarkets/shop-api';
const props = defineProps<ReviewProps>();
const emits = defineEmits(['on-submit', 'review-updated', 'review-deleted']);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,17 @@ export const useActiveShippingCountries: UseActiveShippingCountriesReturn = () =
}));

const getActiveShippingCountries: GetActiveShippingCountries = async () => {
state.value.loading = true;
if (state.value.data.length <= 0) {
state.value.loading = true;

const { data, error } = await useAsyncData('getActiveShippingCountries', () =>
useSdk().plentysystems.getActiveShippingCountries(),
);
useHandleError(error.value);
state.value.data = data.value?.data ?? state.value.data;
state.value.loading = false;
}

const { data, error } = await useAsyncData('getActiveShippingCountries', () =>
useSdk().plentysystems.getActiveShippingCountries(),
);
useHandleError(error.value);
state.value.data = data.value?.data ?? state.value.data;
state.value.loading = false;
return state.value.data;
};

Expand Down
Loading

0 comments on commit 2e8e772

Please sign in to comment.