UNPKG

test-iki-mini-app

Version:

ứng dựng bán hàng trên mini app z a l o

272 lines (254 loc) 6.96 kB
import { create } from "zustand"; import { RepositoryRemote } from "../services"; import { alerts } from "../utils/alerts"; const initialState = { cartInfo: localStorage.getItem("cartInfo") ? JSON.parse(localStorage.getItem("cartInfo") || "") : { line_items: [], total_after_discount: 0, total_before_discount: 0, product_discount_amount: 0, voucherStatus: 0, }, shipmentFee: [], paymentMethod: [], isUseDiscountPrice: { is_use_points: false, is_use_balance_collaborator: false, is_use_balance_agency: false, }, customerInfo: { customer_address_id: "", customer_note: "", }, shipmentInfo: { name: "", description: "", ship_speed_code: "", partner_id: "", fee: 0, }, paymentInfo: { id: "", name: "", payment_method_id: "", }, defaultAddress: {}, codeVoucher: "", order_code: "", }; export const useCartStore = create((set, get) => ({ ...initialState, loading: false, loadingCart: false, loadingPaymentMethod: false, loadingShipmentFee: false, loadingOrder: false, loadingAddToCart: false, setDefaultAddress: (newDefaultAddress) => { const state = get(); set({ defaultAddress: { ...state.defaultAddress, ...newDefaultAddress, }, }); }, setShipmentInfo: (newShipmentInfo) => { const state = get(); set({ shipmentInfo: { ...state.shipmentInfo, ...newShipmentInfo, }, }); }, setPaymentInfo: (newPaymentInfo) => { const state = get(); set({ paymentInfo: { ...state.paymentInfo, ...newPaymentInfo, }, }); }, setIsUseDiscountPrice: (isUseDiscount) => { const state = get(); set({ isUseDiscountPrice: { ...state.isUseDiscountPrice, ...isUseDiscount }, }); }, setCustomerInfo: (customer) => { const state = get(); set({ customerInfo: { ...state.customerInfo, ...customer }, }); }, setCodeVoucher: (codeVoucher) => { set({ codeVoucher: codeVoucher, }); }, setOrderCode: (orderCode) => { set({ order_code: orderCode, }); }, resetShipmentInfo: () => { set({ shipmentInfo: { name: "", description: "", ship_speed_code: "", partner_id: "", fee: 0, }, }); }, orderSuccess: () => { localStorage.removeItem("cartInfo"); localStorage.removeItem("total_shipping_fee"); set(initialState); }, getCart: async (info = {}, onSuccess = () => {}) => { try { set({ loadingCart: true }); const state = get(); const data = { ...state.isUseDiscountPrice, code_voucher: state.codeVoucher, ...info, }; const response = await RepositoryRemote.cart.applyDiscount(data); localStorage.setItem("cartInfo", JSON.stringify(response.data.data)); if (info.total_shipping_fee) { localStorage.setItem( "total_shipping_fee", JSON.stringify(info.total_shipping_fee) ); } set({ cartInfo: response.data.data }); if (onSuccess) onSuccess(); } catch (error) { alerts.error(error.response.data.msg); } set({ loadingCart: false }); }, getPaymentMethods: async (onSuccess = () => {}) => { try { set({ loadingPaymentMethod: true }); const response = await RepositoryRemote.cart.getPaymentMethods(); set({ paymentMethod: response.data.data }); if (onSuccess) onSuccess(); } catch (error) { alerts.error(msgCode); } set({ loadingPaymentMethod: false }); }, changeQuantityInCart: async ( product, defaultAddress, onSuccess = () => {} ) => { try { set({ loading: true }); const response = await RepositoryRemote.cart.changeQuantityInCart( product ); localStorage.setItem("cartInfo", JSON.stringify(response.data)); if (product.quantity === 0) { alerts.success("Xóa sản phẩm khỏi giỏ hàng thành công !"); } const state = get(); state.applyDiscount(); if (Object.entries(defaultAddress).length > 0) { state.postListShipperFee(defaultAddress?.id); } onSuccess(); } catch (error) { const msgCode = error.response.data.msg; if ( msgCode === "NOT_ENOUGH_USE_VOUCHER" || msgCode === "NO_VOUCHER_EXISTS" ) { localStorage.removeItem("code_voucher"); } alerts.error(msgCode); } set({ loading: false }); }, applyDiscount: async (info = {}, onSuccess = () => {}) => { try { set({ loadingShipmentFee: true }); const state = get(); const data = { ...state.isUseDiscountPrice, code_voucher: state.codeVoucher, ...info, }; const response = await RepositoryRemote.cart.applyDiscount(data); localStorage.setItem("cartInfo", JSON.stringify(response.data.data)); if (info.total_shipping_fee) { localStorage.setItem( "total_shipping_fee", JSON.stringify(info.total_shipping_fee) ); } set({ cartInfo: response.data.data }); if (onSuccess) onSuccess(); } catch (error) { alerts.error(error.response.data.msg); } set({ loadingShipmentFee: false }); }, postListShipperFee: async (idAddress, dataAddress, onSuccess = () => {}) => { try { set({ loading: true }); const response = await RepositoryRemote.cart.postListShipperFee( idAddress, dataAddress ); const data = []; for (var element of response.data.data) { const resService = await RepositoryRemote.cart.postShipmentFeeForEachService( idAddress, dataAddress, element.partner_id ); if (resService?.data?.data?.fee_with_type_ship?.length > 0) { data.push(resService.data.data); } set({ shipmentFee: data }); } onSuccess(); } catch (error) { alerts.error(error.response.data.msg); } set({ loading: false }); }, orderCart: async (data, onSuccess = () => {}) => { try { set({ loadingOrder: true }); const response = await RepositoryRemote.cart.orderCart(data); set({ order_code: response.data.data.order_code }); if (onSuccess) onSuccess(); } catch (error) { alerts.error(error.response.data.msg); } set({ loadingOrder: false }); }, addCart: async (data, onSuccess = () => {}) => { try { set({ loadingAddToCart: true }); const response = await RepositoryRemote.cart.addCart(data); set({ cartInfo: response.data.data }); localStorage.setItem("cartInfo", JSON.stringify(response.data.data)); if (onSuccess) onSuccess(); } catch (error) { alerts.error(error.response.data.msg); } set({ loadingAddToCart: false }); }, }));