You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

202 lines
5.1 KiB

4 weeks ago
import { create } from 'zustand';
/**
* OrderItemBase
*/
export interface OrderItemBase {
/**
* Cart Item IdID
*/
cart_item_id?: number | null;
/**
* Offer IdID
*/
offer_id: number;
/**
* Product Image
*/
product_image?: null | string;
/**
* Product Name
*/
product_name: string;
/**
* Product Name Ar
*/
product_name_ar?: null | string;
/**
* Product Name En
*/
product_name_en?: null | string;
/**
* Product Name Fr
*/
product_name_fr?: null | string;
/**
* Quantity
*/
quantity: number;
/**
* Sku AttributesSKU属性
*/
sku_attributes?: { [key: string]: any }[] | null;
/**
* Sku IdSKU ID
*/
sku_id?: number | null;
/**
* Total Price
*/
total_price: number;
/**
* Unit Price
*/
unit_price: number;
[property: string]: any;
}
/**
* OrderCreate
*/
export interface OrderCreateRequest {
/**
* Actual Amount
*/
actual_amount?: number | null;
/**
* Address IdID
*/
address_id: number;
/**
* Buyer Message
*/
buyer_message?: null | string;
/**
* Create Payment
*/
create_payment?: boolean | null;
/**
* Currency
*/
currency?: null | string;
/**
* Discount Amount
*/
discount_amount?: number | null;
/**
* Domestic Shipping Fee
*/
domestic_shipping_fee?: number | null;
/**
* Items
*/
items: OrderItemBase[];
/**
* Payment Method
*/
payment_method?: null | string;
/**
* Receiver Address
*/
receiver_address: string;
/**
* Shipping Fee
*/
shipping_fee?: number | null;
/**
* Total Amount
*/
total_amount?: number | null;
/**
* Transport Type 1- 2-
*/
transport_type?: number | null;
[property: string]: any;
}
interface CreateOrderState {
orderData: OrderCreateRequest;
setOrderData: (data: Partial<OrderCreateRequest>) => void;
setOrderItems: (items: OrderItemBase[]) => void;
addOrderItem: (item: OrderItemBase) => void;
removeOrderItem: (offerId: number, skuId?: number | null) => void;
updateOrderItem: (item: Partial<OrderItemBase> & { offer_id: number, sku_id?: number | null }) => void;
resetOrder: () => void;
items: {cart_item_id: number}[];
setItems: (items: {cart_item_id: number}[]) => void;
}
const initialOrderData: OrderCreateRequest = {
address_id: 0,
items: [],
buyer_message: '',
payment_method: '',
create_payment: false,
actual_amount: 0,
discount_amount: 0,
shipping_fee: 0,
domestic_shipping_fee: 0,
currency: '',
receiver_address: '',
total_amount: 0,
transport_type: null
};
const useCreateOrderStore = create<CreateOrderState>((set) => ({
orderData: { ...initialOrderData },
setOrderData: (data: Partial<OrderCreateRequest>) => set((state) => ({
orderData: { ...state.orderData, ...data }
})),
setOrderItems: (items: OrderItemBase[]) => set((state) => ({
orderData: { ...state.orderData, items }
})),
addOrderItem: (item: OrderItemBase) => set((state) => {
const items = [...state.orderData.items, item];
return {
orderData: { ...state.orderData, items }
};
}),
removeOrderItem: (offerId: number, skuId?: number | null) => set((state) => {
const items = state.orderData.items.filter(item => {
if (skuId) {
return !(item.offer_id === offerId && item.sku_id === skuId);
}
return item.offer_id !== offerId;
});
return {
orderData: { ...state.orderData, items }
};
}),
updateOrderItem: (item: Partial<OrderItemBase> & { offer_id: number, sku_id?: number | null }) => set((state) => {
const items = state.orderData.items.map(existingItem => {
const matchesOfferId = existingItem.offer_id === item.offer_id;
const matchesSkuId = item.sku_id
? existingItem.sku_id === item.sku_id
: true;
if (matchesOfferId && matchesSkuId) {
return { ...existingItem, ...item };
}
return existingItem;
});
return {
orderData: { ...state.orderData, items }
};
}),
resetOrder: () => set({
orderData: { ...initialOrderData }
}),
items: [],
setItems: (items: {cart_item_id: number}[]) => set({ items })
}));
export default useCreateOrderStore;