From a84e5263867bbb645b31a8cd3b203c0b77b0f91f Mon Sep 17 00:00:00 2001 From: Chloe Date: Thu, 19 May 2022 19:17:21 +0700 Subject: [PATCH] Fix typing error Signed-off-by: Chloe --- .../bigcommerce/src/cart/use-update-item.tsx | 4 +-- .../src/checkout/use-checkout.tsx | 6 ++-- packages/opencommerce/src/types/cart.ts | 23 +++++++++++++- packages/opencommerce/src/utils/normalize.ts | 30 +++++++++++++++++-- .../ShippingMethodView/ShippingMethodView.tsx | 7 +++-- site/components/checkout/context.tsx | 4 ++- 6 files changed, 62 insertions(+), 12 deletions(-) diff --git a/packages/bigcommerce/src/cart/use-update-item.tsx b/packages/bigcommerce/src/cart/use-update-item.tsx index 0effac320..b15690ed7 100644 --- a/packages/bigcommerce/src/cart/use-update-item.tsx +++ b/packages/bigcommerce/src/cart/use-update-item.tsx @@ -5,9 +5,7 @@ import type { HookFetcherContext, } from '@vercel/commerce/utils/types' import { ValidationError } from '@vercel/commerce/utils/errors' -import useUpdateItem, { - UseUpdateItem, -} from '@vercel/commerce/cart/use-update-item' +import useUpdateItem, { UseUpdateItem } from '@vercel/commerce/cart/use-update-item' import type { LineItem, UpdateItemHook } from '@vercel/commerce/types/cart' import { handler as removeItemHandler } from './use-remove-item' import useCart from './use-cart' diff --git a/packages/opencommerce/src/checkout/use-checkout.tsx b/packages/opencommerce/src/checkout/use-checkout.tsx index 306148dff..1986db79e 100644 --- a/packages/opencommerce/src/checkout/use-checkout.tsx +++ b/packages/opencommerce/src/checkout/use-checkout.tsx @@ -7,6 +7,7 @@ import useCheckout, { } from '@vercel/commerce/checkout/use-checkout' import useSubmitCheckout from './use-submit-checkout' import { useCheckoutContext } from '@components/checkout/context' +import { AddressFields } from '../types/customer/address' import { useCart } from '../cart' export default useCheckout as UseCheckout @@ -25,11 +26,12 @@ export const handler: SWRHook = { (group) => group?.type === 'shipping' ) const hasShippingMethods = - !!shippingTypeMethod?.availableFulfillmentOptions.length + !!shippingTypeMethod?.availableFulfillmentOptions?.length const { addressFields } = useCheckoutContext() - const { shippingMethod, ...restAddressFields } = addressFields + const { shippingMethod, ...restAddressFields } = + addressFields as AddressFields const hasEnteredAddress = Object.values(restAddressFields).some( (fieldValue) => !!fieldValue diff --git a/packages/opencommerce/src/types/cart.ts b/packages/opencommerce/src/types/cart.ts index 8db0d1c30..874d08805 100644 --- a/packages/opencommerce/src/types/cart.ts +++ b/packages/opencommerce/src/types/cart.ts @@ -1,9 +1,30 @@ import * as Core from '@vercel/commerce/types/cart' -import { Checkout } from '../../schema' +import { + Checkout as CheckoutSchema, + FulfillmentOption as FulfillmentOptionSchema, + FulfillmentGroup as FulfillmentGroupSchema, +} from '../../schema' import { ProductVariant } from './product' export * from '@vercel/commerce/types/cart' +type FulfillmentOption = FulfillmentOptionSchema & { + fulfillmentMethod?: NonNullable +} + +export type FulfillmentGroup = { + availableFulfillmentOptions: FulfillmentOption[] | null + selectedFulfillmentOption: FulfillmentOption | null + data: FulfillmentGroupSchema['data'] + type: string + _id: string +} + +export type Checkout = { + fulfillmentGroups: FulfillmentGroup[] + summary: CheckoutSchema['summary'] +} + export type Cart = Core.Cart & { checkout?: Checkout } diff --git a/packages/opencommerce/src/utils/normalize.ts b/packages/opencommerce/src/utils/normalize.ts index 2d7a88103..0bf06b104 100644 --- a/packages/opencommerce/src/utils/normalize.ts +++ b/packages/opencommerce/src/utils/normalize.ts @@ -18,8 +18,9 @@ import { Cart as OCCart, CartItemEdge, NavigationTreeItem, + Checkout as OCCheckout, } from '../../schema' -import { Cart, LineItem } from '../types/cart' +import { Cart, Checkout, LineItem, FulfillmentGroup } from '../types/cart' const normalizeProductImages = (images: ImageInfo[], name: string) => images.map((image) => ({ @@ -256,7 +257,32 @@ export function normalizeCart(cart: OCCart): Cart { totalPrice: cart.checkout?.summary?.total?.amount ?? 0, discounts: [], taxesIncluded: !!cart.checkout?.summary?.taxTotal?.amount, - checkout: cart.checkout ? cart.checkout : undefined, + checkout: cart.checkout ? normalizeCheckout(cart.checkout) : undefined, + } +} + +function filterNullValue( + items: (T | null | undefined)[] | null | undefined +): T[] { + return items?.filter((item: T | null | undefined): item is T => !!item) ?? [] +} + +function normalizeCheckout(checkout: OCCheckout): Checkout { + const fulfillmentGroups = filterNullValue(checkout.fulfillmentGroups).map( + (group) => ({ + selectedFulfillmentOption: group.selectedFulfillmentOption, + type: group.type, + _id: group._id, + data: group.data, + availableFulfillmentOptions: filterNullValue( + group.availableFulfillmentOptions + ), + }) + ) as FulfillmentGroup[] + + return { + ...checkout, + fulfillmentGroups, } } diff --git a/site/components/checkout/ShippingMethodView/ShippingMethodView.tsx b/site/components/checkout/ShippingMethodView/ShippingMethodView.tsx index ca0bde53b..bdc441cef 100644 --- a/site/components/checkout/ShippingMethodView/ShippingMethodView.tsx +++ b/site/components/checkout/ShippingMethodView/ShippingMethodView.tsx @@ -4,14 +4,15 @@ import SidebarLayout from '@components/common/SidebarLayout' import { useUI } from '@components/ui/context' import { Button } from '@components/ui' import { useCheckoutContext } from '../context' -import { Key, ReactChild, ReactFragment, ReactPortal } from 'react' type FulfillmentGroup = { type: string + _id: string + availableFulfillmentOptions: FulfillmentOption[] | null } type FulfillmentOption = { - fulfillmentMethod: { + fulfillmentMethod?: { _id: string displayName: string } @@ -55,7 +56,7 @@ const ShippingMethod = () => { Shipping Methods
- {shippingGroup.availableFulfillmentOptions.map( + {shippingGroup.availableFulfillmentOptions?.map( (option: FulfillmentOption) => (
void - setAddressFields: (addressFields: AddressFields) => void + setAddressFields: ( + addressFields: T + ) => void clearCheckoutFields: () => void }