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.
325 lines
8.6 KiB
325 lines
8.6 KiB
3 weeks ago
|
import { Platform } from "react-native";
|
||
|
import { create } from 'zustand';
|
||
|
import useUserStore from "./user";
|
||
|
|
||
|
// 定义事件属性类型为灵活的记录类型
|
||
|
type EventProperty = Record<string, any>;
|
||
|
|
||
|
// 定义事件类型
|
||
|
type BurialEvent = {
|
||
|
event_name: string;
|
||
|
page_name: string | null;
|
||
|
referre_page: string | null; // 注意这里字段名已更正为referre_page
|
||
|
event_properties: EventProperty[];
|
||
|
}
|
||
|
|
||
|
// 定义产品属性类型
|
||
|
type ProductProperty = {
|
||
|
offer_id: number;
|
||
|
category_id: number;
|
||
|
price: number;
|
||
|
sku_id: number;
|
||
|
currency: string;
|
||
|
product_name: string;
|
||
|
timestamp: string;
|
||
|
product_img: string;
|
||
|
}
|
||
|
|
||
|
// 定义搜索属性类型
|
||
|
type SearchProperty = {
|
||
|
key_word: string;
|
||
|
timestamp: string;
|
||
|
}
|
||
|
|
||
|
// 定义地址信息属性类型
|
||
|
type AddressProperty = {
|
||
|
last_name: string;
|
||
|
first_name: string;
|
||
|
country: string;
|
||
|
phone_number: number;
|
||
|
whatsApp_number: number;
|
||
|
timestamp: string;
|
||
|
}
|
||
|
|
||
|
// 定义物流信息属性类型
|
||
|
type ShippingProperty = {
|
||
|
shipping_method: number;
|
||
|
shipping_price_outside: number;
|
||
|
shipping_price_within: number;
|
||
|
currency: string;
|
||
|
forwarder_name: string;
|
||
|
country_city: string;
|
||
|
timestamp: string;
|
||
|
product_list_text?: string;
|
||
|
}
|
||
|
|
||
|
// 定义支付方式属性类型
|
||
|
type PaymentProperty = {
|
||
|
pay_method: string;
|
||
|
offline_payment: number;
|
||
|
all_price: number;
|
||
|
currency: string;
|
||
|
pay_product?: string;
|
||
|
shipping_method: number;
|
||
|
shipping_price_outside: number;
|
||
|
shipping_price_within: number;
|
||
|
timestamp: string;
|
||
|
}
|
||
|
|
||
|
// 定义支付结账属性类型
|
||
|
type CheckoutProperty = {
|
||
|
is_suc: number;
|
||
|
all_price: number;
|
||
|
currency: string;
|
||
|
shipping_method: number;
|
||
|
shipping_price_outside: number;
|
||
|
shipping_price_within: number;
|
||
|
pay_product?: string;
|
||
|
timestamp: string;
|
||
|
}
|
||
|
|
||
|
// 生成唯一ID函数,替代md5
|
||
|
const generateUniqueId = () => {
|
||
|
return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
||
|
};
|
||
|
|
||
|
// 创建唯一的session_id
|
||
|
const SESSION_ID = generateUniqueId();
|
||
|
|
||
|
// 定义埋点store的状态
|
||
|
type BurialPointState = {
|
||
|
device_id: string;
|
||
|
version: string;
|
||
|
session_id: string;
|
||
|
event_list: BurialEvent[];
|
||
|
addEvent: (event: BurialEvent) => void;
|
||
|
logAppLaunch: (isSuccess?: boolean) => void;
|
||
|
logLogin: (isSuccess: boolean, loginMethod: string) => void;
|
||
|
logRegister: (isSuccess: boolean, registerMethod: string) => void;
|
||
|
logViewProduct: (productInfo: ProductProperty, fromPage?: string) => void;
|
||
|
logSearch: (keyword: string, fromPage?: string) => void;
|
||
|
logAddressInfo: (addressInfo: Omit<AddressProperty, "timestamp">, fromPage?: string) => void;
|
||
|
logShippingConfirm: (shippingInfo: Omit<ShippingProperty, "timestamp">, fromPage?: string) => void;
|
||
|
logPaymentConfirm: (paymentInfo: Omit<PaymentProperty, "timestamp">, fromPage?: string) => void;
|
||
|
logPreviewOrder: (fromPage?: string) => void;
|
||
|
logCheckout: (checkoutInfo: Omit<CheckoutProperty, "timestamp">, fromPage?: string) => void;
|
||
|
clearData: () => void;
|
||
|
}
|
||
|
|
||
|
// 获取当前格式化的时间字符串 YYYY-MM-DD HH:MM:SS
|
||
|
const getCurrentFormattedTime = (): string => {
|
||
|
return new Date().toISOString().replace('T', ' ').substr(0, 19);
|
||
|
};
|
||
|
|
||
|
// 创建埋点store
|
||
|
const useBurialPointStore = create<BurialPointState>((set, get) => ({
|
||
|
device_id: Platform.OS,
|
||
|
version: generateUniqueId(),
|
||
|
session_id: SESSION_ID,
|
||
|
event_list: [],
|
||
|
|
||
|
// 添加事件
|
||
|
addEvent: (event: BurialEvent) => {
|
||
|
set((state) => {
|
||
|
const newEventList = [...state.event_list, event];
|
||
|
|
||
|
// 检查是否需要清理数据
|
||
|
if (newEventList.length >= 10) {
|
||
|
// 这里可以在清理前添加发送数据到服务器的逻辑
|
||
|
console.log('Data cleared, event count:', newEventList.length);
|
||
|
return { event_list: [] };
|
||
|
}
|
||
|
|
||
|
return { event_list: newEventList };
|
||
|
});
|
||
|
},
|
||
|
|
||
|
// 记录应用启动埋点
|
||
|
logAppLaunch: (isSuccess = true) => {
|
||
|
const appLaunchEvent: BurialEvent = {
|
||
|
event_name: "app_launch",
|
||
|
page_name: null,
|
||
|
referre_page: null,
|
||
|
event_properties: [
|
||
|
{
|
||
|
is_open: isSuccess ? 1 : 0, // 1表示成功,0表示失败
|
||
|
timestamp: getCurrentFormattedTime()
|
||
|
}
|
||
|
]
|
||
|
};
|
||
|
|
||
|
get().addEvent(appLaunchEvent);
|
||
|
},
|
||
|
|
||
|
// 记录登录事件埋点
|
||
|
logLogin: (isSuccess = true, loginMethod = "phone") => {
|
||
|
const loginEvent: BurialEvent = {
|
||
|
event_name: "login",
|
||
|
page_name: null,
|
||
|
referre_page: null,
|
||
|
event_properties: [
|
||
|
{
|
||
|
is_login: isSuccess ? 1 : 0, // 1表示成功,0表示失败
|
||
|
login_method: loginMethod, // 登录方式
|
||
|
timestamp: getCurrentFormattedTime()
|
||
|
}
|
||
|
]
|
||
|
};
|
||
|
|
||
|
get().addEvent(loginEvent);
|
||
|
},
|
||
|
|
||
|
// 记录注册事件埋点
|
||
|
logRegister: (isSuccess = true, registerMethod = "phone") => {
|
||
|
const registerEvent: BurialEvent = {
|
||
|
event_name: "register",
|
||
|
page_name: null,
|
||
|
referre_page: null,
|
||
|
event_properties: [
|
||
|
{
|
||
|
is_register: isSuccess ? 1 : 0, // 1表示成功,0表示失败
|
||
|
register_method: registerMethod, // 注册方式
|
||
|
timestamp: getCurrentFormattedTime()
|
||
|
}
|
||
|
]
|
||
|
};
|
||
|
|
||
|
get().addEvent(registerEvent);
|
||
|
},
|
||
|
|
||
|
// 记录浏览商品事件埋点
|
||
|
logViewProduct: (productInfo: ProductProperty, fromPage = "home") => {
|
||
|
const viewProductEvent: BurialEvent = {
|
||
|
event_name: "view-product",
|
||
|
page_name: "product",
|
||
|
referre_page: fromPage,
|
||
|
event_properties: [productInfo]
|
||
|
};
|
||
|
|
||
|
get().addEvent(viewProductEvent);
|
||
|
},
|
||
|
|
||
|
// 记录搜索事件埋点
|
||
|
logSearch: (keyword: string, fromPage = "home") => {
|
||
|
const searchEvent: BurialEvent = {
|
||
|
event_name: "search",
|
||
|
page_name: "search",
|
||
|
referre_page: fromPage,
|
||
|
event_properties: [
|
||
|
{
|
||
|
key_word: keyword,
|
||
|
timestamp: getCurrentFormattedTime()
|
||
|
}
|
||
|
]
|
||
|
};
|
||
|
|
||
|
get().addEvent(searchEvent);
|
||
|
},
|
||
|
|
||
|
// 记录填写地址信息事件埋点
|
||
|
logAddressInfo: (addressInfo: Omit<AddressProperty, "timestamp">, fromPage = "cart") => {
|
||
|
const addressEvent: BurialEvent = {
|
||
|
event_name: "fill_information",
|
||
|
page_name: "address",
|
||
|
referre_page: fromPage,
|
||
|
event_properties: [
|
||
|
{
|
||
|
...addressInfo,
|
||
|
timestamp: getCurrentFormattedTime()
|
||
|
}
|
||
|
]
|
||
|
};
|
||
|
|
||
|
get().addEvent(addressEvent);
|
||
|
},
|
||
|
|
||
|
// 记录物流信息确认事件埋点
|
||
|
logShippingConfirm: (shippingInfo: Omit<ShippingProperty, "timestamp">, fromPage = "address") => {
|
||
|
const shippingEvent: BurialEvent = {
|
||
|
event_name: "shipping_confirm",
|
||
|
page_name: "shipping",
|
||
|
referre_page: fromPage,
|
||
|
event_properties: [
|
||
|
{
|
||
|
...shippingInfo,
|
||
|
timestamp: getCurrentFormattedTime()
|
||
|
}
|
||
|
]
|
||
|
};
|
||
|
|
||
|
get().addEvent(shippingEvent);
|
||
|
},
|
||
|
|
||
|
// 记录支付方式确认事件埋点
|
||
|
logPaymentConfirm: (paymentInfo: Omit<PaymentProperty, "timestamp">, fromPage = "shipping") => {
|
||
|
const paymentEvent: BurialEvent = {
|
||
|
event_name: "payment_confirm",
|
||
|
page_name: "pay_method",
|
||
|
referre_page: fromPage,
|
||
|
event_properties: [
|
||
|
{
|
||
|
...paymentInfo,
|
||
|
timestamp: getCurrentFormattedTime()
|
||
|
}
|
||
|
]
|
||
|
};
|
||
|
|
||
|
get().addEvent(paymentEvent);
|
||
|
},
|
||
|
|
||
|
// 记录预览订单事件埋点
|
||
|
logPreviewOrder: (fromPage = "pay_method") => {
|
||
|
const previewEvent: BurialEvent = {
|
||
|
event_name: "preview_order",
|
||
|
page_name: "preview",
|
||
|
referre_page: fromPage,
|
||
|
event_properties: [
|
||
|
{
|
||
|
timestamp: getCurrentFormattedTime()
|
||
|
}
|
||
|
]
|
||
|
};
|
||
|
|
||
|
get().addEvent(previewEvent);
|
||
|
},
|
||
|
|
||
|
// 记录支付结账事件埋点
|
||
|
logCheckout: (checkoutInfo: Omit<CheckoutProperty, "timestamp">, fromPage = "perview") => {
|
||
|
const checkoutEvent: BurialEvent = {
|
||
|
event_name: "check_out",
|
||
|
page_name: "pay",
|
||
|
referre_page: fromPage,
|
||
|
event_properties: [
|
||
|
{
|
||
|
...checkoutInfo,
|
||
|
timestamp: getCurrentFormattedTime()
|
||
|
}
|
||
|
]
|
||
|
};
|
||
|
|
||
|
get().addEvent(checkoutEvent);
|
||
|
},
|
||
|
|
||
|
// 清空数据
|
||
|
clearData: () => {
|
||
|
// 这里可以添加发送数据到服务器的逻辑
|
||
|
console.log('Data cleared, event count:', get().event_list.length);
|
||
|
set({ event_list: [] });
|
||
|
}
|
||
|
}));
|
||
|
|
||
|
// 获取埋点数据,包括从userStore获取的user_id
|
||
|
export const getBurialPointData = () => {
|
||
|
const burialState = useBurialPointStore.getState();
|
||
|
const user = useUserStore.getState().user;
|
||
|
|
||
|
return {
|
||
|
user_id: user?.user_id || null,
|
||
|
device_id: burialState.device_id,
|
||
|
version: burialState.version,
|
||
|
session_id: burialState.session_id,
|
||
|
event_list: burialState.event_list
|
||
|
};
|
||
|
};
|
||
|
|
||
|
export default useBurialPointStore;
|