@warriorteam/redai-zalo-sdk 1.22.0 → 1.24.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.
@@ -1 +1 @@
1
- {"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../src/types/message.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../src/types/message.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,283 @@
1
+ # Button Types Guide - Zalo Promotion API v3.0
2
+
3
+ ## Tổng quan
4
+
5
+ Zalo Promotion API v3.0 hỗ trợ 5 loại button với payload format khác nhau. Mỗi button type có cấu trúc payload riêng biệt và giới hạn cụ thể.
6
+
7
+ ## Button Types được hỗ trợ
8
+
9
+ ### 1. **Open URL Button** (`oa.open.url`)
10
+
11
+ Mở URL trong ứng dụng Zalo khi người dùng bấm vào.
12
+
13
+ ```typescript
14
+ interface OpenUrlButton {
15
+ title: string; // Max 100 characters
16
+ image_icon?: string;
17
+ type: "oa.open.url";
18
+ payload: {
19
+ url: string; // URL to open
20
+ };
21
+ }
22
+ ```
23
+
24
+ **Example:**
25
+ ```typescript
26
+ {
27
+ title: "Mua ngay",
28
+ type: "oa.open.url",
29
+ payload: {
30
+ url: "https://shop.example.com/product/123"
31
+ }
32
+ }
33
+ ```
34
+
35
+ ### 2. **Query Show Button** (`oa.query.show`)
36
+
37
+ Gửi tin nhắn từ user đến OA, tin nhắn **hiển thị** trên chat.
38
+
39
+ ```typescript
40
+ interface QueryShowButton {
41
+ title: string; // Max 100 characters
42
+ image_icon?: string;
43
+ type: "oa.query.show";
44
+ payload: string; // Max 1000 characters
45
+ }
46
+ ```
47
+
48
+ **Example:**
49
+ ```typescript
50
+ {
51
+ title: "Xem thêm sản phẩm",
52
+ type: "oa.query.show",
53
+ payload: "#xem_san_pham"
54
+ }
55
+ ```
56
+
57
+ ### 3. **Query Hide Button** (`oa.query.hide`)
58
+
59
+ Gửi tin nhắn từ user đến OA, tin nhắn **ẩn** trên chat.
60
+
61
+ ```typescript
62
+ interface QueryHideButton {
63
+ title: string; // Max 100 characters
64
+ image_icon?: string;
65
+ type: "oa.query.hide";
66
+ payload: string; // Max 1000 characters
67
+ }
68
+ ```
69
+
70
+ **Example:**
71
+ ```typescript
72
+ {
73
+ title: "Liên hệ tư vấn",
74
+ type: "oa.query.hide",
75
+ payload: "#tu_van"
76
+ }
77
+ ```
78
+
79
+ ### 4. **Open SMS Button** (`oa.open.sms`)
80
+
81
+ Mở ứng dụng SMS với nội dung và số điện thoại có sẵn.
82
+
83
+ ```typescript
84
+ interface OpenSmsButton {
85
+ title: string; // Max 100 characters
86
+ image_icon?: string;
87
+ type: "oa.open.sms";
88
+ payload: {
89
+ content: string; // Max 160 characters
90
+ phone_code: string; // Phone number
91
+ };
92
+ }
93
+ ```
94
+
95
+ **Example:**
96
+ ```typescript
97
+ {
98
+ title: "Gửi SMS",
99
+ type: "oa.open.sms",
100
+ payload: {
101
+ content: "Tôi muốn tư vấn về sản phẩm",
102
+ phone_code: "84919018791"
103
+ }
104
+ }
105
+ ```
106
+
107
+ ### 5. **Open Phone Button** (`oa.open.phone`)
108
+
109
+ Mở ứng dụng gọi điện với số điện thoại có sẵn.
110
+
111
+ ```typescript
112
+ interface OpenPhoneButton {
113
+ title: string; // Max 100 characters
114
+ image_icon?: string;
115
+ type: "oa.open.phone";
116
+ payload: {
117
+ phone_code: string; // Phone number
118
+ };
119
+ }
120
+ ```
121
+
122
+ **Example:**
123
+ ```typescript
124
+ {
125
+ title: "Gọi ngay",
126
+ type: "oa.open.phone",
127
+ payload: {
128
+ phone_code: "84919018791"
129
+ }
130
+ }
131
+ ```
132
+
133
+ ## Union Type cho TypeScript
134
+
135
+ ```typescript
136
+ type PromotionButton =
137
+ | OpenUrlButton
138
+ | QueryShowButton
139
+ | QueryHideButton
140
+ | OpenSmsButton
141
+ | OpenPhoneButton;
142
+ ```
143
+
144
+ ## Flexible Input Interface
145
+
146
+ Để dễ sử dụng, SDK cung cấp interface linh hoạt:
147
+
148
+ ```typescript
149
+ interface PromotionButtonInput {
150
+ title: string; // Max 100 characters
151
+ imageIcon?: string; // camelCase style
152
+ type: "oa.open.url" | "oa.query.show" | "oa.query.hide" | "oa.open.sms" | "oa.open.phone";
153
+ payload: any; // Flexible payload, will be converted internally
154
+ }
155
+ ```
156
+
157
+ ## Cách sử dụng trong SDK
158
+
159
+ ### Basic Usage
160
+
161
+ ```typescript
162
+ const buttons: PromotionButtonInput[] = [
163
+ {
164
+ title: "Mua ngay",
165
+ type: "oa.open.url",
166
+ payload: { url: "https://shop.example.com" }
167
+ },
168
+ {
169
+ title: "Tư vấn",
170
+ type: "oa.query.hide",
171
+ payload: "#tu_van"
172
+ },
173
+ {
174
+ title: "Gọi hotline",
175
+ type: "oa.open.phone",
176
+ payload: { phone_code: "1900123456" }
177
+ }
178
+ ];
179
+
180
+ await promotionService.sendCustomPromotion(
181
+ accessToken,
182
+ { user_id: "user_id" },
183
+ {
184
+ // ... other promotion data
185
+ buttons
186
+ }
187
+ );
188
+ ```
189
+
190
+ ### All Button Types Example
191
+
192
+ ```typescript
193
+ const allButtonTypes: PromotionButtonInput[] = [
194
+ // Open URL
195
+ {
196
+ title: "Mở website",
197
+ type: "oa.open.url",
198
+ payload: { url: "https://example.com" }
199
+ },
200
+
201
+ // Query Show (visible message)
202
+ {
203
+ title: "Xem menu",
204
+ type: "oa.query.show",
205
+ payload: "#menu"
206
+ },
207
+
208
+ // Query Hide (hidden message)
209
+ {
210
+ title: "Liên hệ support",
211
+ type: "oa.query.hide",
212
+ payload: "#support"
213
+ },
214
+
215
+ // Open SMS
216
+ {
217
+ title: "Gửi SMS",
218
+ type: "oa.open.sms",
219
+ payload: {
220
+ content: "Tôi cần hỗ trợ",
221
+ phone_code: "84919018791"
222
+ }
223
+ },
224
+
225
+ // Open Phone
226
+ {
227
+ title: "Gọi điện",
228
+ type: "oa.open.phone",
229
+ payload: { phone_code: "84919018791" }
230
+ }
231
+ ];
232
+ ```
233
+
234
+ ## Giới hạn và Lưu ý
235
+
236
+ ### Giới hạn chung
237
+ - **Tối đa 4 buttons** per message
238
+ - **Title**: Tối đa 100 ký tự
239
+ - **Image icon**: URL, attachment_id, hoặc "default"
240
+
241
+ ### Giới hạn theo type
242
+ - **Query payload**: Tối đa 1000 ký tự
243
+ - **SMS content**: Tối đa 160 ký tự
244
+ - **Phone code**: Format quốc tế (VD: 84919018791)
245
+
246
+ ### Best Practices
247
+
248
+ 1. **Button Order**: Đặt button quan trọng nhất đầu tiên
249
+ 2. **Title Length**: Giữ title ngắn gọn, dễ hiểu
250
+ 3. **Query Payload**: Sử dụng prefix # để dễ phân biệt
251
+ 4. **Phone Format**: Luôn sử dụng mã quốc gia
252
+ 5. **URL Validation**: Đảm bảo URL hợp lệ và accessible
253
+
254
+ ### Error Handling
255
+
256
+ SDK tự động convert và validate button format. Các lỗi thường gặp:
257
+
258
+ - **Invalid type**: Type không được hỗ trợ
259
+ - **Missing payload**: Payload bị thiếu hoặc sai format
260
+ - **Length exceeded**: Title hoặc payload vượt quá giới hạn
261
+ - **Invalid URL**: URL không hợp lệ cho oa.open.url
262
+
263
+ ## Migration từ Generic Button
264
+
265
+ Nếu bạn đang sử dụng generic button format:
266
+
267
+ ```typescript
268
+ // Cũ (vẫn hoạt động)
269
+ {
270
+ title: "Button",
271
+ type: "oa.open.url",
272
+ payload: { url: "https://example.com" }
273
+ }
274
+
275
+ // Mới (recommended)
276
+ {
277
+ title: "Button",
278
+ type: "oa.open.url" as const, // Type assertion for better typing
279
+ payload: { url: "https://example.com" }
280
+ }
281
+ ```
282
+
283
+ SDK sẽ tự động convert và validate tất cả button formats để đảm bảo tương thích với Zalo API v3.0.
@@ -0,0 +1,210 @@
1
+ # Multiple Users Promotion - Gửi Promotion đến nhiều Users với Tracking
2
+
3
+ ## Tổng quan
4
+
5
+ Method `sendCustomPromotionToMultipleUsers()` cho phép gửi promotion message đến nhiều user IDs cùng lúc với tính năng tracking real-time và error handling nâng cao.
6
+
7
+ ## Tính năng chính
8
+
9
+ ### 🚀 **Dual Sending Modes**
10
+ - **Sequential**: Gửi tuần tự với delay tùy chỉnh để tránh rate limit
11
+ - **Parallel**: Gửi song song để tối ưu tốc độ
12
+
13
+ ### 📊 **Real-time Tracking**
14
+ - Progress callback theo thời gian thực
15
+ - Estimated time remaining
16
+ - Success/failure statistics
17
+ - Current user being processed
18
+
19
+ ### 🛡️ **Error Handling**
20
+ - Error isolation - lỗi của 1 user không ảnh hưởng các user khác
21
+ - Continue on error option
22
+ - Detailed error information cho từng user
23
+ - Success rate calculation
24
+
25
+ ### 📈 **Performance Metrics**
26
+ - Execution time tracking
27
+ - Success rate percentage
28
+ - Detailed results cho từng user
29
+ - Start/end timestamps
30
+
31
+ ## Cách sử dụng
32
+
33
+ ### Basic Usage
34
+
35
+ ```typescript
36
+ import { PromotionService } from './services/promotion.service';
37
+
38
+ const promotionService = new PromotionService(zaloClient);
39
+
40
+ const result = await promotionService.sendCustomPromotionToMultipleUsers(
41
+ accessToken,
42
+ ["user1", "user2", "user3"],
43
+ {
44
+ attachmentId: "your_attachment_id",
45
+ headerContent: "🎉 Khuyến mãi đặc biệt!",
46
+ textContent: "Ưu đãi độc quyền dành riêng cho bạn",
47
+ tableData: [
48
+ { key: "Mã giảm giá", value: "SAVE50" },
49
+ { key: "Giảm giá", value: "50%" }
50
+ ],
51
+ buttons: [
52
+ {
53
+ title: "Mua ngay",
54
+ type: "oa.open.url",
55
+ payload: { url: "https://shop.example.com" }
56
+ }
57
+ ]
58
+ }
59
+ );
60
+
61
+ console.log(`Sent to ${result.successful}/${result.total} users`);
62
+ ```
63
+
64
+ ### Advanced Usage với Tracking
65
+
66
+ ```typescript
67
+ const result = await promotionService.sendCustomPromotionToMultipleUsers(
68
+ accessToken,
69
+ userIds,
70
+ promotionData,
71
+ {
72
+ mode: "sequential",
73
+ delayMs: 2000,
74
+ continueOnError: true,
75
+
76
+ // Real-time progress tracking
77
+ onProgress: (progress) => {
78
+ const percent = Math.round((progress.completed / progress.total) * 100);
79
+ console.log(`📊 Progress: ${percent}% (${progress.completed}/${progress.total})`);
80
+ console.log(`✅ Success: ${progress.successful} | ❌ Failed: ${progress.failed}`);
81
+
82
+ if (progress.currentUserId) {
83
+ console.log(`🔄 Processing: ${progress.currentUserId}`);
84
+ }
85
+
86
+ if (progress.estimatedTimeRemaining) {
87
+ const eta = Math.round(progress.estimatedTimeRemaining / 1000);
88
+ console.log(`⏱️ ETA: ~${eta}s`);
89
+ }
90
+ },
91
+
92
+ // Callback cho từng user
93
+ onUserComplete: (userResult) => {
94
+ if (userResult.success) {
95
+ console.log(`✅ ${userResult.userId}: ${userResult.result?.message_id}`);
96
+ } else {
97
+ console.log(`❌ ${userResult.userId}: ${userResult.error?.message}`);
98
+ }
99
+ }
100
+ }
101
+ );
102
+ ```
103
+
104
+ ### Parallel Mode
105
+
106
+ ```typescript
107
+ const result = await promotionService.sendCustomPromotionToMultipleUsers(
108
+ accessToken,
109
+ userIds,
110
+ promotionData,
111
+ {
112
+ mode: "parallel", // Gửi tất cả cùng lúc
113
+ continueOnError: true,
114
+ onProgress: (progress) => {
115
+ console.log(`⚡ Parallel: ${progress.completed}/${progress.total}`);
116
+ }
117
+ }
118
+ );
119
+
120
+ console.log(`⚡ Completed in ${result.executionTime}ms`);
121
+ ```
122
+
123
+ ## Options Parameters
124
+
125
+ ### SendingOptions
126
+
127
+ ```typescript
128
+ interface SendingOptions {
129
+ mode?: "sequential" | "parallel"; // Chế độ gửi (default: "sequential")
130
+ delayMs?: number; // Delay giữa tin nhắn (default: 1000ms)
131
+ continueOnError?: boolean; // Tiếp tục khi có lỗi (default: true)
132
+ onProgress?: (progress: MultiplePromotionProgress) => void;
133
+ onUserComplete?: (result: PromotionUserResult) => void;
134
+ }
135
+ ```
136
+
137
+ ### Progress Tracking Interface
138
+
139
+ ```typescript
140
+ interface MultiplePromotionProgress {
141
+ total: number; // Tổng số users
142
+ completed: number; // Số users đã xử lý
143
+ successful: number; // Số users gửi thành công
144
+ failed: number; // Số users gửi thất bại
145
+ currentUserId: string | null; // User ID đang xử lý (sequential mode)
146
+ startTime: number; // Timestamp bắt đầu
147
+ estimatedTimeRemaining: number | null; // Thời gian còn lại (ms)
148
+ }
149
+ ```
150
+
151
+ ### Result Interface
152
+
153
+ ```typescript
154
+ interface MultiplePromotionResult {
155
+ total: number; // Tổng số users
156
+ successful: number; // Số users thành công
157
+ failed: number; // Số users thất bại
158
+ results: PromotionUserResult[]; // Chi tiết kết quả từng user
159
+ executionTime: number; // Thời gian thực hiện (ms)
160
+ mode: "sequential" | "parallel"; // Chế độ đã sử dụng
161
+ startTime: Date; // Thời gian bắt đầu
162
+ endTime: Date; // Thời gian kết thúc
163
+ successRate: number; // Tỷ lệ thành công (%)
164
+ }
165
+ ```
166
+
167
+ ## Best Practices
168
+
169
+ ### 1. **Chọn Mode phù hợp**
170
+ - **Sequential**: Cho campaigns lớn, tránh rate limit
171
+ - **Parallel**: Cho urgent notifications, tối ưu tốc độ
172
+
173
+ ### 2. **Delay Configuration**
174
+ - Minimum 1000ms để tránh rate limit
175
+ - Tăng delay nếu gặp rate limit errors
176
+ - Test với số lượng nhỏ trước khi scale
177
+
178
+ ### 3. **Error Handling**
179
+ - Luôn set `continueOnError: true` cho campaigns lớn
180
+ - Log chi tiết errors để debug
181
+ - Retry failed users nếu cần
182
+
183
+ ### 4. **Performance Monitoring**
184
+ - Sử dụng `onProgress` để monitor real-time
185
+ - Track success rate và adjust strategy
186
+ - Monitor execution time cho optimization
187
+
188
+ ## Error Codes
189
+
190
+ - **2001**: Ngoài khung giờ cho phép (8:00-22:00)
191
+ - **2002**: User đã từ chối nhận tin truyền thông
192
+ - **2003**: Vượt quá giới hạn 1 tin/ngày
193
+ - **2004**: Template chưa được phê duyệt
194
+ - **2005**: Nội dung vi phạm chính sách
195
+ - **2006**: OA chưa có quyền gửi tin truyền thông
196
+
197
+ ## Examples
198
+
199
+ Xem file `examples/promotion-examples.ts` để có ví dụ chi tiết về:
200
+ - Sequential sending với progress tracking
201
+ - Parallel sending cho tốc độ
202
+ - Error handling và retry logic
203
+ - Performance monitoring và optimization
204
+
205
+ ## Rate Limits
206
+
207
+ - **Sending Time**: 8:00 - 22:00 hàng ngày
208
+ - **Frequency**: Tối đa 1 tin truyền thông/ngày/user
209
+ - **Concurrent**: Khuyến nghị sequential mode cho campaigns lớn
210
+ - **Delay**: Minimum 1000ms giữa các tin nhắn
@@ -110,11 +110,38 @@ buttons: [{
110
110
 
111
111
  **Payload format theo type:**
112
112
  - `oa.open.url`: `{ url: "https://..." }`
113
- - `oa.query.show`: `"#callback_data"` (string)
114
- - `oa.query.hide`: `"#callback_data"` (string)
115
- - `oa.open.sms`: `{ content: "text", phone_code: "84xxx" }`
113
+ - `oa.query.show`: `"#callback_data"` (string, max 1000 chars)
114
+ - `oa.query.hide`: `"#callback_data"` (string, max 1000 chars)
115
+ - `oa.open.sms`: `{ content: "text", phone_code: "84xxx" }` (content max 160 chars)
116
116
  - `oa.open.phone`: `{ phone_code: "84xxx" }`
117
117
 
118
+ **TypeScript Support:**
119
+ ```typescript
120
+ // Typed button interfaces
121
+ interface OpenUrlButton {
122
+ title: string; // Max 100 characters
123
+ type: "oa.open.url";
124
+ payload: { url: string };
125
+ }
126
+
127
+ interface QueryHideButton {
128
+ title: string; // Max 100 characters
129
+ type: "oa.query.hide";
130
+ payload: string; // Max 1000 characters
131
+ }
132
+
133
+ // Union type for all buttons
134
+ type PromotionButton = OpenUrlButton | QueryShowButton | QueryHideButton | OpenSmsButton | OpenPhoneButton;
135
+
136
+ // Flexible input interface
137
+ interface PromotionButtonInput {
138
+ title: string;
139
+ imageIcon?: string;
140
+ type: "oa.open.url" | "oa.query.show" | "oa.query.hide" | "oa.open.sms" | "oa.open.phone";
141
+ payload: any; // SDK auto-converts to proper format
142
+ }
143
+ ```
144
+
118
145
  ### 🌐 Hỗ trợ đa ngôn ngữ
119
146
 
120
147
  Thêm thuộc tính `language` trong payload:
@@ -127,6 +154,29 @@ Thêm thuộc tính `language` trong payload:
127
154
  }
128
155
  ```
129
156
 
157
+ ### 🚀 Tính năng mới: Multiple Users với Tracking
158
+
159
+ #### Gửi đến nhiều users cùng lúc
160
+ - **Sequential Mode**: Gửi tuần tự với delay tùy chỉnh
161
+ - **Parallel Mode**: Gửi song song để tối ưu tốc độ
162
+ - **Real-time Tracking**: Callback progress theo thời gian thực
163
+ - **Error Isolation**: Lỗi của 1 user không ảnh hưởng các user khác
164
+ - **Statistics**: Thống kê chi tiết success rate và execution time
165
+
166
+ #### Callback Tracking
167
+ ```typescript
168
+ {
169
+ onProgress: (progress) => {
170
+ // Real-time progress: completed/total, success/failed
171
+ // Estimated time remaining, current user ID
172
+ },
173
+ onUserComplete: (userResult) => {
174
+ // Callback cho từng user hoàn thành
175
+ // Success/failure status, message ID, error details
176
+ }
177
+ }
178
+ ```
179
+
130
180
  ## 📝 Cách sử dụng mới
131
181
 
132
182
  ### 1. Gửi Promotion theo format chuẩn docs
@@ -197,6 +247,74 @@ await promotionService.sendEventNotification(
197
247
  );
198
248
  ```
199
249
 
250
+ ### 4. Gửi Promotion đến nhiều Users với Tracking
251
+
252
+ ```typescript
253
+ // Gửi tuần tự với tracking
254
+ const result = await promotionService.sendCustomPromotionToMultipleUsers(
255
+ accessToken,
256
+ ["user1", "user2", "user3", "user4"],
257
+ {
258
+ attachmentId: "your_attachment_id",
259
+ headerContent: "🎉 Khuyến mãi đặc biệt!",
260
+ textContent: "Ưu đãi độc quyền dành riêng cho bạn",
261
+ tableData: [
262
+ { key: "Mã giảm giá", value: "SAVE50" },
263
+ { key: "Giảm giá", value: "50%" }
264
+ ],
265
+ buttons: [
266
+ {
267
+ title: "Mua ngay",
268
+ type: "oa.open.url",
269
+ payload: { url: "https://shop.example.com" }
270
+ }
271
+ ]
272
+ },
273
+ {
274
+ mode: "sequential", // hoặc "parallel"
275
+ delayMs: 2000, // Delay 2s giữa các tin
276
+ continueOnError: true,
277
+
278
+ // Real-time progress tracking
279
+ onProgress: (progress) => {
280
+ console.log(`Progress: ${progress.completed}/${progress.total}`);
281
+ console.log(`Success: ${progress.successful}, Failed: ${progress.failed}`);
282
+ },
283
+
284
+ // Callback cho từng user
285
+ onUserComplete: (userResult) => {
286
+ if (userResult.success) {
287
+ console.log(`✅ Sent to ${userResult.userId}`);
288
+ } else {
289
+ console.log(`❌ Failed to ${userResult.userId}: ${userResult.error?.message}`);
290
+ }
291
+ }
292
+ }
293
+ );
294
+
295
+ console.log(`📊 Final Result:`);
296
+ console.log(`Total: ${result.total}, Success: ${result.successful}, Failed: ${result.failed}`);
297
+ console.log(`Success Rate: ${result.successRate}%, Time: ${result.executionTime}ms`);
298
+ ```
299
+
300
+ ### 5. Gửi Song Song (Parallel Mode)
301
+
302
+ ```typescript
303
+ // Gửi song song để tối ưu tốc độ
304
+ const result = await promotionService.sendCustomPromotionToMultipleUsers(
305
+ accessToken,
306
+ userIds,
307
+ promotionData,
308
+ {
309
+ mode: "parallel", // Gửi tất cả cùng lúc
310
+ continueOnError: true,
311
+ onProgress: (progress) => {
312
+ console.log(`⚡ Parallel: ${progress.completed}/${progress.total}`);
313
+ }
314
+ }
315
+ );
316
+ ```
317
+
200
318
  ## ⚠️ Breaking Changes
201
319
 
202
320
  1. **URL API**: Phải cập nhật từ v2.0 lên v3.0