summaryrefslogtreecommitdiff
path: root/src-migrate/utils/cart.js
diff options
context:
space:
mode:
Diffstat (limited to 'src-migrate/utils/cart.js')
-rw-r--r--src-migrate/utils/cart.js290
1 files changed, 290 insertions, 0 deletions
diff --git a/src-migrate/utils/cart.js b/src-migrate/utils/cart.js
new file mode 100644
index 00000000..431ff530
--- /dev/null
+++ b/src-migrate/utils/cart.js
@@ -0,0 +1,290 @@
+// cart-cookie-utils.js
+import Cookies from 'js-cookie';
+
+// Constants
+const CART_ITEMS_COOKIE = 'cart_data';
+const SELECTED_ITEMS_COOKIE = 'cart_selected_items';
+const COOKIE_EXPIRY_DAYS = 7; // Cookie akan berlaku selama 7 hari
+
+/**
+ * Mengambil data cart lengkap dari cookie
+ * @returns {Object} Object dengan key cart_id dan value cart item data lengkap
+ */
+export const getCartDataFromCookie = () => {
+ try {
+ const storedData = Cookies.get(CART_ITEMS_COOKIE);
+ return storedData ? JSON.parse(storedData) : {};
+ } catch (error) {
+ console.error('Error reading cart data from cookie:', error);
+ return {};
+ }
+};
+
+/**
+ * Menyimpan data cart lengkap ke cookie
+ * @param {Object} cartData Object dengan key cart_id dan value cart item data lengkap
+ */
+export const setCartDataToCookie = (cartData) => {
+ try {
+ Cookies.set(CART_ITEMS_COOKIE, JSON.stringify(cartData), {
+ expires: COOKIE_EXPIRY_DAYS,
+ path: '/',
+ sameSite: 'strict',
+ });
+ } catch (error) {
+ console.error('Error saving cart data to cookie:', error);
+ }
+};
+
+/**
+ * Mengambil state selected items dari cookie
+ * @returns {Object} Object dengan key product id dan value boolean selected status
+ */
+export const getSelectedItemsFromCookie = () => {
+ try {
+ const storedItems = Cookies.get(SELECTED_ITEMS_COOKIE);
+ return storedItems ? JSON.parse(storedItems) : {};
+ } catch (error) {
+ console.error('Error reading selected items from cookie:', error);
+ return {};
+ }
+};
+
+/**
+ * Menyimpan state selected items ke cookie
+ * @param {Object} items Object dengan key product id dan value boolean selected status
+ */
+export const setSelectedItemsToCookie = (items) => {
+ try {
+ Cookies.set(SELECTED_ITEMS_COOKIE, JSON.stringify(items), {
+ expires: COOKIE_EXPIRY_DAYS,
+ path: '/',
+ sameSite: 'strict',
+ });
+ } catch (error) {
+ console.error('Error saving selected items to cookie:', error);
+ }
+};
+
+/**
+ * Transform cart items dari format API ke format yang lebih simpel untuk disimpan di cookie
+ * @param {Array} cartItems Array cart items dari API
+ * @returns {Object} Object dengan key cart_id dan value cart item data
+ */
+export const transformCartItemsForCookie = (cartItems) => {
+ if (!cartItems || !Array.isArray(cartItems)) return {};
+
+ const cartData = {};
+
+ cartItems.forEach((item) => {
+ // Skip items yang tidak memiliki cart_id
+ if (!item.cart_id) return;
+
+ cartData[item.cart_id] = {
+ id: item.id,
+ cart_id: item.cart_id,
+ cart_type: item.cart_type,
+ product: item.product_id
+ ? {
+ id: item.product_id,
+ name: item.product_name || '',
+ }
+ : null,
+ program_line: item.program_line_id
+ ? {
+ id: item.program_line_id,
+ name: item.program_line_name || '',
+ }
+ : null,
+ quantity: item.quantity,
+ selected: item.selected,
+ price: item.price,
+ package_price: item.package_price,
+ source: item.source || 'add_to_cart',
+ };
+ });
+
+ return cartData;
+};
+
+/**
+ * Sinkronisasi cart data dan selected items dari server dengan cookie
+ * @param {Object} cart Cart object dari API
+ * @returns {Object} Object yang berisi updated cartData dan selectedItems
+ */
+export const syncCartWithCookie = (cart) => {
+ try {
+ if (!cart || !cart.products) return { needsUpdate: false };
+
+ // Transform data dari API ke format cookie
+ const serverCartData = transformCartItemsForCookie(cart.products);
+
+ // Ambil data lama dari cookie
+ const existingCartData = getCartDataFromCookie();
+
+ // Ambil selected status dari cookie
+ const selectedItems = getSelectedItemsFromCookie();
+
+ // Gabungkan data cart, prioritaskan data server
+ const mergedCartData = { ...existingCartData, ...serverCartData };
+
+ // Periksa apakah ada perbedaan status selected
+ let needsUpdate = false;
+
+ // Update selected status berdasarkan cookie jika ada
+ for (const cartId in mergedCartData) {
+ const item = mergedCartData[cartId];
+ if (item.id && selectedItems[item.id] !== undefined) {
+ // Jika status di cookie berbeda dengan di cart
+ if (item.selected !== selectedItems[item.id]) {
+ needsUpdate = true;
+ item.selected = selectedItems[item.id];
+ }
+ } else if (item.id) {
+ // Jika tidak ada di cookie, tambahkan dari cart
+ selectedItems[item.id] = item.selected;
+ }
+ }
+
+ // Simpan kembali ke cookie
+ setCartDataToCookie(mergedCartData);
+ setSelectedItemsToCookie(selectedItems);
+
+ return {
+ cartData: mergedCartData,
+ selectedItems,
+ needsUpdate,
+ };
+ } catch (error) {
+ console.error('Error syncing cart with cookie:', error);
+ return { needsUpdate: false };
+ }
+};
+
+/**
+ * Update selected status item di cookie
+ * @param {number} productId ID produk
+ * @param {boolean} isSelected Status selected baru
+ */
+export const updateSelectedItemInCookie = (productId, isSelected) => {
+ try {
+ const selectedItems = getSelectedItemsFromCookie();
+ selectedItems[productId] = isSelected;
+ setSelectedItemsToCookie(selectedItems);
+
+ // Update juga di cart data
+ const cartData = getCartDataFromCookie();
+
+ for (const cartId in cartData) {
+ const item = cartData[cartId];
+ if (item.id === productId) {
+ item.selected = isSelected;
+ }
+ }
+
+ setCartDataToCookie(cartData);
+
+ return { selectedItems, cartData };
+ } catch (error) {
+ console.error('Error updating selected item in cookie:', error);
+ return {};
+ }
+};
+
+/**
+ * Set semua item menjadi selected atau unselected di cookie
+ * @param {Array} productIds Array product IDs
+ * @param {boolean} isSelected Status selected baru
+ */
+export const setAllSelectedInCookie = (productIds, isSelected) => {
+ try {
+ const selectedItems = getSelectedItemsFromCookie();
+
+ productIds.forEach((id) => {
+ if (id) selectedItems[id] = isSelected;
+ });
+
+ setSelectedItemsToCookie(selectedItems);
+
+ // Update juga di cart data
+ const cartData = getCartDataFromCookie();
+
+ for (const cartId in cartData) {
+ if (productIds.includes(cartData[cartId].id)) {
+ cartData[cartId].selected = isSelected;
+ }
+ }
+
+ setCartDataToCookie(cartData);
+
+ return { selectedItems, cartData };
+ } catch (error) {
+ console.error('Error setting all selected in cookie:', error);
+ return {};
+ }
+};
+
+/**
+ * Hapus item dari cookie
+ * @param {Array} cartIds Array cart IDs untuk dihapus
+ */
+export const removeCartItemsFromCookie = (cartIds) => {
+ try {
+ const cartData = getCartDataFromCookie();
+ const selectedItems = getSelectedItemsFromCookie();
+ const productIdsToRemove = [];
+
+ // Hapus item dari cartData dan catat product IDs
+ cartIds.forEach((cartId) => {
+ if (cartData[cartId]) {
+ if (cartData[cartId].id) {
+ productIdsToRemove.push(cartData[cartId].id);
+ }
+ delete cartData[cartId];
+ }
+ });
+
+ // Hapus dari selectedItems
+ productIdsToRemove.forEach((productId) => {
+ if (selectedItems[productId] !== undefined) {
+ delete selectedItems[productId];
+ }
+ });
+
+ // Simpan kembali ke cookie
+ setCartDataToCookie(cartData);
+ setSelectedItemsToCookie(selectedItems);
+
+ return { cartData, selectedItems };
+ } catch (error) {
+ console.error('Error removing cart items from cookie:', error);
+ return {};
+ }
+};
+
+/**
+ * Force reset semua selected items ke unselected state
+ */
+export const forceResetAllSelectedItems = () => {
+ try {
+ const cartData = getCartDataFromCookie();
+ const selectedItems = {};
+
+ // Reset semua selected status di cartData
+ for (const cartId in cartData) {
+ cartData[cartId].selected = false;
+ if (cartData[cartId].id) {
+ selectedItems[cartData[cartId].id] = false;
+ }
+ }
+
+ // Simpan kembali ke cookie
+ setCartDataToCookie(cartData);
+ setSelectedItemsToCookie(selectedItems);
+
+ return { cartData, selectedItems };
+ } catch (error) {
+ console.error('Error resetting all selected items:', error);
+ return {};
+ }
+};