@redonvn/zalo-ads-sdk 0.2.30 → 0.2.33
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.js +91 -15
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +91 -15
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -2059,7 +2059,7 @@ var VALID_AD_TYPES = {
|
|
|
2059
2059
|
OA: 2,
|
|
2060
2060
|
VIDEO: 11,
|
|
2061
2061
|
COMMERCE: 28,
|
|
2062
|
-
//
|
|
2062
|
+
// Mã chuẩn cho Commerce Ad
|
|
2063
2063
|
ARTICLE: 3,
|
|
2064
2064
|
DISPLAY: 21,
|
|
2065
2065
|
// Masthead Mobile (Format 1) & Masthead Desktop (Format 2)
|
|
@@ -2329,15 +2329,46 @@ function validateUpdateAdPayload(payload, options = {}) {
|
|
|
2329
2329
|
errors.push("Settings.Price l\xE0 b\u1EAFt bu\u1ED9c.");
|
|
2330
2330
|
} else {
|
|
2331
2331
|
if (payload.Type === VALID_AD_TYPES.WEBSITE) {
|
|
2332
|
-
if (price.Type !== 1) {
|
|
2332
|
+
if (price.Type !== 2 && price.Type !== 1) {
|
|
2333
2333
|
errors.push(
|
|
2334
|
-
"\u0110\u1ED1i v\u1EDBi Qu\u1EA3ng c\xE1o Website (Type 5), Price.Type b\u1EAFt bu\u1ED9c ph\u1EA3i b\u1EB1ng
|
|
2334
|
+
"\u0110\u1ED1i v\u1EDBi Qu\u1EA3ng c\xE1o Website (Type 5), Price.Type b\u1EAFt bu\u1ED9c ph\u1EA3i b\u1EB1ng 2 (L\u01B0\u1EE3t nh\u1EA5n - CPC)."
|
|
2335
2335
|
);
|
|
2336
2336
|
}
|
|
2337
|
-
if (price.
|
|
2338
|
-
|
|
2339
|
-
|
|
2340
|
-
|
|
2337
|
+
if (price.SpendingMethod === 1) {
|
|
2338
|
+
if (price.Bid !== void 0 && price.Bid !== 0) {
|
|
2339
|
+
warnings.push(
|
|
2340
|
+
"Khi ch\u1ECDn 'T\u1ED5ng ng\xE2n s\xE1ch qu\u1EA3ng c\xE1o' (SpendingMethod = 1) cho Qu\u1EA3ng c\xE1o Website, tr\u01B0\u1EDDng Price.Bid n\xEAn \u0111\u1EC3 b\u1EB1ng 0 (h\u1EC7 th\u1ED1ng t\u1EF1 \u0111\u1ED9ng \u0111\u1EA5u th\u1EA7u)."
|
|
2341
|
+
);
|
|
2342
|
+
}
|
|
2343
|
+
if (price.LimitType === 1) {
|
|
2344
|
+
let days = 1;
|
|
2345
|
+
if (payload.StartDate && payload.EndDate && payload.EndDate > payload.StartDate) {
|
|
2346
|
+
days = Math.max(1, Math.ceil((payload.EndDate - payload.StartDate) / 86400));
|
|
2347
|
+
}
|
|
2348
|
+
const minTotalBudget = days * 2e5;
|
|
2349
|
+
if (price.Limit !== void 0 && price.Limit < minTotalBudget) {
|
|
2350
|
+
errors.push(
|
|
2351
|
+
`Ng\xE2n s\xE1ch To\xE0n l\u1ECBch ch\u1EA1y cho Qu\u1EA3ng c\xE1o Website (${days} ng\xE0y) t\u1ED1i thi\u1EC3u l\xE0 ${minTotalBudget.toLocaleString("vi-VN")} VN\u0110 (${days} ng\xE0y x 200,000\u0111/ng\xE0y). Hi\u1EC7n t\u1EA1i \u0111ang truy\u1EC1n: ${price.Limit.toLocaleString("vi-VN")}\u0111.`
|
|
2352
|
+
);
|
|
2353
|
+
}
|
|
2354
|
+
} else if (price.LimitType === 2 || price.LimitType === 0) {
|
|
2355
|
+
if (price.Limit !== void 0 && price.Limit < 2e5) {
|
|
2356
|
+
errors.push(
|
|
2357
|
+
`Ng\xE2n s\xE1ch M\u1ED7i ng\xE0y cho Qu\u1EA3ng c\xE1o Website (SpendingMethod = 1) t\u1ED1i thi\u1EC3u l\xE0 200,000 VN\u0110 (Price.Limit >= 200000). Hi\u1EC7n t\u1EA1i \u0111ang truy\u1EC1n: ${price.Limit.toLocaleString("vi-VN")}\u0111.`
|
|
2358
|
+
);
|
|
2359
|
+
}
|
|
2360
|
+
}
|
|
2361
|
+
} else if (price.SpendingMethod === 0) {
|
|
2362
|
+
if (price.Bid !== void 0 && price.Bid < 650) {
|
|
2363
|
+
errors.push(
|
|
2364
|
+
`Gi\xE1 \u0111\u1EB7t m\u1ED7i l\u01B0\u1EE3t nh\u1EA5n (Price.Bid) cho Qu\u1EA3ng c\xE1o Website t\u1ED1i thi\u1EC3u l\xE0 650 VN\u0110 (s\xE0n h\u1EC7 th\u1ED1ng Zalo Ads). Hi\u1EC7n t\u1EA1i \u0111ang truy\u1EC1n: ${price.Bid}\u0111.`
|
|
2365
|
+
);
|
|
2366
|
+
}
|
|
2367
|
+
if (price.Limit !== void 0 && price.Limit < 50) {
|
|
2368
|
+
errors.push(
|
|
2369
|
+
`S\u1ED1 l\u01B0\u1EE3ng l\u01B0\u1EE3t nh\u1EA5n (Price.Limit) cho Qu\u1EA3ng c\xE1o Website t\u1ED1i thi\u1EC3u l\xE0 50 l\u01B0\u1EE3t (minCTA = 50). Hi\u1EC7n t\u1EA1i \u0111ang truy\u1EC1n: ${price.Limit}.`
|
|
2370
|
+
);
|
|
2371
|
+
}
|
|
2341
2372
|
}
|
|
2342
2373
|
} else if (payload.Type === VALID_AD_TYPES.VIDEO) {
|
|
2343
2374
|
if (price.Type !== 1 && price.Type !== 7) {
|
|
@@ -2781,14 +2812,31 @@ function validateUpdateAdPayload(payload, options = {}) {
|
|
|
2781
2812
|
);
|
|
2782
2813
|
}
|
|
2783
2814
|
}
|
|
2784
|
-
|
|
2815
|
+
const isNonEmptyStr = (val) => typeof val === "string" && val.trim().length > 0;
|
|
2816
|
+
if (payload.Type === VALID_AD_TYPES.WEBSITE || Number(payload.Type) === 5) {
|
|
2817
|
+
if (!isNonEmptyStr(payload.Settings?.Image?.LandscapeCoverUrl)) {
|
|
2818
|
+
errors.push(
|
|
2819
|
+
"Settings.Image.LandscapeCoverUrl l\xE0 b\u1EAFt bu\u1ED9c \u0111\u1ED1i v\u1EDBi Qu\u1EA3ng c\xE1o Website (Ad Type 5). Vui l\xF2ng upload \u1EA3nh b\xECa t\u1EC9 l\u1EC7 16:9 (1024x533 px) l\xEAn CDN Zalo Ads tr\u01B0\u1EDBc khi l\u01B0u."
|
|
2820
|
+
);
|
|
2821
|
+
}
|
|
2822
|
+
} else if (payload.Type === VALID_AD_TYPES.FORM || Number(payload.Type) === 18) {
|
|
2785
2823
|
if (!payload.ZaloFormId || !payload.ZaloFormId.trim()) {
|
|
2786
2824
|
errors.push("ZaloFormId l\xE0 b\u1EAFt bu\u1ED9c \u0111\u1ED1i v\u1EDBi Qu\u1EA3ng c\xE1o Form (Ad Type 18).");
|
|
2787
2825
|
}
|
|
2826
|
+
if (!isNonEmptyStr(payload.Settings?.Image?.LandscapeCoverUrl)) {
|
|
2827
|
+
errors.push(
|
|
2828
|
+
"Settings.Image.LandscapeCoverUrl l\xE0 b\u1EAFt bu\u1ED9c \u0111\u1ED1i v\u1EDBi Qu\u1EA3ng c\xE1o Form (Ad Type 18). Vui l\xF2ng upload \u1EA3nh b\xECa t\u1EC9 l\u1EC7 16:9 (1024x533 px) l\xEAn CDN Zalo Ads tr\u01B0\u1EDBc khi l\u01B0u."
|
|
2829
|
+
);
|
|
2830
|
+
}
|
|
2788
2831
|
} else if (payload.Type === VALID_AD_TYPES.MESSAGE || payload.Type === VALID_AD_TYPES.MESSAGE_LEGACY || Number(payload.Type) === 19 || Number(payload.Type) === 30) {
|
|
2789
|
-
if (!payload.Settings?.Image?.LogoUrl) {
|
|
2832
|
+
if (!isNonEmptyStr(payload.Settings?.Image?.LogoUrl)) {
|
|
2790
2833
|
errors.push("Settings.Image.LogoUrl l\xE0 b\u1EAFt bu\u1ED9c \u0111\u1ED1i v\u1EDBi Qu\u1EA3ng c\xE1o Tin Nh\u1EAFn (Ad Type 19/30).");
|
|
2791
2834
|
}
|
|
2835
|
+
if (!isNonEmptyStr(payload.Settings?.Image?.LandscapeCoverUrl)) {
|
|
2836
|
+
errors.push(
|
|
2837
|
+
"Settings.Image.LandscapeCoverUrl l\xE0 b\u1EAFt bu\u1ED9c \u0111\u1ED1i v\u1EDBi Qu\u1EA3ng c\xE1o Tin Nh\u1EAFn (Ad Type 19/30). Vui l\xF2ng upload \u1EA3nh b\xECa t\u1EC9 l\u1EC7 16:9 (1024x533 px) l\xEAn CDN Zalo Ads tr\u01B0\u1EDBc khi l\u01B0u."
|
|
2838
|
+
);
|
|
2839
|
+
}
|
|
2792
2840
|
const hasFlow = payload.ZaloFlowId && Number(payload.ZaloFlowId) > 0;
|
|
2793
2841
|
const hasMiniPage = payload.MiniPageId && Number(payload.MiniPageId) > 0;
|
|
2794
2842
|
if (!hasFlow && !hasMiniPage) {
|
|
@@ -2796,30 +2844,58 @@ function validateUpdateAdPayload(payload, options = {}) {
|
|
|
2796
2844
|
"Qu\u1EA3ng c\xE1o Tin Nh\u1EAFn y\xEAu c\u1EA7u ph\u1EA3i ch\u1ECDn K\u1ECBch b\u1EA3n tin nh\u1EAFn (ZaloFlowId > 0) ho\u1EB7c Trang gi\u1EDBi thi\u1EC7u th\u01B0\u01A1ng hi\u1EC7u (MiniPageId > 0)."
|
|
2797
2845
|
);
|
|
2798
2846
|
}
|
|
2799
|
-
} else if (payload.Type === VALID_AD_TYPES.COMMERCE) {
|
|
2847
|
+
} else if (payload.Type === VALID_AD_TYPES.COMMERCE || Number(payload.Type) === 28) {
|
|
2800
2848
|
if (!payload.MiniPageId || payload.MiniPageId <= 0) {
|
|
2801
2849
|
errors.push("MiniPageId l\xE0 b\u1EAFt bu\u1ED9c \u0111\u1ED1i v\u1EDBi Qu\u1EA3ng c\xE1o Commerce (Ad Type 28, Template 1/2/3).");
|
|
2802
2850
|
}
|
|
2803
|
-
|
|
2851
|
+
const hasSquare = isNonEmptyStr(payload.Settings?.Image?.SquareCoverUrl);
|
|
2852
|
+
const hasLandscape = isNonEmptyStr(payload.Settings?.Image?.LandscapeCoverUrl);
|
|
2853
|
+
if (!hasSquare && !hasLandscape) {
|
|
2854
|
+
errors.push(
|
|
2855
|
+
"Settings.Image.SquareCoverUrl (ho\u1EB7c LandscapeCoverUrl) l\xE0 b\u1EAFt bu\u1ED9c \u0111\u1ED1i v\u1EDBi Qu\u1EA3ng c\xE1o Commerce (Ad Type 28). Vui l\xF2ng upload \u1EA3nh s\u1EA3n ph\u1EA9m (1024x1024 px) l\xEAn CDN Zalo Ads tr\u01B0\u1EDBc khi l\u01B0u."
|
|
2856
|
+
);
|
|
2857
|
+
}
|
|
2858
|
+
} else if (payload.Type === VALID_AD_TYPES.OA || Number(payload.Type) === 2) {
|
|
2859
|
+
if (!isNonEmptyStr(payload.Settings?.Image?.LandscapeCoverUrl)) {
|
|
2860
|
+
errors.push(
|
|
2861
|
+
"Settings.Image.LandscapeCoverUrl l\xE0 b\u1EAFt bu\u1ED9c \u0111\u1ED1i v\u1EDBi Qu\u1EA3ng c\xE1o OA (Ad Type 2). Vui l\xF2ng upload \u1EA3nh b\xECa (1024x533 px) l\xEAn CDN Zalo Ads tr\u01B0\u1EDBc khi l\u01B0u."
|
|
2862
|
+
);
|
|
2863
|
+
}
|
|
2864
|
+
if (payload.Settings?.AdInfo?.Action !== void 0 && Number(payload.Settings.AdInfo.Action) !== 6) {
|
|
2865
|
+
warnings.push("Qu\u1EA3ng c\xE1o OA ch\u1EC9 ch\u1EA5p nh\u1EADn Action = 6 (Quan t\xE2m OA).");
|
|
2866
|
+
}
|
|
2867
|
+
} else if (payload.Type === VALID_AD_TYPES.ARTICLE || Number(payload.Type) === 3) {
|
|
2868
|
+
if (!payload.ZaloFeedId && !payload.articleId) {
|
|
2869
|
+
errors.push("ZaloFeedId ho\u1EB7c articleId l\xE0 b\u1EAFt bu\u1ED9c \u0111\u1ED1i v\u1EDBi Qu\u1EA3ng c\xE1o B\xE0i Vi\u1EBFt (Ad Type 3).");
|
|
2870
|
+
}
|
|
2871
|
+
if (!isNonEmptyStr(payload.Settings?.Image?.LandscapeCoverUrl)) {
|
|
2872
|
+
errors.push(
|
|
2873
|
+
"Settings.Image.LandscapeCoverUrl l\xE0 b\u1EAFt bu\u1ED9c \u0111\u1ED1i v\u1EDBi Qu\u1EA3ng c\xE1o B\xE0i Vi\u1EBFt (Ad Type 3). Vui l\xF2ng upload \u1EA3nh \u0111\u1EA1i di\u1EC7n b\xE0i vi\u1EBFt (1024x533 px) l\xEAn CDN Zalo Ads tr\u01B0\u1EDBc khi l\u01B0u."
|
|
2874
|
+
);
|
|
2875
|
+
}
|
|
2876
|
+
} else if (payload.Type === VALID_AD_TYPES.VIDEO || Number(payload.Type) === 11) {
|
|
2804
2877
|
if (!payload.ZaloVideoId && !payload.Settings?.Image?.VideoUrl) {
|
|
2805
2878
|
errors.push("ZaloVideoId ho\u1EB7c Settings.Image.VideoUrl l\xE0 b\u1EAFt bu\u1ED9c \u0111\u1ED1i v\u1EDBi Qu\u1EA3ng c\xE1o Video (Ad Type 11).");
|
|
2806
2879
|
}
|
|
2807
2880
|
if (payload.Settings?.Image?.VideoUrl && !payload.Settings.Image.VideoUrl.includes("zascdn.me")) {
|
|
2808
2881
|
warnings.push("VideoUrl n\xEAn l\xE0 \u0111\u01B0\u1EDDng d\u1EABn CDN ch\xEDnh th\u1EE9c c\u1EE7a Zalo Ads (*.zascdn.me).");
|
|
2809
2882
|
}
|
|
2810
|
-
|
|
2811
|
-
|
|
2812
|
-
errors.push("ZaloFeedId ho\u1EB7c articleId l\xE0 b\u1EAFt bu\u1ED9c \u0111\u1ED1i v\u1EDBi Qu\u1EA3ng c\xE1o B\xE0i Vi\u1EBFt (Ad Type 3).");
|
|
2883
|
+
if (!isNonEmptyStr(payload.Settings?.Image?.LandscapeCoverUrl)) {
|
|
2884
|
+
warnings.push("N\xEAn b\u1ED5 sung Settings.Image.LandscapeCoverUrl l\xE0m \u1EA3nh poster \u0111\u1EA1i di\u1EC7n khi video ch\u01B0a t\u1EF1 \u0111\u1ED9ng ph\xE1t.");
|
|
2813
2885
|
}
|
|
2814
2886
|
} else if (Number(payload.Type) === 21 || Number(payload.Type) === 23 || Number(payload.Type) === 26 || payload.Type === VALID_AD_TYPES.DISPLAY || payload.Type === VALID_AD_TYPES.DISPLAY_HALFPAGE || payload.Type === VALID_AD_TYPES.DISPLAY_MEDIUM_RECTANGLE) {
|
|
2815
2887
|
const img = payload.Settings?.Image;
|
|
2816
|
-
const hasImage = img?.LandscapeCoverUrl || img?.BaseLandscapeCoverUrl || img?.PortraitCoverUrl || img?.SquareCoverUrl;
|
|
2888
|
+
const hasImage = isNonEmptyStr(img?.LandscapeCoverUrl) || isNonEmptyStr(img?.BaseLandscapeCoverUrl) || isNonEmptyStr(img?.PortraitCoverUrl) || isNonEmptyStr(img?.SquareCoverUrl);
|
|
2817
2889
|
if (!hasImage) {
|
|
2818
2890
|
errors.push(
|
|
2819
2891
|
"Qu\u1EA3ng c\xE1o Display b\u1EAFt bu\u1ED9c ph\u1EA3i c\xF3 \xEDt nh\u1EA5t m\u1ED9t banner h\xECnh \u1EA3nh (Settings.Image.LandscapeCoverUrl ho\u1EB7c BaseLandscapeCoverUrl)."
|
|
2820
2892
|
);
|
|
2821
2893
|
}
|
|
2822
2894
|
}
|
|
2895
|
+
const coverUrl = payload.Settings?.Image?.LandscapeCoverUrl;
|
|
2896
|
+
if (coverUrl && typeof coverUrl === "string" && !coverUrl.includes("zascdn.me") && !coverUrl.includes("zadn.vn") && !coverUrl.includes("zdn.vn") && !coverUrl.includes("zalo.me")) {
|
|
2897
|
+
warnings.push("\u1EA2nh b\xECa (LandscapeCoverUrl) n\xEAn \u0111\u01B0\u1EE3c t\u1EA3i l\xEAn CDN Zalo Ads (*.zascdn.me) \u0111\u1EC3 \u0111\u1EA3m b\u1EA3o duy\u1EC7t.");
|
|
2898
|
+
}
|
|
2823
2899
|
return {
|
|
2824
2900
|
isValid: errors.length === 0,
|
|
2825
2901
|
errors,
|