summaryrefslogtreecommitdiff
path: root/src-migrate/modules/cart/stores/useCartStore.ts
diff options
context:
space:
mode:
authorMiqdad <ahmadmiqdad27@gmail.com>2025-05-26 20:00:17 +0700
committerMiqdad <ahmadmiqdad27@gmail.com>2025-05-26 20:00:17 +0700
commit3feaad9127ff429b27f0eb69fa6ea539de2f2e8c (patch)
treed2b65790861531e08fd9eb3e1d1cd64eb5805e15 /src-migrate/modules/cart/stores/useCartStore.ts
parentcca6d803fc4db729865def23004ab1c4bd279e24 (diff)
<miqdad> Cleaning code
Diffstat (limited to 'src-migrate/modules/cart/stores/useCartStore.ts')
-rw-r--r--src-migrate/modules/cart/stores/useCartStore.ts198
1 files changed, 96 insertions, 102 deletions
diff --git a/src-migrate/modules/cart/stores/useCartStore.ts b/src-migrate/modules/cart/stores/useCartStore.ts
index d211304a..dc47b011 100644
--- a/src-migrate/modules/cart/stores/useCartStore.ts
+++ b/src-migrate/modules/cart/stores/useCartStore.ts
@@ -5,9 +5,6 @@ import {
syncCartWithCookie,
getCartDataFromCookie,
getSelectedItemsFromCookie,
- updateSelectedItemInCookie,
- setAllSelectedInCookie,
- removeCartItemsFromCookie,
forceResetAllSelectedItems,
} from '~/utils/cart';
@@ -26,8 +23,8 @@ type State = {
type Action = {
loadCart: (userId: number) => Promise<void>;
updateCartItem: (updateCart: CartProps) => void;
- syncCartWithCookieAndUpdate: (cart: CartProps) => { needsUpdate: boolean };
forceResetSelection: () => void;
+ clearCart: () => void;
};
export const useCartStore = create<State & Action>((set, get) => ({
@@ -42,154 +39,151 @@ export const useCartStore = create<State & Action>((set, get) => ({
},
loadCart: async (userId) => {
- if (get().isLoadCart === true) return;
+ if (get().isLoadCart) return;
set({ isLoadCart: true });
+
try {
- // Fetch cart from API
const cart: CartProps = (await getUserCart(userId)) as CartProps;
- // Sync with cookie and get updated data if needed
- const { needsUpdate } = get().syncCartWithCookieAndUpdate(cart);
-
- // If no update needed from cookie, just set the cart directly
- if (!needsUpdate) {
+ // Sync with cookie data
+ const syncResult = syncCartWithCookie(cart);
+
+ if (syncResult?.needsUpdate && cart.products) {
+ const selectedItems = getSelectedItemsFromCookie();
+
+ const updatedCart = {
+ ...cart,
+ products: cart.products.map((item) => ({
+ ...item,
+ selected:
+ selectedItems[item.id] !== undefined
+ ? selectedItems[item.id]
+ : item.selected,
+ })),
+ };
+
+ set({ cart: updatedCart });
+ } else {
set({ cart });
}
- // Update summary with current cart
+ // Update summary
const summary = computeSummary(get().cart!);
set({ summary });
} catch (error) {
- console.error('Failed to load cart from API:', error);
-
- // Fallback to cookie if API fails
- try {
- const cartData = getCartDataFromCookie();
- if (Object.keys(cartData).length > 0) {
- // Transform cart data from cookie to expected format
- const products = Object.values(cartData).map((item) => ({
- cart_id: item.cart_id,
- id: item.id,
- cart_type: item.cart_type,
- product_id: item.product?.id,
- product_name: item.product?.name,
- program_line_id: item.program_line?.id,
- program_line_name: item.program_line?.name,
- quantity: item.quantity,
- selected: item.selected,
- price: item.price,
- package_price: item.package_price,
- source: item.source,
- }));
-
- const fallbackCart: CartProps = {
- product_total: products.length,
- products,
- };
-
- set({ cart: fallbackCart });
- const summary = computeSummary(fallbackCart);
- set({ summary });
- }
- } catch (cookieError) {
- console.error('Failed to fallback to cookie:', cookieError);
- }
+ console.error('Failed to load cart:', error);
+
+ // Fallback to cookie data
+ await handleFallbackFromCookie();
} finally {
set({ isLoadCart: false });
}
},
updateCartItem: (updatedCart) => {
- const cart = get().cart;
- if (!cart) return;
-
set({ cart: updatedCart });
-
- // Sync updated cart with cookie
syncCartWithCookie(updatedCart);
const summary = computeSummary(updatedCart);
set({ summary });
},
- syncCartWithCookieAndUpdate: (cart) => {
- if (!cart) return { needsUpdate: false };
-
- // Sync cart with cookie
- const result = syncCartWithCookie(cart);
-
- // If we need to update the cart based on cookie data
- if (result.needsUpdate && cart.products) {
- // Create updated cart with selections from cookie
- const selectedItems = getSelectedItemsFromCookie();
-
- const updatedCart = {
- ...cart,
- products: cart.products.map((item) => ({
- ...item,
- selected:
- selectedItems[item.id] !== undefined
- ? selectedItems[item.id]
- : item.selected,
- })),
- };
-
- // Update the store
- set({ cart: updatedCart });
- }
-
- return result;
- },
-
forceResetSelection: () => {
const { cart } = get();
if (!cart) return;
- // Reset all selections in cookie
forceResetAllSelectedItems();
- // Update the cart in state
const updatedCart = {
...cart,
- products: cart.products.map((item) => ({
- ...item,
- selected: false,
- })),
+ products: cart.products.map((item) => ({ ...item, selected: false })),
};
set({ cart: updatedCart });
- // Update summary
const summary = computeSummary(updatedCart);
set({ summary });
},
+
+ clearCart: () => {
+ set({
+ cart: null,
+ summary: {
+ subtotal: 0,
+ discount: 0,
+ total: 0,
+ tax: 0,
+ grandTotal: 0,
+ },
+ });
+ },
}));
+// Helper function for cookie fallback
+const handleFallbackFromCookie = async () => {
+ try {
+ const cartData = getCartDataFromCookie();
+
+ if (Object.keys(cartData).length === 0) return;
+
+ const products = Object.values(cartData).map(transformCookieItemToProduct);
+
+ const fallbackCart: CartProps = {
+ product_total: products.length,
+ products,
+ };
+
+ useCartStore.setState({ cart: fallbackCart });
+
+ const summary = computeSummary(fallbackCart);
+ useCartStore.setState({ summary });
+ } catch (error) {
+ console.error('Cookie fallback failed:', error);
+ }
+};
+
+// Helper function to transform cookie item to product format
+const transformCookieItemToProduct = (item: any): CartItem => ({
+ cart_id: item.cart_id,
+ id: item.id,
+ cart_type: item.cart_type,
+ product_id: item.product?.id,
+ product_name: item.product?.name,
+ program_line_id: item.program_line?.id,
+ program_line_name: item.program_line?.name,
+ quantity: item.quantity,
+ selected: item.selected,
+ price: item.price,
+ package_price: item.package_price,
+ source: item.source,
+});
+
+// Helper function to compute cart summary
const computeSummary = (cart: CartProps) => {
+ if (!cart?.products) {
+ return { subtotal: 0, discount: 0, total: 0, grandTotal: 0, tax: 0 };
+ }
+
+ const PPN = parseFloat(process.env.NEXT_PUBLIC_PPN || '0');
let subtotal = 0;
let discount = 0;
- const PPN: number = process.env.NEXT_PUBLIC_PPN
- ? parseFloat(process.env.NEXT_PUBLIC_PPN)
- : 0;
-
- for (const item of cart?.products) {
+ for (const item of cart.products) {
if (!item.selected) continue;
- let price = 0;
- if (item.cart_type === 'promotion')
- price = (item?.package_price || 0) * item.quantity;
- else if (item.cart_type === 'product')
- price = item.price.price * item.quantity;
+ const price =
+ item.cart_type === 'promotion'
+ ? (item?.package_price || 0) * item.quantity
+ : item.price.price * item.quantity;
subtotal += price;
discount += price - item.price.price_discount * item.quantity;
}
- let total = subtotal - discount;
- let grandTotal = total * PPN;
- let tax = grandTotal - total;
- // let grandTotal = total + tax;
+
+ const total = subtotal - discount;
+ const grandTotal = total * (1 + PPN);
+ const tax = grandTotal - total;
return { subtotal, discount, total, grandTotal, tax };
-};
+}; \ No newline at end of file