tracking-lib-ott 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +193 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +81 -0
- package/dist/index.d.ts +81 -0
- package/dist/index.js +163 -0
- package/dist/index.js.map +1 -0
- package/package.json +22 -0
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/index.ts
|
|
21
|
+
var index_exports = {};
|
|
22
|
+
__export(index_exports, {
|
|
23
|
+
default: () => index_default,
|
|
24
|
+
getPageInfo: () => getPageInfo,
|
|
25
|
+
initTracking: () => initTracking,
|
|
26
|
+
sendEvent: () => sendEvent,
|
|
27
|
+
trackEvent: () => trackEvent,
|
|
28
|
+
trackPageView: () => trackPageView,
|
|
29
|
+
usePageViewTracking: () => usePageViewTracking
|
|
30
|
+
});
|
|
31
|
+
module.exports = __toCommonJS(index_exports);
|
|
32
|
+
var defaultConfig = {
|
|
33
|
+
baseURL: "",
|
|
34
|
+
appName: "on_plus",
|
|
35
|
+
appId: "",
|
|
36
|
+
packageId: "com.vtvcab.onsportstv",
|
|
37
|
+
platform: "Web",
|
|
38
|
+
debug: false,
|
|
39
|
+
// Required properties
|
|
40
|
+
session_id: "",
|
|
41
|
+
session_sign: "",
|
|
42
|
+
user_id: -1,
|
|
43
|
+
deviceId: "",
|
|
44
|
+
deviceModel: "",
|
|
45
|
+
deviceBrand: "",
|
|
46
|
+
ip_address: "",
|
|
47
|
+
// Optional properties
|
|
48
|
+
ad_id: "",
|
|
49
|
+
os_version: "",
|
|
50
|
+
net_type: "",
|
|
51
|
+
carrier_net: "",
|
|
52
|
+
sdk_version: "",
|
|
53
|
+
app_version: "",
|
|
54
|
+
build_number: "",
|
|
55
|
+
language: "",
|
|
56
|
+
country: "",
|
|
57
|
+
events: []
|
|
58
|
+
};
|
|
59
|
+
var config = { ...defaultConfig };
|
|
60
|
+
var previousPageId = null;
|
|
61
|
+
var pageMap = {
|
|
62
|
+
"": { name: "Home", id: "home" },
|
|
63
|
+
home: { name: "Home", id: "home" },
|
|
64
|
+
search: { name: "Search", id: "search" },
|
|
65
|
+
detail: { name: "Detail", id: "detail" },
|
|
66
|
+
player: { name: "Player", id: "player" },
|
|
67
|
+
video: { name: "Video", id: "video" },
|
|
68
|
+
live: { name: "Live", id: "live" },
|
|
69
|
+
category: { name: "Category", id: "category" },
|
|
70
|
+
profile: { name: "Profile", id: "profile" },
|
|
71
|
+
login: { name: "Login", id: "login" }
|
|
72
|
+
};
|
|
73
|
+
var initTracking = (options = {}) => {
|
|
74
|
+
config = { ...config, ...options };
|
|
75
|
+
if (options.pageMap) {
|
|
76
|
+
pageMap = { ...pageMap, ...options.pageMap };
|
|
77
|
+
}
|
|
78
|
+
if (!config.baseURL) {
|
|
79
|
+
console.warn("[Tracking] baseURL is required.");
|
|
80
|
+
}
|
|
81
|
+
if (config.debug) {
|
|
82
|
+
console.log("[Tracking] Initialized with config:", config);
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
var getPageInfo = (url) => {
|
|
86
|
+
const path = (url || "").split("?")[0];
|
|
87
|
+
const pathSegment = path.split("/").filter(Boolean)[0] || "home";
|
|
88
|
+
return pageMap[pathSegment] || {
|
|
89
|
+
name: pathSegment.charAt(0).toUpperCase() + pathSegment.slice(1),
|
|
90
|
+
id: pathSegment
|
|
91
|
+
};
|
|
92
|
+
};
|
|
93
|
+
var sendEvent = async (eventData) => {
|
|
94
|
+
if (!config.baseURL) {
|
|
95
|
+
console.warn("[Tracking] Not initialized. Call initTracking() first.");
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
try {
|
|
99
|
+
const payload = {
|
|
100
|
+
// Required properties
|
|
101
|
+
app_name: config.appName,
|
|
102
|
+
app_id: config.appId,
|
|
103
|
+
package_id: config.packageId,
|
|
104
|
+
platform: config.platform,
|
|
105
|
+
session_id: config.session_id,
|
|
106
|
+
session_sign: config.session_sign,
|
|
107
|
+
user_id: config.user_id,
|
|
108
|
+
device_id: config.deviceId,
|
|
109
|
+
device_model: config.deviceModel,
|
|
110
|
+
device_brand: config.deviceBrand,
|
|
111
|
+
ip_address: config.ip_address,
|
|
112
|
+
// Optional properties
|
|
113
|
+
ad_id: config.ad_id,
|
|
114
|
+
os_version: config.os_version,
|
|
115
|
+
net_type: config.net_type,
|
|
116
|
+
carrier_net: config.carrier_net,
|
|
117
|
+
sdk_version: config.sdk_version,
|
|
118
|
+
app_version: config.app_version,
|
|
119
|
+
build_number: config.build_number,
|
|
120
|
+
language: config.language,
|
|
121
|
+
country: config.country,
|
|
122
|
+
// Events batch (tuỳ backend)
|
|
123
|
+
events: config.events ?? [],
|
|
124
|
+
// Data riêng cho event
|
|
125
|
+
...eventData
|
|
126
|
+
};
|
|
127
|
+
if (config.debug) {
|
|
128
|
+
console.log("[Tracking] Sending event:", payload);
|
|
129
|
+
}
|
|
130
|
+
const res = await fetch(config.baseURL, {
|
|
131
|
+
method: "POST",
|
|
132
|
+
headers: { "Content-Type": "application/json" },
|
|
133
|
+
body: JSON.stringify(payload)
|
|
134
|
+
});
|
|
135
|
+
if (!res.ok && config.debug) {
|
|
136
|
+
const text = await res.text().catch(() => "");
|
|
137
|
+
console.error("[Tracking] HTTP Error:", res.status, text);
|
|
138
|
+
}
|
|
139
|
+
return res;
|
|
140
|
+
} catch (error) {
|
|
141
|
+
if (config.debug) {
|
|
142
|
+
console.error("[Tracking] Error:", error);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
var trackPageView = (url) => {
|
|
147
|
+
const pageInfo = getPageInfo(url);
|
|
148
|
+
sendEvent({
|
|
149
|
+
event_name: "page_view",
|
|
150
|
+
page_name: pageInfo.name,
|
|
151
|
+
page_id: pageInfo.id,
|
|
152
|
+
page_path: url,
|
|
153
|
+
referrer_page_id: previousPageId || ""
|
|
154
|
+
});
|
|
155
|
+
previousPageId = pageInfo.id;
|
|
156
|
+
};
|
|
157
|
+
var trackEvent = (eventName, params = {}) => {
|
|
158
|
+
sendEvent({
|
|
159
|
+
event_name: eventName,
|
|
160
|
+
...params
|
|
161
|
+
});
|
|
162
|
+
};
|
|
163
|
+
var usePageViewTracking = (router) => {
|
|
164
|
+
if (typeof window === "undefined") return;
|
|
165
|
+
if (!router) return;
|
|
166
|
+
trackPageView(router.asPath);
|
|
167
|
+
const handleRouteChange = (url) => {
|
|
168
|
+
trackPageView(url);
|
|
169
|
+
};
|
|
170
|
+
router.events.on("routeChangeComplete", handleRouteChange);
|
|
171
|
+
return () => {
|
|
172
|
+
router.events.off("routeChangeComplete", handleRouteChange);
|
|
173
|
+
};
|
|
174
|
+
};
|
|
175
|
+
var tracking = {
|
|
176
|
+
init: initTracking,
|
|
177
|
+
trackPageView,
|
|
178
|
+
trackEvent,
|
|
179
|
+
sendEvent,
|
|
180
|
+
getPageInfo,
|
|
181
|
+
usePageViewTracking
|
|
182
|
+
};
|
|
183
|
+
var index_default = tracking;
|
|
184
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
185
|
+
0 && (module.exports = {
|
|
186
|
+
getPageInfo,
|
|
187
|
+
initTracking,
|
|
188
|
+
sendEvent,
|
|
189
|
+
trackEvent,
|
|
190
|
+
trackPageView,
|
|
191
|
+
usePageViewTracking
|
|
192
|
+
});
|
|
193
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\r\n * Tracking Library v2 (Fetch + TypeScript)\r\n * Thư viện tracking events có thể dùng cho nhiều project\r\n */\r\n\r\nexport type TrackingConfig = {\r\n baseURL: string;\r\n appName?: string;\r\n appId?: string;\r\n packageId?: string;\r\n platform?: \"Web\" | \"Ios\" | \"Android\" | string;\r\n debug?: boolean;\r\n\r\n // Required properties\r\n session_id: string;\r\n session_sign: string;\r\n user_id: number;\r\n deviceId: string;\r\n deviceModel: string;\r\n deviceBrand: string;\r\n ip_address: string;\r\n\r\n // Optional properties\r\n ad_id?: string;\r\n os_version?: string;\r\n net_type?: string;\r\n carrier_net?: string;\r\n sdk_version?: string;\r\n app_version?: string;\r\n build_number?: string;\r\n language?: string;\r\n country?: string;\r\n\r\n // Optional: events (nếu backend cần batch)\r\n events?: any[];\r\n};\r\n\r\nexport type PageInfo = {\r\n name: string;\r\n id: string;\r\n};\r\n\r\nexport type PageMap = Record<string, PageInfo>;\r\n\r\nexport type EventData = Record<string, any>;\r\n\r\nconst defaultConfig: TrackingConfig = {\r\n baseURL: \"\",\r\n appName: \"on_plus\",\r\n appId: \"\",\r\n packageId: \"com.vtvcab.onsportstv\",\r\n platform: \"Web\",\r\n debug: false,\r\n\r\n // Required properties\r\n session_id: \"\",\r\n session_sign: \"\",\r\n user_id: -1,\r\n deviceId: \"\",\r\n deviceModel: \"\",\r\n deviceBrand: \"\",\r\n ip_address: \"\",\r\n\r\n // Optional properties\r\n ad_id: \"\",\r\n os_version: \"\",\r\n net_type: \"\",\r\n carrier_net: \"\",\r\n sdk_version: \"\",\r\n app_version: \"\",\r\n build_number: \"\",\r\n language: \"\",\r\n country: \"\",\r\n\r\n events: [],\r\n};\r\n\r\n// Config runtime\r\nlet config: TrackingConfig = { ...defaultConfig };\r\n\r\n// State\r\nlet previousPageId: string | null = null;\r\n\r\n// Page mapping\r\nlet pageMap: any = {\r\n \"\": { name: \"Home\", id: \"home\" },\r\n home: { name: \"Home\", id: \"home\" },\r\n search: { name: \"Search\", id: \"search\" },\r\n detail: { name: \"Detail\", id: \"detail\" },\r\n player: { name: \"Player\", id: \"player\" },\r\n video: { name: \"Video\", id: \"video\" },\r\n live: { name: \"Live\", id: \"live\" },\r\n category: { name: \"Category\", id: \"category\" },\r\n profile: { name: \"Profile\", id: \"profile\" },\r\n login: { name: \"Login\", id: \"login\" },\r\n};\r\n\r\n/**\r\n * Khởi tạo tracking với config\r\n */\r\nexport const initTracking = (\r\n options: Partial<TrackingConfig> & { pageMap?: Partial<PageMap> } = {},\r\n) => {\r\n config = { ...config, ...options };\r\n\r\n if (options.pageMap) {\r\n pageMap = { ...pageMap, ...options.pageMap };\r\n }\r\n\r\n if (!config.baseURL) {\r\n console.warn(\"[Tracking] baseURL is required.\");\r\n }\r\n\r\n if (config.debug) {\r\n console.log(\"[Tracking] Initialized with config:\", config);\r\n }\r\n};\r\n\r\n/**\r\n * Lấy thông tin page từ URL\r\n */\r\nexport const getPageInfo = (url: string): PageInfo => {\r\n const path = (url || \"\").split(\"?\")[0];\r\n const pathSegment = path.split(\"/\").filter(Boolean)[0] || \"home\";\r\n\r\n return (\r\n pageMap[pathSegment] || {\r\n name: pathSegment.charAt(0).toUpperCase() + pathSegment.slice(1),\r\n id: pathSegment,\r\n }\r\n );\r\n};\r\n\r\n/**\r\n * Send Event -> POST JSON\r\n */\r\nexport const sendEvent = async (\r\n eventData: EventData,\r\n): Promise<Response | void> => {\r\n if (!config.baseURL) {\r\n console.warn(\"[Tracking] Not initialized. Call initTracking() first.\");\r\n return;\r\n }\r\n\r\n try {\r\n const payload = {\r\n // Required properties\r\n app_name: config.appName,\r\n app_id: config.appId,\r\n package_id: config.packageId,\r\n platform: config.platform,\r\n\r\n session_id: config.session_id,\r\n session_sign: config.session_sign,\r\n user_id: config.user_id,\r\n\r\n device_id: config.deviceId,\r\n device_model: config.deviceModel,\r\n device_brand: config.deviceBrand,\r\n ip_address: config.ip_address,\r\n\r\n // Optional properties\r\n ad_id: config.ad_id,\r\n os_version: config.os_version,\r\n net_type: config.net_type,\r\n carrier_net: config.carrier_net,\r\n sdk_version: config.sdk_version,\r\n app_version: config.app_version,\r\n build_number: config.build_number,\r\n language: config.language,\r\n country: config.country,\r\n\r\n // Events batch (tuỳ backend)\r\n events: config.events ?? [],\r\n\r\n // Data riêng cho event\r\n ...eventData,\r\n };\r\n\r\n if (config.debug) {\r\n console.log(\"[Tracking] Sending event:\", payload);\r\n }\r\n\r\n const res = await fetch(config.baseURL, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(payload),\r\n });\r\n\r\n if (!res.ok && config.debug) {\r\n const text = await res.text().catch(() => \"\");\r\n console.error(\"[Tracking] HTTP Error:\", res.status, text);\r\n }\r\n\r\n return res;\r\n } catch (error) {\r\n if (config.debug) {\r\n console.error(\"[Tracking] Error:\", error);\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * Track page view event\r\n */\r\nexport const trackPageView = (url: string) => {\r\n const pageInfo = getPageInfo(url);\r\n\r\n sendEvent({\r\n event_name: \"page_view\",\r\n page_name: pageInfo.name,\r\n page_id: pageInfo.id,\r\n page_path: url,\r\n referrer_page_id: previousPageId || \"\",\r\n });\r\n\r\n previousPageId = pageInfo.id;\r\n};\r\n\r\n/**\r\n * Track custom event\r\n */\r\nexport const trackEvent = (eventName: string, params: EventData = {}) => {\r\n sendEvent({\r\n event_name: eventName,\r\n ...params,\r\n });\r\n};\r\n\r\n/**\r\n * Hook cho Next.js - auto track page views\r\n * Dùng cho Next.js Pages Router (next/router)\r\n */\r\nexport type NextRouterLike = {\r\n asPath: string;\r\n events: {\r\n on: (event: \"routeChangeComplete\", cb: (url: string) => void) => void;\r\n off: (event: \"routeChangeComplete\", cb: (url: string) => void) => void;\r\n };\r\n};\r\n\r\nexport const usePageViewTracking = (router: NextRouterLike) => {\r\n if (typeof window === \"undefined\") return;\r\n if (!router) return;\r\n\r\n // Track initial page\r\n trackPageView(router.asPath);\r\n\r\n const handleRouteChange = (url: string) => {\r\n trackPageView(url);\r\n };\r\n\r\n router.events.on(\"routeChangeComplete\", handleRouteChange);\r\n\r\n return () => {\r\n router.events.off(\"routeChangeComplete\", handleRouteChange);\r\n };\r\n};\r\n\r\n// Export default object\r\nconst tracking = {\r\n init: initTracking,\r\n trackPageView,\r\n trackEvent,\r\n sendEvent,\r\n getPageInfo,\r\n usePageViewTracking,\r\n};\r\n\r\nexport default tracking;\r\n"],"mappings":"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","names":[]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tracking Library v2 (Fetch + TypeScript)
|
|
3
|
+
* Thư viện tracking events có thể dùng cho nhiều project
|
|
4
|
+
*/
|
|
5
|
+
type TrackingConfig = {
|
|
6
|
+
baseURL: string;
|
|
7
|
+
appName?: string;
|
|
8
|
+
appId?: string;
|
|
9
|
+
packageId?: string;
|
|
10
|
+
platform?: "Web" | "Ios" | "Android" | string;
|
|
11
|
+
debug?: boolean;
|
|
12
|
+
session_id: string;
|
|
13
|
+
session_sign: string;
|
|
14
|
+
user_id: number;
|
|
15
|
+
deviceId: string;
|
|
16
|
+
deviceModel: string;
|
|
17
|
+
deviceBrand: string;
|
|
18
|
+
ip_address: string;
|
|
19
|
+
ad_id?: string;
|
|
20
|
+
os_version?: string;
|
|
21
|
+
net_type?: string;
|
|
22
|
+
carrier_net?: string;
|
|
23
|
+
sdk_version?: string;
|
|
24
|
+
app_version?: string;
|
|
25
|
+
build_number?: string;
|
|
26
|
+
language?: string;
|
|
27
|
+
country?: string;
|
|
28
|
+
events?: any[];
|
|
29
|
+
};
|
|
30
|
+
type PageInfo = {
|
|
31
|
+
name: string;
|
|
32
|
+
id: string;
|
|
33
|
+
};
|
|
34
|
+
type PageMap = Record<string, PageInfo>;
|
|
35
|
+
type EventData = Record<string, any>;
|
|
36
|
+
/**
|
|
37
|
+
* Khởi tạo tracking với config
|
|
38
|
+
*/
|
|
39
|
+
declare const initTracking: (options?: Partial<TrackingConfig> & {
|
|
40
|
+
pageMap?: Partial<PageMap>;
|
|
41
|
+
}) => void;
|
|
42
|
+
/**
|
|
43
|
+
* Lấy thông tin page từ URL
|
|
44
|
+
*/
|
|
45
|
+
declare const getPageInfo: (url: string) => PageInfo;
|
|
46
|
+
/**
|
|
47
|
+
* Send Event -> POST JSON
|
|
48
|
+
*/
|
|
49
|
+
declare const sendEvent: (eventData: EventData) => Promise<Response | void>;
|
|
50
|
+
/**
|
|
51
|
+
* Track page view event
|
|
52
|
+
*/
|
|
53
|
+
declare const trackPageView: (url: string) => void;
|
|
54
|
+
/**
|
|
55
|
+
* Track custom event
|
|
56
|
+
*/
|
|
57
|
+
declare const trackEvent: (eventName: string, params?: EventData) => void;
|
|
58
|
+
/**
|
|
59
|
+
* Hook cho Next.js - auto track page views
|
|
60
|
+
* Dùng cho Next.js Pages Router (next/router)
|
|
61
|
+
*/
|
|
62
|
+
type NextRouterLike = {
|
|
63
|
+
asPath: string;
|
|
64
|
+
events: {
|
|
65
|
+
on: (event: "routeChangeComplete", cb: (url: string) => void) => void;
|
|
66
|
+
off: (event: "routeChangeComplete", cb: (url: string) => void) => void;
|
|
67
|
+
};
|
|
68
|
+
};
|
|
69
|
+
declare const usePageViewTracking: (router: NextRouterLike) => (() => void) | undefined;
|
|
70
|
+
declare const tracking: {
|
|
71
|
+
init: (options?: Partial<TrackingConfig> & {
|
|
72
|
+
pageMap?: Partial<PageMap>;
|
|
73
|
+
}) => void;
|
|
74
|
+
trackPageView: (url: string) => void;
|
|
75
|
+
trackEvent: (eventName: string, params?: EventData) => void;
|
|
76
|
+
sendEvent: (eventData: EventData) => Promise<Response | void>;
|
|
77
|
+
getPageInfo: (url: string) => PageInfo;
|
|
78
|
+
usePageViewTracking: (router: NextRouterLike) => (() => void) | undefined;
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
export { type EventData, type NextRouterLike, type PageInfo, type PageMap, type TrackingConfig, tracking as default, getPageInfo, initTracking, sendEvent, trackEvent, trackPageView, usePageViewTracking };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tracking Library v2 (Fetch + TypeScript)
|
|
3
|
+
* Thư viện tracking events có thể dùng cho nhiều project
|
|
4
|
+
*/
|
|
5
|
+
type TrackingConfig = {
|
|
6
|
+
baseURL: string;
|
|
7
|
+
appName?: string;
|
|
8
|
+
appId?: string;
|
|
9
|
+
packageId?: string;
|
|
10
|
+
platform?: "Web" | "Ios" | "Android" | string;
|
|
11
|
+
debug?: boolean;
|
|
12
|
+
session_id: string;
|
|
13
|
+
session_sign: string;
|
|
14
|
+
user_id: number;
|
|
15
|
+
deviceId: string;
|
|
16
|
+
deviceModel: string;
|
|
17
|
+
deviceBrand: string;
|
|
18
|
+
ip_address: string;
|
|
19
|
+
ad_id?: string;
|
|
20
|
+
os_version?: string;
|
|
21
|
+
net_type?: string;
|
|
22
|
+
carrier_net?: string;
|
|
23
|
+
sdk_version?: string;
|
|
24
|
+
app_version?: string;
|
|
25
|
+
build_number?: string;
|
|
26
|
+
language?: string;
|
|
27
|
+
country?: string;
|
|
28
|
+
events?: any[];
|
|
29
|
+
};
|
|
30
|
+
type PageInfo = {
|
|
31
|
+
name: string;
|
|
32
|
+
id: string;
|
|
33
|
+
};
|
|
34
|
+
type PageMap = Record<string, PageInfo>;
|
|
35
|
+
type EventData = Record<string, any>;
|
|
36
|
+
/**
|
|
37
|
+
* Khởi tạo tracking với config
|
|
38
|
+
*/
|
|
39
|
+
declare const initTracking: (options?: Partial<TrackingConfig> & {
|
|
40
|
+
pageMap?: Partial<PageMap>;
|
|
41
|
+
}) => void;
|
|
42
|
+
/**
|
|
43
|
+
* Lấy thông tin page từ URL
|
|
44
|
+
*/
|
|
45
|
+
declare const getPageInfo: (url: string) => PageInfo;
|
|
46
|
+
/**
|
|
47
|
+
* Send Event -> POST JSON
|
|
48
|
+
*/
|
|
49
|
+
declare const sendEvent: (eventData: EventData) => Promise<Response | void>;
|
|
50
|
+
/**
|
|
51
|
+
* Track page view event
|
|
52
|
+
*/
|
|
53
|
+
declare const trackPageView: (url: string) => void;
|
|
54
|
+
/**
|
|
55
|
+
* Track custom event
|
|
56
|
+
*/
|
|
57
|
+
declare const trackEvent: (eventName: string, params?: EventData) => void;
|
|
58
|
+
/**
|
|
59
|
+
* Hook cho Next.js - auto track page views
|
|
60
|
+
* Dùng cho Next.js Pages Router (next/router)
|
|
61
|
+
*/
|
|
62
|
+
type NextRouterLike = {
|
|
63
|
+
asPath: string;
|
|
64
|
+
events: {
|
|
65
|
+
on: (event: "routeChangeComplete", cb: (url: string) => void) => void;
|
|
66
|
+
off: (event: "routeChangeComplete", cb: (url: string) => void) => void;
|
|
67
|
+
};
|
|
68
|
+
};
|
|
69
|
+
declare const usePageViewTracking: (router: NextRouterLike) => (() => void) | undefined;
|
|
70
|
+
declare const tracking: {
|
|
71
|
+
init: (options?: Partial<TrackingConfig> & {
|
|
72
|
+
pageMap?: Partial<PageMap>;
|
|
73
|
+
}) => void;
|
|
74
|
+
trackPageView: (url: string) => void;
|
|
75
|
+
trackEvent: (eventName: string, params?: EventData) => void;
|
|
76
|
+
sendEvent: (eventData: EventData) => Promise<Response | void>;
|
|
77
|
+
getPageInfo: (url: string) => PageInfo;
|
|
78
|
+
usePageViewTracking: (router: NextRouterLike) => (() => void) | undefined;
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
export { type EventData, type NextRouterLike, type PageInfo, type PageMap, type TrackingConfig, tracking as default, getPageInfo, initTracking, sendEvent, trackEvent, trackPageView, usePageViewTracking };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
// src/index.ts
|
|
2
|
+
var defaultConfig = {
|
|
3
|
+
baseURL: "",
|
|
4
|
+
appName: "on_plus",
|
|
5
|
+
appId: "",
|
|
6
|
+
packageId: "com.vtvcab.onsportstv",
|
|
7
|
+
platform: "Web",
|
|
8
|
+
debug: false,
|
|
9
|
+
// Required properties
|
|
10
|
+
session_id: "",
|
|
11
|
+
session_sign: "",
|
|
12
|
+
user_id: -1,
|
|
13
|
+
deviceId: "",
|
|
14
|
+
deviceModel: "",
|
|
15
|
+
deviceBrand: "",
|
|
16
|
+
ip_address: "",
|
|
17
|
+
// Optional properties
|
|
18
|
+
ad_id: "",
|
|
19
|
+
os_version: "",
|
|
20
|
+
net_type: "",
|
|
21
|
+
carrier_net: "",
|
|
22
|
+
sdk_version: "",
|
|
23
|
+
app_version: "",
|
|
24
|
+
build_number: "",
|
|
25
|
+
language: "",
|
|
26
|
+
country: "",
|
|
27
|
+
events: []
|
|
28
|
+
};
|
|
29
|
+
var config = { ...defaultConfig };
|
|
30
|
+
var previousPageId = null;
|
|
31
|
+
var pageMap = {
|
|
32
|
+
"": { name: "Home", id: "home" },
|
|
33
|
+
home: { name: "Home", id: "home" },
|
|
34
|
+
search: { name: "Search", id: "search" },
|
|
35
|
+
detail: { name: "Detail", id: "detail" },
|
|
36
|
+
player: { name: "Player", id: "player" },
|
|
37
|
+
video: { name: "Video", id: "video" },
|
|
38
|
+
live: { name: "Live", id: "live" },
|
|
39
|
+
category: { name: "Category", id: "category" },
|
|
40
|
+
profile: { name: "Profile", id: "profile" },
|
|
41
|
+
login: { name: "Login", id: "login" }
|
|
42
|
+
};
|
|
43
|
+
var initTracking = (options = {}) => {
|
|
44
|
+
config = { ...config, ...options };
|
|
45
|
+
if (options.pageMap) {
|
|
46
|
+
pageMap = { ...pageMap, ...options.pageMap };
|
|
47
|
+
}
|
|
48
|
+
if (!config.baseURL) {
|
|
49
|
+
console.warn("[Tracking] baseURL is required.");
|
|
50
|
+
}
|
|
51
|
+
if (config.debug) {
|
|
52
|
+
console.log("[Tracking] Initialized with config:", config);
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
var getPageInfo = (url) => {
|
|
56
|
+
const path = (url || "").split("?")[0];
|
|
57
|
+
const pathSegment = path.split("/").filter(Boolean)[0] || "home";
|
|
58
|
+
return pageMap[pathSegment] || {
|
|
59
|
+
name: pathSegment.charAt(0).toUpperCase() + pathSegment.slice(1),
|
|
60
|
+
id: pathSegment
|
|
61
|
+
};
|
|
62
|
+
};
|
|
63
|
+
var sendEvent = async (eventData) => {
|
|
64
|
+
if (!config.baseURL) {
|
|
65
|
+
console.warn("[Tracking] Not initialized. Call initTracking() first.");
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
try {
|
|
69
|
+
const payload = {
|
|
70
|
+
// Required properties
|
|
71
|
+
app_name: config.appName,
|
|
72
|
+
app_id: config.appId,
|
|
73
|
+
package_id: config.packageId,
|
|
74
|
+
platform: config.platform,
|
|
75
|
+
session_id: config.session_id,
|
|
76
|
+
session_sign: config.session_sign,
|
|
77
|
+
user_id: config.user_id,
|
|
78
|
+
device_id: config.deviceId,
|
|
79
|
+
device_model: config.deviceModel,
|
|
80
|
+
device_brand: config.deviceBrand,
|
|
81
|
+
ip_address: config.ip_address,
|
|
82
|
+
// Optional properties
|
|
83
|
+
ad_id: config.ad_id,
|
|
84
|
+
os_version: config.os_version,
|
|
85
|
+
net_type: config.net_type,
|
|
86
|
+
carrier_net: config.carrier_net,
|
|
87
|
+
sdk_version: config.sdk_version,
|
|
88
|
+
app_version: config.app_version,
|
|
89
|
+
build_number: config.build_number,
|
|
90
|
+
language: config.language,
|
|
91
|
+
country: config.country,
|
|
92
|
+
// Events batch (tuỳ backend)
|
|
93
|
+
events: config.events ?? [],
|
|
94
|
+
// Data riêng cho event
|
|
95
|
+
...eventData
|
|
96
|
+
};
|
|
97
|
+
if (config.debug) {
|
|
98
|
+
console.log("[Tracking] Sending event:", payload);
|
|
99
|
+
}
|
|
100
|
+
const res = await fetch(config.baseURL, {
|
|
101
|
+
method: "POST",
|
|
102
|
+
headers: { "Content-Type": "application/json" },
|
|
103
|
+
body: JSON.stringify(payload)
|
|
104
|
+
});
|
|
105
|
+
if (!res.ok && config.debug) {
|
|
106
|
+
const text = await res.text().catch(() => "");
|
|
107
|
+
console.error("[Tracking] HTTP Error:", res.status, text);
|
|
108
|
+
}
|
|
109
|
+
return res;
|
|
110
|
+
} catch (error) {
|
|
111
|
+
if (config.debug) {
|
|
112
|
+
console.error("[Tracking] Error:", error);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
var trackPageView = (url) => {
|
|
117
|
+
const pageInfo = getPageInfo(url);
|
|
118
|
+
sendEvent({
|
|
119
|
+
event_name: "page_view",
|
|
120
|
+
page_name: pageInfo.name,
|
|
121
|
+
page_id: pageInfo.id,
|
|
122
|
+
page_path: url,
|
|
123
|
+
referrer_page_id: previousPageId || ""
|
|
124
|
+
});
|
|
125
|
+
previousPageId = pageInfo.id;
|
|
126
|
+
};
|
|
127
|
+
var trackEvent = (eventName, params = {}) => {
|
|
128
|
+
sendEvent({
|
|
129
|
+
event_name: eventName,
|
|
130
|
+
...params
|
|
131
|
+
});
|
|
132
|
+
};
|
|
133
|
+
var usePageViewTracking = (router) => {
|
|
134
|
+
if (typeof window === "undefined") return;
|
|
135
|
+
if (!router) return;
|
|
136
|
+
trackPageView(router.asPath);
|
|
137
|
+
const handleRouteChange = (url) => {
|
|
138
|
+
trackPageView(url);
|
|
139
|
+
};
|
|
140
|
+
router.events.on("routeChangeComplete", handleRouteChange);
|
|
141
|
+
return () => {
|
|
142
|
+
router.events.off("routeChangeComplete", handleRouteChange);
|
|
143
|
+
};
|
|
144
|
+
};
|
|
145
|
+
var tracking = {
|
|
146
|
+
init: initTracking,
|
|
147
|
+
trackPageView,
|
|
148
|
+
trackEvent,
|
|
149
|
+
sendEvent,
|
|
150
|
+
getPageInfo,
|
|
151
|
+
usePageViewTracking
|
|
152
|
+
};
|
|
153
|
+
var index_default = tracking;
|
|
154
|
+
export {
|
|
155
|
+
index_default as default,
|
|
156
|
+
getPageInfo,
|
|
157
|
+
initTracking,
|
|
158
|
+
sendEvent,
|
|
159
|
+
trackEvent,
|
|
160
|
+
trackPageView,
|
|
161
|
+
usePageViewTracking
|
|
162
|
+
};
|
|
163
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\r\n * Tracking Library v2 (Fetch + TypeScript)\r\n * Thư viện tracking events có thể dùng cho nhiều project\r\n */\r\n\r\nexport type TrackingConfig = {\r\n baseURL: string;\r\n appName?: string;\r\n appId?: string;\r\n packageId?: string;\r\n platform?: \"Web\" | \"Ios\" | \"Android\" | string;\r\n debug?: boolean;\r\n\r\n // Required properties\r\n session_id: string;\r\n session_sign: string;\r\n user_id: number;\r\n deviceId: string;\r\n deviceModel: string;\r\n deviceBrand: string;\r\n ip_address: string;\r\n\r\n // Optional properties\r\n ad_id?: string;\r\n os_version?: string;\r\n net_type?: string;\r\n carrier_net?: string;\r\n sdk_version?: string;\r\n app_version?: string;\r\n build_number?: string;\r\n language?: string;\r\n country?: string;\r\n\r\n // Optional: events (nếu backend cần batch)\r\n events?: any[];\r\n};\r\n\r\nexport type PageInfo = {\r\n name: string;\r\n id: string;\r\n};\r\n\r\nexport type PageMap = Record<string, PageInfo>;\r\n\r\nexport type EventData = Record<string, any>;\r\n\r\nconst defaultConfig: TrackingConfig = {\r\n baseURL: \"\",\r\n appName: \"on_plus\",\r\n appId: \"\",\r\n packageId: \"com.vtvcab.onsportstv\",\r\n platform: \"Web\",\r\n debug: false,\r\n\r\n // Required properties\r\n session_id: \"\",\r\n session_sign: \"\",\r\n user_id: -1,\r\n deviceId: \"\",\r\n deviceModel: \"\",\r\n deviceBrand: \"\",\r\n ip_address: \"\",\r\n\r\n // Optional properties\r\n ad_id: \"\",\r\n os_version: \"\",\r\n net_type: \"\",\r\n carrier_net: \"\",\r\n sdk_version: \"\",\r\n app_version: \"\",\r\n build_number: \"\",\r\n language: \"\",\r\n country: \"\",\r\n\r\n events: [],\r\n};\r\n\r\n// Config runtime\r\nlet config: TrackingConfig = { ...defaultConfig };\r\n\r\n// State\r\nlet previousPageId: string | null = null;\r\n\r\n// Page mapping\r\nlet pageMap: any = {\r\n \"\": { name: \"Home\", id: \"home\" },\r\n home: { name: \"Home\", id: \"home\" },\r\n search: { name: \"Search\", id: \"search\" },\r\n detail: { name: \"Detail\", id: \"detail\" },\r\n player: { name: \"Player\", id: \"player\" },\r\n video: { name: \"Video\", id: \"video\" },\r\n live: { name: \"Live\", id: \"live\" },\r\n category: { name: \"Category\", id: \"category\" },\r\n profile: { name: \"Profile\", id: \"profile\" },\r\n login: { name: \"Login\", id: \"login\" },\r\n};\r\n\r\n/**\r\n * Khởi tạo tracking với config\r\n */\r\nexport const initTracking = (\r\n options: Partial<TrackingConfig> & { pageMap?: Partial<PageMap> } = {},\r\n) => {\r\n config = { ...config, ...options };\r\n\r\n if (options.pageMap) {\r\n pageMap = { ...pageMap, ...options.pageMap };\r\n }\r\n\r\n if (!config.baseURL) {\r\n console.warn(\"[Tracking] baseURL is required.\");\r\n }\r\n\r\n if (config.debug) {\r\n console.log(\"[Tracking] Initialized with config:\", config);\r\n }\r\n};\r\n\r\n/**\r\n * Lấy thông tin page từ URL\r\n */\r\nexport const getPageInfo = (url: string): PageInfo => {\r\n const path = (url || \"\").split(\"?\")[0];\r\n const pathSegment = path.split(\"/\").filter(Boolean)[0] || \"home\";\r\n\r\n return (\r\n pageMap[pathSegment] || {\r\n name: pathSegment.charAt(0).toUpperCase() + pathSegment.slice(1),\r\n id: pathSegment,\r\n }\r\n );\r\n};\r\n\r\n/**\r\n * Send Event -> POST JSON\r\n */\r\nexport const sendEvent = async (\r\n eventData: EventData,\r\n): Promise<Response | void> => {\r\n if (!config.baseURL) {\r\n console.warn(\"[Tracking] Not initialized. Call initTracking() first.\");\r\n return;\r\n }\r\n\r\n try {\r\n const payload = {\r\n // Required properties\r\n app_name: config.appName,\r\n app_id: config.appId,\r\n package_id: config.packageId,\r\n platform: config.platform,\r\n\r\n session_id: config.session_id,\r\n session_sign: config.session_sign,\r\n user_id: config.user_id,\r\n\r\n device_id: config.deviceId,\r\n device_model: config.deviceModel,\r\n device_brand: config.deviceBrand,\r\n ip_address: config.ip_address,\r\n\r\n // Optional properties\r\n ad_id: config.ad_id,\r\n os_version: config.os_version,\r\n net_type: config.net_type,\r\n carrier_net: config.carrier_net,\r\n sdk_version: config.sdk_version,\r\n app_version: config.app_version,\r\n build_number: config.build_number,\r\n language: config.language,\r\n country: config.country,\r\n\r\n // Events batch (tuỳ backend)\r\n events: config.events ?? [],\r\n\r\n // Data riêng cho event\r\n ...eventData,\r\n };\r\n\r\n if (config.debug) {\r\n console.log(\"[Tracking] Sending event:\", payload);\r\n }\r\n\r\n const res = await fetch(config.baseURL, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(payload),\r\n });\r\n\r\n if (!res.ok && config.debug) {\r\n const text = await res.text().catch(() => \"\");\r\n console.error(\"[Tracking] HTTP Error:\", res.status, text);\r\n }\r\n\r\n return res;\r\n } catch (error) {\r\n if (config.debug) {\r\n console.error(\"[Tracking] Error:\", error);\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * Track page view event\r\n */\r\nexport const trackPageView = (url: string) => {\r\n const pageInfo = getPageInfo(url);\r\n\r\n sendEvent({\r\n event_name: \"page_view\",\r\n page_name: pageInfo.name,\r\n page_id: pageInfo.id,\r\n page_path: url,\r\n referrer_page_id: previousPageId || \"\",\r\n });\r\n\r\n previousPageId = pageInfo.id;\r\n};\r\n\r\n/**\r\n * Track custom event\r\n */\r\nexport const trackEvent = (eventName: string, params: EventData = {}) => {\r\n sendEvent({\r\n event_name: eventName,\r\n ...params,\r\n });\r\n};\r\n\r\n/**\r\n * Hook cho Next.js - auto track page views\r\n * Dùng cho Next.js Pages Router (next/router)\r\n */\r\nexport type NextRouterLike = {\r\n asPath: string;\r\n events: {\r\n on: (event: \"routeChangeComplete\", cb: (url: string) => void) => void;\r\n off: (event: \"routeChangeComplete\", cb: (url: string) => void) => void;\r\n };\r\n};\r\n\r\nexport const usePageViewTracking = (router: NextRouterLike) => {\r\n if (typeof window === \"undefined\") return;\r\n if (!router) return;\r\n\r\n // Track initial page\r\n trackPageView(router.asPath);\r\n\r\n const handleRouteChange = (url: string) => {\r\n trackPageView(url);\r\n };\r\n\r\n router.events.on(\"routeChangeComplete\", handleRouteChange);\r\n\r\n return () => {\r\n router.events.off(\"routeChangeComplete\", handleRouteChange);\r\n };\r\n};\r\n\r\n// Export default object\r\nconst tracking = {\r\n init: initTracking,\r\n trackPageView,\r\n trackEvent,\r\n sendEvent,\r\n getPageInfo,\r\n usePageViewTracking,\r\n};\r\n\r\nexport default tracking;\r\n"],"mappings":"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","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "tracking-lib-ott",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./dist/index.cjs",
|
|
6
|
+
"module": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/index.js",
|
|
11
|
+
"require": "./dist/index.cjs",
|
|
12
|
+
"types": "./dist/index.d.ts"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist"
|
|
17
|
+
],
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "tsup",
|
|
20
|
+
"prepublishOnly": "npm run build"
|
|
21
|
+
}
|
|
22
|
+
}
|