From 2221631871e1d016e001b2ea2b15a98db58eedee Mon Sep 17 00:00:00 2001 From: bitbybit <1628191+bitbybit@users.noreply.github.com> Date: Thu, 19 Jun 2025 16:26:06 +0200 Subject: [PATCH] fix: ECOM-83 crosscheck fixes --- app/api/client.ts | 116 ++++++++++++++++++++---------- app/pages/cart/CartTotalPrice.tsx | 10 +-- 2 files changed, 85 insertions(+), 41 deletions(-) diff --git a/app/api/client.ts b/app/api/client.ts index bd832c1..bf0f0d6 100644 --- a/app/api/client.ts +++ b/app/api/client.ts @@ -1,6 +1,7 @@ import { ClientBuilder, type HttpMiddlewareOptions } from '@commercetools/ts-client' import { type ByProjectKeyMeRequestBuilder, + type ApiRequest, type ByProjectKeyRequestBuilder, type ClientResponse, createApiBuilderFromCtpClient, @@ -99,19 +100,37 @@ export class CtpApiClient { } } + private static isAnonymousIdError(error: unknown): boolean { + return ( + typeof error === 'object' && + error !== null && + 'statusCode' in error && + error.statusCode === 400 && + 'message' in error && + typeof error.message === 'string' && + error.message.includes('anonymousId') + ) + } + public async login(email: string, password: string): Promise> { - await this.public - .me() - .login() - .post({ - body: { - email, - password, - activeCartSignInMode: 'UseAsNewActiveCustomerCart', - updateProductData: true - } - }) - .execute() + const request: () => ApiRequest = () => + this.public + .me() + .login() + .post({ + body: { + email, + password, + activeCartSignInMode: 'UseAsNewActiveCustomerCart', + updateProductData: true + } + }) + + try { + await request().execute() + } catch (error) { + await this.handleError({ error, request }) + } this.protected = this.createProtectedWithCredentials(email, password) this.current = this.protected @@ -139,31 +158,37 @@ export class CtpApiClient { const billingAddressIndex = payload.addresses.findIndex(({ type }) => type === CUSTOMER_ADDRESS_TYPE.BILLING) const shippingAddressIndex = payload.addresses.findIndex(({ type }) => type === CUSTOMER_ADDRESS_TYPE.SHIPPING) - return this.public - .me() - .signup() - .post({ - body: { - addresses: payload.addresses.map( - (address): Omit => ({ - city: address.city, - country: address.country, - firstName: payload.firstName, - lastName: payload.lastName, - postalCode: address.postalCode, - streetName: address.streetName - }) - ), - dateOfBirth: payload.dateOfBirth, - defaultBillingAddress: billingAddressIndex === -1 ? undefined : billingAddressIndex, - defaultShippingAddress: shippingAddressIndex === -1 ? undefined : shippingAddressIndex, - email: payload.email, - firstName: payload.firstName, - lastName: payload.lastName, - password: payload.password - } - }) - .execute() + const request: () => ApiRequest = () => + this.public + .me() + .signup() + .post({ + body: { + addresses: payload.addresses.map( + (address): Omit => ({ + city: address.city, + country: address.country, + firstName: payload.firstName, + lastName: payload.lastName, + postalCode: address.postalCode, + streetName: address.streetName + }) + ), + dateOfBirth: payload.dateOfBirth, + defaultBillingAddress: billingAddressIndex === -1 ? undefined : billingAddressIndex, + defaultShippingAddress: shippingAddressIndex === -1 ? undefined : shippingAddressIndex, + email: payload.email, + firstName: payload.firstName, + lastName: payload.lastName, + password: payload.password + } + }) + + try { + return await request().execute() + } catch (error) { + return await this.handleError({ error, request }) + } } private getHttpOptions(): HttpMiddlewareOptions { @@ -247,6 +272,23 @@ export class CtpApiClient { }) } + private async handleError({ + error, + request + }: { + error: unknown + request: () => ApiRequest + }): Promise> { + if (!CtpApiClient.isAnonymousIdError(error)) { + throw error + } + + console.log('Anonymous ID is already in use. Creating new anonymous ID...') + + this.logout() + return await request().execute() + } + private getOrCreateAnonymousId(): string { let id = this.getAnonymousIdFromStorage() diff --git a/app/pages/cart/CartTotalPrice.tsx b/app/pages/cart/CartTotalPrice.tsx index 78ce788..b9d826b 100644 --- a/app/pages/cart/CartTotalPrice.tsx +++ b/app/pages/cart/CartTotalPrice.tsx @@ -9,11 +9,13 @@ type CartTotalPriceProps = { export function CartTotalPrice({ totalPrice, discount }: CartTotalPriceProps): ReactElement { const hasDiscount = discount !== undefined + const fullPrice = (totalPrice ?? 0) + (discount?.discountedAmount?.centAmount ?? 0) + const discountedPrice = totalPrice ?? 0 + return ( -
- {hasDiscount - ? `Total price with discount code applied: ${formatProductItemPrice(discount.discountedAmount?.centAmount ?? 0)}` - : `Total price: ${formatProductItemPrice(totalPrice ?? 0)}`} +
+
Total price: {formatProductItemPrice(fullPrice)}
+ {hasDiscount &&
Total price with discount code applied: {formatProductItemPrice(discountedPrice)}
}
) }