diff --git a/.changeset/nasty-crabs-do.md b/.changeset/nasty-crabs-do.md new file mode 100644 index 000000000..3f57c7c88 --- /dev/null +++ b/.changeset/nasty-crabs-do.md @@ -0,0 +1,5 @@ +--- +"@bigcommerce/catalyst-core": patch +--- + +chore: standardize actions \ No newline at end of file diff --git a/apps/core/app/[locale]/(default)/cart/_actions/remove-item.ts b/apps/core/app/[locale]/(default)/cart/_actions/remove-item.ts index 8a935d7b4..7b4716206 100644 --- a/apps/core/app/[locale]/(default)/cart/_actions/remove-item.ts +++ b/apps/core/app/[locale]/(default)/cart/_actions/remove-item.ts @@ -22,22 +22,21 @@ export async function removeItem({ return { status: 'error', error: 'No lineItemEntityId found' }; } - const updatedCart = await deleteCartLineItem(cartId, lineItemEntityId); + const cart = await deleteCartLineItem(cartId, lineItemEntityId); // If we remove the last item in a cart the cart is deleted - // so we need to remove the cartId cookie and clear shipping data - if (!updatedCart) { + // so we need to remove the cartId cookie + // TODO: We need to figure out if it actually failed. + if (!cart) { cookies().delete('cartId'); - cookies().delete('shippingCosts'); - revalidateTag('cart'); } revalidateTag('cart'); - return { status: 'success', data: updatedCart }; - } catch (e: unknown) { - if (e instanceof Error) { - return { status: 'error', error: e.message }; + return { status: 'success', data: cart }; + } catch (error: unknown) { + if (error instanceof Error) { + return { status: 'error', error: error.message }; } return { status: 'error' }; diff --git a/apps/core/app/[locale]/(default)/cart/_components/coupon-code/apply-coupon-code.ts b/apps/core/app/[locale]/(default)/cart/_components/coupon-code/apply-coupon-code.ts index 076ebf2a6..854d35087 100644 --- a/apps/core/app/[locale]/(default)/cart/_components/coupon-code/apply-coupon-code.ts +++ b/apps/core/app/[locale]/(default)/cart/_components/coupon-code/apply-coupon-code.ts @@ -20,15 +20,15 @@ export async function applyCouponCode(formData: FormData) { const checkout = await applyCheckoutCoupon(parsedData.checkoutEntityId, parsedData.couponCode); if (!checkout?.entityId) { - return { status: 'error', error: 'Coupon code is invalid' }; + return { status: 'error', error: 'Coupon code is invalid.' }; } revalidateTag('checkout'); return { status: 'success', data: checkout }; - } catch (e: unknown) { - if (e instanceof Error || e instanceof z.ZodError) { - return { status: 'error', error: e.message }; + } catch (error: unknown) { + if (error instanceof Error || error instanceof z.ZodError) { + return { status: 'error', error: error.message }; } return { status: 'error' }; diff --git a/apps/core/app/[locale]/(default)/cart/_components/coupon-code/remove-coupon-code.ts b/apps/core/app/[locale]/(default)/cart/_components/coupon-code/remove-coupon-code.ts index 159c7a188..c916079a7 100644 --- a/apps/core/app/[locale]/(default)/cart/_components/coupon-code/remove-coupon-code.ts +++ b/apps/core/app/[locale]/(default)/cart/_components/coupon-code/remove-coupon-code.ts @@ -23,15 +23,15 @@ export async function removeCouponCode(formData: FormData) { ); if (!checkout?.entityId) { - return { status: 'error', error: 'Error ocurred removing coupon' }; + return { status: 'error', error: 'Error ocurred removing coupon.' }; } revalidateTag('checkout'); return { status: 'success', data: checkout }; - } catch (e: unknown) { - if (e instanceof Error || e instanceof z.ZodError) { - return { status: 'error', error: e.message }; + } catch (error: unknown) { + if (error instanceof Error || error instanceof z.ZodError) { + return { status: 'error', error: error.message }; } return { status: 'error' }; diff --git a/apps/core/app/[locale]/(default)/cart/_components/item-quantity/update-item-quantity.ts b/apps/core/app/[locale]/(default)/cart/_components/item-quantity/update-item-quantity.ts index 7e062f4c6..3a4685b20 100644 --- a/apps/core/app/[locale]/(default)/cart/_components/item-quantity/update-item-quantity.ts +++ b/apps/core/app/[locale]/(default)/cart/_components/item-quantity/update-item-quantity.ts @@ -45,20 +45,20 @@ export async function updateItemQuantity({ selectedOptions && { selectedOptions }, ); - const updatedCart = await updateCartLineItem(cartId, lineItemEntityId, { + const cart = await updateCartLineItem(cartId, lineItemEntityId, { lineItem: cartLineItemData, }); - if (!updatedCart) { + if (!cart) { return { status: 'error', error: 'Failed to change product quantity in Cart' }; } revalidatePath('/cart'); - return { status: 'success', data: updatedCart }; - } catch (e: unknown) { - if (e instanceof Error) { - return { status: 'error', error: e.message }; + return { status: 'success', data: cart }; + } catch (error: unknown) { + if (error instanceof Error) { + return { status: 'error', error: error.message }; } return { status: 'error' }; diff --git a/apps/core/app/[locale]/(default)/cart/_components/shipping-info/get-shipping-states.ts b/apps/core/app/[locale]/(default)/cart/_components/shipping-info/get-shipping-states.ts index cca8fbe13..589cdf9c8 100644 --- a/apps/core/app/[locale]/(default)/cart/_components/shipping-info/get-shipping-states.ts +++ b/apps/core/app/[locale]/(default)/cart/_components/shipping-info/get-shipping-states.ts @@ -9,9 +9,9 @@ export async function getShippingStates(id: number) { return { status: 'success', data: response }; } catch (error: unknown) { if (error instanceof Error) { - return { status: 'failed', error: error.message }; + return { status: 'error', error: error.message }; } - return { status: 'failed', error }; + return { status: 'error', error: 'An error occurred while fetching the shipping states.' }; } } diff --git a/apps/core/app/[locale]/(default)/cart/_components/shipping-info/index.tsx b/apps/core/app/[locale]/(default)/cart/_components/shipping-info/index.tsx index 2a31645de..ee373901c 100644 --- a/apps/core/app/[locale]/(default)/cart/_components/shipping-info/index.tsx +++ b/apps/core/app/[locale]/(default)/cart/_components/shipping-info/index.tsx @@ -126,7 +126,7 @@ export const ShippingInfo = ({ shippingId: shippingConsignment?.entityId ?? '', }); - if (status === 'failed') { + if (status === 'error') { toast.error(t('errorMessage'), { icon: , }); diff --git a/apps/core/app/[locale]/(default)/cart/_components/shipping-info/submit-shipping-info.ts b/apps/core/app/[locale]/(default)/cart/_components/shipping-info/submit-shipping-info.ts index 5fae31e03..1733d7504 100644 --- a/apps/core/app/[locale]/(default)/cart/_components/shipping-info/submit-shipping-info.ts +++ b/apps/core/app/[locale]/(default)/cart/_components/shipping-info/submit-shipping-info.ts @@ -53,14 +53,18 @@ export const submitShippingInfo = async ( }); } + if (!result?.entityId) { + return { status: 'error', error: 'Failed to submit shipping info.' }; + } + revalidateTag('checkout'); return { status: 'success', data: result }; - } catch (e: unknown) { - if (e instanceof Error || e instanceof z.ZodError) { - return { status: 'failed', error: e.message }; + } catch (error: unknown) { + if (error instanceof Error || error instanceof z.ZodError) { + return { status: 'error', error: error.message }; } - return { status: 'failed' }; + return { status: 'error', error: 'Failed to submit shipping info.' }; } }; diff --git a/apps/core/app/[locale]/(default)/cart/_components/shipping-options/index.tsx b/apps/core/app/[locale]/(default)/cart/_components/shipping-options/index.tsx index 129818a76..bd93c9e9f 100644 --- a/apps/core/app/[locale]/(default)/cart/_components/shipping-options/index.tsx +++ b/apps/core/app/[locale]/(default)/cart/_components/shipping-options/index.tsx @@ -35,7 +35,7 @@ export const ShippingOptions = ({ data, checkoutEntityId, currencyCode }: Props) const onSubmit = async (formData: FormData) => { const { status } = await submitShippingCosts(formData, checkoutEntityId, entityId); - if (status === 'failed') { + if (status === 'error') { toast.error(t('errorMessage'), { icon: , }); diff --git a/apps/core/app/[locale]/(default)/cart/_components/shipping-options/submit-shipping-costs.ts b/apps/core/app/[locale]/(default)/cart/_components/shipping-options/submit-shipping-costs.ts index 0d655d589..c650aa214 100644 --- a/apps/core/app/[locale]/(default)/cart/_components/shipping-options/submit-shipping-costs.ts +++ b/apps/core/app/[locale]/(default)/cart/_components/shipping-options/submit-shipping-costs.ts @@ -25,14 +25,18 @@ export const submitShippingCosts = async ( shippingOptionEntityId: parsedData.shippingOption, }); + if (!shippingCost?.entityId) { + return { status: 'error', error: 'Failed to submit shipping cost.' }; + } + revalidateTag('checkout'); return { status: 'success', data: shippingCost }; - } catch (e: unknown) { - if (e instanceof Error || e instanceof z.ZodError) { - return { status: 'failed', error: e.message }; + } catch (error: unknown) { + if (error instanceof Error || error instanceof z.ZodError) { + return { status: 'error', error: error.message }; } - return { status: 'failed' }; + return { status: 'error', error: 'Failed to submit shipping cost.' }; } }; diff --git a/apps/core/app/[locale]/(default)/compare/_actions/add-to-cart.ts b/apps/core/app/[locale]/(default)/compare/_actions/add-to-cart.ts index cc81ed569..9eef72964 100644 --- a/apps/core/app/[locale]/(default)/compare/_actions/add-to-cart.ts +++ b/apps/core/app/[locale]/(default)/compare/_actions/add-to-cart.ts @@ -11,11 +11,14 @@ export const addToCart = async (data: FormData) => { const productEntityId = Number(data.get('product_id')); const cartId = cookies().get('cartId')?.value; - const cart = await getCart(cartId); + + let cart; try { + cart = await getCart(cartId); + if (cart) { - await addCartLineItem(cart.entityId, { + cart = await addCartLineItem(cart.entityId, { lineItems: [ { productEntityId, @@ -24,26 +27,38 @@ export const addToCart = async (data: FormData) => { ], }); + if (!cart?.entityId) { + return { status: 'error', error: 'Failed to add product to cart.' }; + } + revalidateTag('cart'); - return; + return { status: 'success', data: cart }; } - const newCart = await createCart([{ productEntityId, quantity: 1 }]); + cart = await createCart([{ productEntityId, quantity: 1 }]); - if (newCart) { - cookies().set({ - name: 'cartId', - value: newCart.entityId, - httpOnly: true, - sameSite: 'lax', - secure: true, - path: '/', - }); + if (!cart?.entityId) { + return { status: 'error', error: 'Failed to add product to cart.' }; } + cookies().set({ + name: 'cartId', + value: cart.entityId, + httpOnly: true, + sameSite: 'lax', + secure: true, + path: '/', + }); + revalidateTag('cart'); - } catch (e) { - return { error: 'Something went wrong. Please try again.' }; + + return { status: 'success', data: cart }; + } catch (error: unknown) { + if (error instanceof Error) { + return { status: 'error', error: error.message }; + } + + return { status: 'error', error: 'Something went wrong. Please try again.' }; } }; diff --git a/apps/core/app/[locale]/(default)/compare/_components/add-to-cart-form.tsx b/apps/core/app/[locale]/(default)/compare/_components/add-to-cart-form.tsx index ac4b35a13..9aea8105d 100644 --- a/apps/core/app/[locale]/(default)/compare/_components/add-to-cart-form.tsx +++ b/apps/core/app/[locale]/(default)/compare/_components/add-to-cart-form.tsx @@ -27,7 +27,7 @@ export const AddToCartForm = ({ const result = await addToCart(formData); const quantity = Number(formData.get('quantity')); - if (result?.error) { + if (result.error) { toast.error(result.error, { icon: }); return; diff --git a/apps/core/app/[locale]/(default)/login/_actions/submit-change-password-form.ts b/apps/core/app/[locale]/(default)/login/_actions/submit-change-password-form.ts index df5690941..31af989a9 100644 --- a/apps/core/app/[locale]/(default)/login/_actions/submit-change-password-form.ts +++ b/apps/core/app/[locale]/(default)/login/_actions/submit-change-password-form.ts @@ -7,11 +7,6 @@ import { submitChangePassword, } from '~/client/mutations/submit-change-password'; -export interface State { - status: 'idle' | 'error' | 'success'; - message?: string; -} - export const submitChangePasswordForm = async (_previousState: unknown, formData: FormData) => { try { const parsedData = ChangePasswordSchema.parse({ @@ -52,6 +47,6 @@ export const submitChangePasswordForm = async (_previousState: unknown, formData }; } - return { status: 'error', message: 'Unknown error' }; + return { status: 'error', message: 'Unknown error.' }; } }; diff --git a/apps/core/app/[locale]/(default)/login/_actions/submit-login-form.ts b/apps/core/app/[locale]/(default)/login/_actions/submit-login-form.ts index a69f18c8d..133aec9b1 100644 --- a/apps/core/app/[locale]/(default)/login/_actions/submit-login-form.ts +++ b/apps/core/app/[locale]/(default)/login/_actions/submit-login-form.ts @@ -4,8 +4,6 @@ import { isRedirectError } from 'next/dist/client/components/redirect'; import { Credentials, signIn } from '~/auth'; -export type State = { status: 'idle' } | { status: 'failed' }; - export const submitLoginForm = async (_previousState: unknown, formData: FormData) => { try { const credentials = Credentials.parse({ @@ -25,7 +23,7 @@ export const submitLoginForm = async (_previousState: unknown, formData: FormDat } return { - status: 'failed', + status: 'error', }; } }; diff --git a/apps/core/app/[locale]/(default)/login/_actions/submit-reset-password-form.ts b/apps/core/app/[locale]/(default)/login/_actions/submit-reset-password-form.ts index 7ba88645d..9e3f8b914 100644 --- a/apps/core/app/[locale]/(default)/login/_actions/submit-reset-password-form.ts +++ b/apps/core/app/[locale]/(default)/login/_actions/submit-reset-password-form.ts @@ -39,6 +39,6 @@ export const submitResetPasswordForm = async ({ return { status: 'error', error: error.message }; } - return { status: 'error', error: 'Unknown error' }; + return { status: 'error', error: 'Unknown error.' }; } }; diff --git a/apps/core/app/[locale]/(default)/login/_components/login-form.tsx b/apps/core/app/[locale]/(default)/login/_components/login-form.tsx index d939acfd6..8035ef0b8 100644 --- a/apps/core/app/[locale]/(default)/login/_components/login-form.tsx +++ b/apps/core/app/[locale]/(default)/login/_components/login-form.tsx @@ -28,7 +28,7 @@ export const LoginForm = () => { const t = useTranslations('Account.Login'); - const isFormInvalid = state?.status === 'failed'; + const isFormInvalid = state?.status === 'error'; const handleInputValidation = (e: ChangeEvent) => { const validationStatus = e.target.validity.valueMissing; diff --git a/apps/core/app/[locale]/(default)/webpages/contact/[id]/contact-us/_actions/submit-contact-form.ts b/apps/core/app/[locale]/(default)/webpages/contact/[id]/contact-us/_actions/submit-contact-form.ts index 956a33cc7..f82212c11 100644 --- a/apps/core/app/[locale]/(default)/webpages/contact/[id]/contact-us/_actions/submit-contact-form.ts +++ b/apps/core/app/[locale]/(default)/webpages/contact/[id]/contact-us/_actions/submit-contact-form.ts @@ -40,14 +40,14 @@ export const submitContactForm = async ({ } return { - status: 'failed', + status: 'error', error: response.errors.map((error) => error.message).join('\n'), }; - } catch (e: unknown) { - if (e instanceof Error || e instanceof z.ZodError) { - return { status: 'failed', error: e.message }; + } catch (error: unknown) { + if (error instanceof Error || error instanceof z.ZodError) { + return { status: 'error', error: error.message }; } - return { status: 'failed', error: 'Unknown error' }; + return { status: 'error', error: 'Unknown error.' }; } }; diff --git a/apps/core/app/[locale]/(default)/webpages/contact/[id]/contact-us/index.tsx b/apps/core/app/[locale]/(default)/webpages/contact/[id]/contact-us/index.tsx index ac7f89b1e..2e28bb52f 100644 --- a/apps/core/app/[locale]/(default)/webpages/contact/[id]/contact-us/index.tsx +++ b/apps/core/app/[locale]/(default)/webpages/contact/[id]/contact-us/index.tsx @@ -112,7 +112,7 @@ export const ContactUs = ({ data }: Props) => { }); } - if (submit.status === 'failed') { + if (submit.status === 'error') { setFormStatus({ status: 'error', message: submit.error ?? '' }); } diff --git a/apps/core/components/product-card/_actions/add-to-cart.ts b/apps/core/components/product-card/_actions/add-to-cart.ts index cc81ed569..df984d2f8 100644 --- a/apps/core/components/product-card/_actions/add-to-cart.ts +++ b/apps/core/components/product-card/_actions/add-to-cart.ts @@ -11,11 +11,13 @@ export const addToCart = async (data: FormData) => { const productEntityId = Number(data.get('product_id')); const cartId = cookies().get('cartId')?.value; - const cart = await getCart(cartId); + let cart; try { + cart = await getCart(cartId); + if (cart) { - await addCartLineItem(cart.entityId, { + cart = await addCartLineItem(cart.entityId, { lineItems: [ { productEntityId, @@ -24,26 +26,38 @@ export const addToCart = async (data: FormData) => { ], }); + if (!cart?.entityId) { + return { status: 'error', error: 'Failed to add product to cart.' }; + } + revalidateTag('cart'); - return; + return { status: 'success', data: cart }; } - const newCart = await createCart([{ productEntityId, quantity: 1 }]); + cart = await createCart([{ productEntityId, quantity: 1 }]); - if (newCart) { - cookies().set({ - name: 'cartId', - value: newCart.entityId, - httpOnly: true, - sameSite: 'lax', - secure: true, - path: '/', - }); + if (!cart?.entityId) { + return { status: 'error', error: 'Failed to add product to cart.' }; } + cookies().set({ + name: 'cartId', + value: cart.entityId, + httpOnly: true, + sameSite: 'lax', + secure: true, + path: '/', + }); + revalidateTag('cart'); - } catch (e) { - return { error: 'Something went wrong. Please try again.' }; + + return { status: 'success', data: cart }; + } catch (error: unknown) { + if (error instanceof Error) { + return { status: 'error', error: error.message }; + } + + return { status: 'error', error: 'Something went wrong. Please try again.' }; } }; diff --git a/apps/core/components/product-card/cart/index.tsx b/apps/core/components/product-card/cart/index.tsx index 7e2241754..613e7da78 100644 --- a/apps/core/components/product-card/cart/index.tsx +++ b/apps/core/components/product-card/cart/index.tsx @@ -45,7 +45,7 @@ export const Cart = ({ data: product }: Props) => { const result = await addToCart(formData); const quantity = Number(formData.get('quantity')); - if (result?.error) { + if (result.error) { toast.error(result.error, { icon: }); return; diff --git a/apps/core/components/product-form/_actions/add-to-cart.ts b/apps/core/components/product-form/_actions/add-to-cart.ts index 4d0cd4539..5dd29b0d2 100644 --- a/apps/core/components/product-form/_actions/add-to-cart.ts +++ b/apps/core/components/product-form/_actions/add-to-cart.ts @@ -20,7 +20,8 @@ export async function handleAddToCart(data: ProductFormData) { const product = await getProduct(productEntityId); const cartId = cookies().get('cartId')?.value; - const cart = await getCart(cartId); + + let cart; const selectedOptions = product?.productOptions?.reduce((accum, option) => { @@ -129,8 +130,10 @@ export async function handleAddToCart(data: ProductFormData) { }, {}) ?? {}; try { + cart = await getCart(cartId); + if (cart) { - await addCartLineItem(cart.entityId, { + cart = await addCartLineItem(cart.entityId, { lineItems: [ { productEntityId, @@ -140,13 +143,17 @@ export async function handleAddToCart(data: ProductFormData) { ], }); + if (!cart?.entityId) { + return { status: 'error', error: 'Failed to add product to cart.' }; + } + revalidateTag('cart'); - return; + return { status: 'success', data: cart }; } // Create cart - const newCart = await createCart([ + cart = await createCart([ { productEntityId, selectedOptions, @@ -154,19 +161,27 @@ export async function handleAddToCart(data: ProductFormData) { }, ]); - if (newCart) { - cookies().set({ - name: 'cartId', - value: newCart.entityId, - httpOnly: true, - sameSite: 'lax', - secure: true, - path: '/', - }); + if (!cart?.entityId) { + return { status: 'error', error: 'Failed to add product to cart.' }; } + cookies().set({ + name: 'cartId', + value: cart.entityId, + httpOnly: true, + sameSite: 'lax', + secure: true, + path: '/', + }); + revalidateTag('cart'); - } catch (e) { - return { error: 'Something went wrong. Please try again.' }; + + return { status: 'success', data: cart }; + } catch (error: unknown) { + if (error instanceof Error) { + return { status: 'error', error: error.message }; + } + + return { status: 'error', error: 'Something went wrong. Please try again.' }; } } diff --git a/apps/core/components/product-form/index.tsx b/apps/core/components/product-form/index.tsx index b7f6a0caf..6f0669fd4 100644 --- a/apps/core/components/product-form/index.tsx +++ b/apps/core/components/product-form/index.tsx @@ -33,7 +33,7 @@ export const ProductForm = ({ product }: { product: Product }) => { const result = await handleAddToCart(data); const quantity = Number(data.quantity); - if (result?.error) { + if (result.error) { toast.error(result.error || t('errorMessage'), { icon: , }); diff --git a/apps/core/components/quick-search/_actions/get-search-results.ts b/apps/core/components/quick-search/_actions/get-search-results.ts index c508180ad..214bc099f 100644 --- a/apps/core/components/quick-search/_actions/get-search-results.ts +++ b/apps/core/components/quick-search/_actions/get-search-results.ts @@ -3,9 +3,17 @@ import { getQuickSearchResults } from '~/client/queries/get-quick-search-results'; export async function getSearchResults(searchTerm: string) { - const searchResults = await getQuickSearchResults({ - searchTerm, - }); + try { + const searchResults = await getQuickSearchResults({ + searchTerm, + }); - return searchResults; + return { status: 'success', data: searchResults }; + } catch (error: unknown) { + if (error instanceof Error) { + return { status: 'error', error: error.message }; + } + + return { status: 'error', error: 'Something went wrong. Please try again.' }; + } } diff --git a/apps/core/components/quick-search/index.tsx b/apps/core/components/quick-search/index.tsx index aac5f7941..f7b01a748 100644 --- a/apps/core/components/quick-search/index.tsx +++ b/apps/core/components/quick-search/index.tsx @@ -43,7 +43,7 @@ const fetchSearchResults = debounce( term: string, setSearchResults: React.Dispatch>, ) => { - const searchResults = await getSearchResults(term); + const { data: searchResults } = await getSearchResults(term); if (isSearchQuery(searchResults)) { setSearchResults(searchResults);