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
JSX
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 });
},
}));