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);