@quicktvui/tv-ad-unlock 1.1.1 → 1.1.2

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.
@@ -0,0 +1,607 @@
1
+ import { ref, watch, onUnmounted, defineComponent, inject, computed, resolveComponent, openBlock, createElementBlock, createElementVNode, toDisplayString, unref, createBlock, createCommentVNode } from 'vue';
2
+ import { useESRouter, ESRouteType } from '@extscreen/es3-router';
3
+ import { useESLocalStorage, useESToast, useESRuntime, ESKeyCode } from '@extscreen/es3-core';
4
+
5
+ const DEFAULT_INVALID_TIMEOUT = 3e5;
6
+ const DEFAULT_POLL_INTERVAL = 1e3;
7
+ function createStorageKeys(packageName) {
8
+ return {
9
+ credits: `${packageName}_ad_credits`,
10
+ totalAdsWatched: `${packageName}_ad_total_ads`,
11
+ permanentUnlocked: `${packageName}_ad_permanent`,
12
+ todayUnlocked: `${packageName}_ad_today_unlocked`,
13
+ todayPlayCount: `${packageName}_ad_today_plays`,
14
+ todayAdCount: `${packageName}_ad_today_ad_count`,
15
+ todayDate: `${packageName}_ad_today_date`
16
+ };
17
+ }
18
+ function useTVAdUnlockStorage(storage, keys, initialCredits = 5) {
19
+ function getTodayString() {
20
+ const today = /* @__PURE__ */ new Date();
21
+ return `${today.getFullYear()}-${today.getMonth() + 1}-${today.getDate()}`;
22
+ }
23
+ async function checkDailyReset() {
24
+ const today = getTodayString();
25
+ const savedDate = await storage.getString(keys.todayDate, "");
26
+ if (savedDate !== today) {
27
+ await storage.putString(keys.todayDate, today);
28
+ await storage.putInt(keys.todayPlayCount, 0);
29
+ await storage.putBoolean(keys.todayUnlocked, false);
30
+ await storage.putInt(keys.todayAdCount, 0);
31
+ }
32
+ }
33
+ async function getCredits() {
34
+ return storage.getInt(keys.credits, initialCredits);
35
+ }
36
+ async function setCredits(value) {
37
+ await storage.putInt(keys.credits, value);
38
+ }
39
+ async function addCredits(amount) {
40
+ const current = await getCredits();
41
+ await storage.putInt(keys.credits, current + amount);
42
+ }
43
+ async function consumeCredits(amount) {
44
+ const current = await getCredits();
45
+ if (current <= 0) return 0;
46
+ const consumed = Math.min(current, amount);
47
+ await storage.putInt(keys.credits, current - consumed);
48
+ return consumed;
49
+ }
50
+ async function consumeAllCredits() {
51
+ const current = await getCredits();
52
+ if (current > 0) {
53
+ await storage.putInt(keys.credits, 0);
54
+ }
55
+ return current;
56
+ }
57
+ async function isTodayUnlocked() {
58
+ await checkDailyReset();
59
+ return storage.getBoolean(keys.todayUnlocked, false);
60
+ }
61
+ async function setTodayUnlocked() {
62
+ const today = getTodayString();
63
+ await storage.putString(keys.todayDate, today);
64
+ await storage.putBoolean(keys.todayUnlocked, true);
65
+ }
66
+ async function getTodayPlayCount() {
67
+ await checkDailyReset();
68
+ return storage.getInt(keys.todayPlayCount, 0);
69
+ }
70
+ async function incrementPlayCount() {
71
+ const count = await getTodayPlayCount();
72
+ const newCount = count + 1;
73
+ await storage.putInt(keys.todayPlayCount, newCount);
74
+ return newCount;
75
+ }
76
+ async function getTotalAdsWatched() {
77
+ return storage.getInt(keys.totalAdsWatched, 0);
78
+ }
79
+ async function incrementTotalAdsWatched() {
80
+ const count = await getTotalAdsWatched();
81
+ const newCount = count + 1;
82
+ await storage.putInt(keys.totalAdsWatched, newCount);
83
+ return newCount;
84
+ }
85
+ async function isPermanentlyUnlocked() {
86
+ return storage.getBoolean(keys.permanentUnlocked, false);
87
+ }
88
+ async function setPermanentUnlocked() {
89
+ await storage.putBoolean(keys.permanentUnlocked, true);
90
+ }
91
+ async function getTodayAdCount() {
92
+ await checkDailyReset();
93
+ return storage.getInt(keys.todayAdCount, 0);
94
+ }
95
+ async function incrementTodayAdCount() {
96
+ const count = await getTodayAdCount();
97
+ const newCount = count + 1;
98
+ await storage.putInt(keys.todayAdCount, newCount);
99
+ return newCount;
100
+ }
101
+ return {
102
+ checkDailyReset,
103
+ getCredits,
104
+ setCredits,
105
+ addCredits,
106
+ consumeCredits,
107
+ consumeAllCredits,
108
+ isTodayUnlocked,
109
+ setTodayUnlocked,
110
+ getTodayPlayCount,
111
+ incrementPlayCount,
112
+ getTotalAdsWatched,
113
+ incrementTotalAdsWatched,
114
+ isPermanentlyUnlocked,
115
+ setPermanentUnlocked,
116
+ getTodayAdCount,
117
+ incrementTodayAdCount
118
+ };
119
+ }
120
+ function useTVAdUnlock(config, storageKeys, requestManager, callbacks) {
121
+ const adQrCode = ref("");
122
+ const isInvalid = ref(false);
123
+ const qrCodeState = ref(0);
124
+ const isLoading = ref(false);
125
+ const isStopPoll = ref(false);
126
+ const isShowConfirmToast = ref(false);
127
+ let invalidTimer = null;
128
+ let pollTimer = null;
129
+ const invalidTimeout = config.invalidTimeout ?? DEFAULT_INVALID_TIMEOUT;
130
+ const pollInterval = config.pollInterval ?? DEFAULT_POLL_INTERVAL;
131
+ const urlGetDeviceCode = config.superRequestBaseUrl + "/superc/ad/open/v2/tv/getAdUrl";
132
+ const urlPollTVADStatus = config.superRequestBaseUrl + "/superc/ad/open/v2/tv/pollTVADStatus";
133
+ watch(() => qrCodeState.value, (newVal, oldVal) => {
134
+ if (newVal === 1 && oldVal === 0) {
135
+ startInvalidTimer();
136
+ callbacks?.onQrCodeScanned?.();
137
+ }
138
+ });
139
+ async function pollTVADStatus(deviceId) {
140
+ try {
141
+ const res = await requestManager.post(urlPollTVADStatus, {
142
+ data: { deviceId }
143
+ });
144
+ if (isStopPoll.value) {
145
+ return;
146
+ }
147
+ qrCodeState.value = parseInt(`${res}`);
148
+ if (qrCodeState.value === 2) {
149
+ callbacks?.onUnlockSuccess?.();
150
+ } else {
151
+ pollTimer = setTimeout(() => {
152
+ pollTVADStatus(deviceId);
153
+ }, pollInterval);
154
+ }
155
+ } catch {
156
+ pollTimer = setTimeout(() => {
157
+ pollTVADStatus(deviceId);
158
+ }, pollInterval);
159
+ }
160
+ }
161
+ async function getAdQrCode(deviceId, scanTitle = "\u89C2\u770B\u5956\u52B1", scanContent = "\u89C2\u770B\u5E7F\u544A\u540E\u53EF\u83B7\u5F97\u5956\u52B1", scanToast = "\u5956\u52B1\u5DF2\u83B7\u5F97\uFF0C\u8BF7\u524D\u5F80\u7535\u89C6\u7AEF\u89C2\u770B") {
162
+ isLoading.value = true;
163
+ isInvalid.value = false;
164
+ qrCodeState.value = 0;
165
+ try {
166
+ const res = await requestManager.post(urlGetDeviceCode, {
167
+ data: {
168
+ deviceId,
169
+ scanTitle,
170
+ scanContent,
171
+ scanToast
172
+ }
173
+ });
174
+ if (res) {
175
+ adQrCode.value = res;
176
+ isInvalid.value = false;
177
+ startPollTvADStatusTimer(deviceId);
178
+ startInvalidTimer();
179
+ isLoading.value = false;
180
+ return res;
181
+ } else {
182
+ isLoading.value = false;
183
+ callbacks?.onUnlockFailed?.(new Error("\u83B7\u53D6\u4E8C\u7EF4\u7801\u5931\u8D25"));
184
+ return "";
185
+ }
186
+ } catch (e) {
187
+ isLoading.value = false;
188
+ callbacks?.onUnlockFailed?.(e);
189
+ return "";
190
+ }
191
+ }
192
+ function startPollTvADStatusTimer(deviceId) {
193
+ stopPollTvADStatusTimer();
194
+ isStopPoll.value = false;
195
+ pollTimer = setTimeout(() => {
196
+ pollTVADStatus(deviceId);
197
+ }, pollInterval);
198
+ }
199
+ function stopPollTvADStatusTimer() {
200
+ if (pollTimer) {
201
+ clearTimeout(pollTimer);
202
+ pollTimer = null;
203
+ isStopPoll.value = true;
204
+ }
205
+ }
206
+ function stopInvalidTimer() {
207
+ if (invalidTimer) {
208
+ clearTimeout(invalidTimer);
209
+ invalidTimer = null;
210
+ }
211
+ }
212
+ function startInvalidTimer() {
213
+ stopInvalidTimer();
214
+ invalidTimer = setTimeout(() => {
215
+ invalidQrCode();
216
+ invalidTimer = null;
217
+ }, invalidTimeout);
218
+ }
219
+ function invalidQrCode() {
220
+ isInvalid.value = true;
221
+ stopPollTvADStatusTimer();
222
+ callbacks?.onQrCodeInvalid?.();
223
+ }
224
+ function reset() {
225
+ adQrCode.value = "";
226
+ isInvalid.value = false;
227
+ qrCodeState.value = 0;
228
+ isLoading.value = false;
229
+ isStopPoll.value = false;
230
+ isShowConfirmToast.value = false;
231
+ stopPollTvADStatusTimer();
232
+ stopInvalidTimer();
233
+ }
234
+ onUnmounted(() => {
235
+ stopPollTvADStatusTimer();
236
+ stopInvalidTimer();
237
+ });
238
+ return {
239
+ adQrCode,
240
+ isInvalid,
241
+ qrCodeState,
242
+ isLoading,
243
+ isShowConfirmToast,
244
+ getAdQrCode,
245
+ startPollTvADStatusTimer,
246
+ stopPollTvADStatusTimer,
247
+ startInvalidTimer,
248
+ stopInvalidTimer,
249
+ invalidQrCode,
250
+ reset
251
+ };
252
+ }
253
+
254
+ const DEFAULT_RULES = {
255
+ initialCredits: 5,
256
+ creditsPerAd: 5,
257
+ dailyUnlockEnabled: true,
258
+ permanentUnlockAfterTotalAds: 10
259
+ };
260
+ function useTVAdNavigator(config) {
261
+ const router = useESRouter();
262
+ const storage = useESLocalStorage();
263
+ const keys = createStorageKeys(config.packageName);
264
+ const adStorage = useTVAdUnlockStorage(storage, keys, config.initialCredits ?? DEFAULT_RULES.initialCredits);
265
+ const rules = {
266
+ initialCredits: config.initialCredits ?? DEFAULT_RULES.initialCredits,
267
+ creditsPerAd: config.creditsPerAd ?? DEFAULT_RULES.creditsPerAd,
268
+ dailyUnlockEnabled: config.dailyUnlockEnabled ?? DEFAULT_RULES.dailyUnlockEnabled,
269
+ permanentUnlockAfterTotalAds: config.permanentUnlockAfterTotalAds ?? DEFAULT_RULES.permanentUnlockAfterTotalAds
270
+ };
271
+ async function consume(amount) {
272
+ const consumed = await adStorage.consumeCredits(amount);
273
+ return { success: consumed > 0, consumed };
274
+ }
275
+ async function consumeAll() {
276
+ return adStorage.consumeAllCredits();
277
+ }
278
+ async function consumeAndNavigate(params) {
279
+ await adStorage.checkDailyReset();
280
+ if (rules.permanentUnlockAfterTotalAds > 0) {
281
+ const permanent = await adStorage.isPermanentlyUnlocked();
282
+ if (permanent) return false;
283
+ }
284
+ if (rules.dailyUnlockEnabled) {
285
+ const today = await adStorage.isTodayUnlocked();
286
+ if (today) return false;
287
+ }
288
+ const credits = await adStorage.getCredits();
289
+ if (credits > 0) {
290
+ await adStorage.consumeCredits(1);
291
+ return false;
292
+ }
293
+ router.push({
294
+ name: "ad",
295
+ params: {
296
+ creditsPerAd: String(rules.creditsPerAd),
297
+ permanentUnlockAfterTotalAds: String(rules.permanentUnlockAfterTotalAds)
298
+ }
299
+ });
300
+ return true;
301
+ }
302
+ async function getCredits() {
303
+ return adStorage.getCredits();
304
+ }
305
+ async function isPermanentlyUnlocked() {
306
+ if (rules.permanentUnlockAfterTotalAds <= 0) return false;
307
+ return adStorage.isPermanentlyUnlocked();
308
+ }
309
+ async function getTodayAdCount() {
310
+ return adStorage.getTodayAdCount();
311
+ }
312
+ async function addCredits(amount) {
313
+ return adStorage.addCredits(amount);
314
+ }
315
+ return {
316
+ consume,
317
+ consumeAll,
318
+ consumeAndNavigate,
319
+ getCredits,
320
+ isPermanentlyUnlocked,
321
+ getTodayAdCount,
322
+ addCredits
323
+ };
324
+ }
325
+
326
+ const TV_AD_UNLOCK_KEY = /* @__PURE__ */ Symbol("tvAdUnlock");
327
+
328
+ var script = /* @__PURE__ */ defineComponent({
329
+ __name: "TVAdUnlockView",
330
+ setup(__props, { expose: __expose }) {
331
+ const pluginContext = inject(TV_AD_UNLOCK_KEY);
332
+ const { requestManager, pageConfig: rawPageConfig, trackEvent, superRequestBaseUrl } = pluginContext;
333
+ const toast = useESToast();
334
+ const storage = useESLocalStorage();
335
+ const router = useESRouter();
336
+ const runtime = useESRuntime();
337
+ const dnum = runtime.getRuntimeDeviceId();
338
+ const packageName = runtime.getESAppName?.() ?? "unknown";
339
+ const keys = createStorageKeys(packageName);
340
+ const adStorage = useTVAdUnlockStorage(storage, keys);
341
+ const routeOverrides = ref({});
342
+ const routeRuleParams = ref({
343
+ creditsPerAd: 5,
344
+ permanentUnlockAfterTotalAds: 10
345
+ });
346
+ const pageConfig = computed(() => ({
347
+ ...rawPageConfig,
348
+ ...routeOverrides.value
349
+ }));
350
+ const payParams = ref({
351
+ assetId: "",
352
+ assetName: "",
353
+ fromId: "",
354
+ fromName: ""
355
+ });
356
+ async function handleUnlockSuccess() {
357
+ await adStorage.setTodayUnlocked();
358
+ await adStorage.addCredits(routeRuleParams.value.creditsPerAd);
359
+ const totalAds = await adStorage.incrementTotalAdsWatched();
360
+ await adStorage.incrementTodayAdCount();
361
+ if (totalAds >= routeRuleParams.value.permanentUnlockAfterTotalAds) {
362
+ await adStorage.setPermanentUnlocked();
363
+ }
364
+ trackEvent?.({ type: "page", name: "unlock_success" });
365
+ toast.showToast("\u89E3\u9501\u6210\u529F\uFF01");
366
+ router.back();
367
+ }
368
+ const {
369
+ adQrCode,
370
+ isInvalid,
371
+ qrCodeState,
372
+ isLoading,
373
+ isShowConfirmToast,
374
+ getAdQrCode,
375
+ stopPollTvADStatusTimer,
376
+ stopInvalidTimer,
377
+ reset
378
+ } = useTVAdUnlock(
379
+ {
380
+ superRequestBaseUrl,
381
+ invalidTimeout: 3e5,
382
+ pollInterval: 1e3
383
+ },
384
+ keys,
385
+ requestManager,
386
+ {
387
+ onUnlockSuccess: () => handleUnlockSuccess(),
388
+ onUnlockFailed: (error) => {
389
+ trackEvent?.({ type: "click", name: "unlock_failed" });
390
+ },
391
+ onQrCodeInvalid: () => {
392
+ trackEvent?.({ type: "click", name: "qr_code_invalid" });
393
+ },
394
+ onQrCodeScanned: () => {
395
+ trackEvent?.({ type: "click", name: "qr_code_scanned" });
396
+ }
397
+ }
398
+ );
399
+ function onKeyDown(event) {
400
+ switch (event.keyCode) {
401
+ case ESKeyCode.ES_KEYCODE_DPAD_CENTER:
402
+ case ESKeyCode.ES_KEYCODE_ENTER:
403
+ if (isInvalid.value || qrCodeState.value === 1) {
404
+ const cfg = pageConfig.value;
405
+ getAdQrCode(dnum, cfg.scanTitle, cfg.scanContent, cfg.scanToast);
406
+ }
407
+ break;
408
+ }
409
+ }
410
+ function onESCreate(params) {
411
+ payParams.value = {
412
+ assetId: params.assetId || "",
413
+ assetName: params.assetName || "",
414
+ fromId: params.fromId || "",
415
+ fromName: params.fromName || ""
416
+ };
417
+ if (params.creditsPerAd) {
418
+ routeRuleParams.value.creditsPerAd = parseInt(params.creditsPerAd) || 5;
419
+ }
420
+ if (params.permanentUnlockAfterTotalAds) {
421
+ routeRuleParams.value.permanentUnlockAfterTotalAds = parseInt(params.permanentUnlockAfterTotalAds) || 10;
422
+ }
423
+ const extra = {};
424
+ if (params.title) extra.title = params.title;
425
+ if (params.subTitle) extra.subTitle = params.subTitle;
426
+ if (params.scanTitle) extra.scanTitle = params.scanTitle;
427
+ if (params.scanContent) extra.scanContent = params.scanContent;
428
+ if (params.scanToast) extra.scanToast = params.scanToast;
429
+ if (params.invalidCodeImage) extra.invalidCodeImage = params.invalidCodeImage;
430
+ if (params.scannedCodeImage) extra.scannedCodeImage = params.scannedCodeImage;
431
+ routeOverrides.value = extra;
432
+ trackEvent?.({
433
+ type: "page",
434
+ name: "ad_page_show",
435
+ assetId: payParams.value.assetId,
436
+ assetName: payParams.value.assetName,
437
+ fromId: payParams.value.fromId,
438
+ fromName: payParams.value.fromName
439
+ });
440
+ const cfg = pageConfig.value;
441
+ getAdQrCode(dnum, cfg.scanTitle, cfg.scanContent, cfg.scanToast);
442
+ }
443
+ function onBackPressed() {
444
+ if (!isShowConfirmToast.value && qrCodeState.value === 1) {
445
+ toast.showToast("\u5E7F\u544A\u64AD\u653E\u4E2D\uFF0C\u8BF7\u4E0D\u8981\u5173\u95ED\u5F39\u7A97");
446
+ isShowConfirmToast.value = true;
447
+ return true;
448
+ } else {
449
+ stopPollTvADStatusTimer();
450
+ stopInvalidTimer();
451
+ router.back();
452
+ }
453
+ }
454
+ function onESDestroy() {
455
+ stopPollTvADStatusTimer();
456
+ stopInvalidTimer();
457
+ }
458
+ __expose({
459
+ onESCreate,
460
+ onKeyDown,
461
+ onBackPressed,
462
+ onESDestroy
463
+ });
464
+ const sContainer = {
465
+ width: "1920px",
466
+ height: "1080px",
467
+ backgroundColor: "rgba(0,0,0,0.7)",
468
+ display: "flex",
469
+ justifyContent: "center",
470
+ alignItems: "center"
471
+ };
472
+ const sContent = {
473
+ width: "892px",
474
+ height: "646px",
475
+ display: "flex",
476
+ flexDirection: "column",
477
+ alignItems: "center",
478
+ justifyContent: "center"
479
+ };
480
+ const sContentBg = {
481
+ position: "absolute",
482
+ width: "892px",
483
+ height: "646px",
484
+ backgroundColor: "#FBE6C4",
485
+ borderRadius: "30px",
486
+ borderWidth: "1px",
487
+ borderColor: "#979797"
488
+ };
489
+ const sTitle = {
490
+ fontWeight: "500",
491
+ fontSize: "46px",
492
+ color: "#000000"
493
+ };
494
+ const sSubTitle = {
495
+ marginTop: "32px",
496
+ fontWeight: "400",
497
+ fontSize: "30px",
498
+ color: "rgba(0,0,0,0.65)"
499
+ };
500
+ const sQrContainer = {
501
+ marginTop: "32px",
502
+ width: "300px",
503
+ height: "300px",
504
+ borderRadius: "30px",
505
+ backgroundColor: "#FFFFFF",
506
+ display: "flex",
507
+ justifyContent: "center",
508
+ alignItems: "center"
509
+ };
510
+ const sQrcode = {
511
+ position: "absolute",
512
+ width: "260px",
513
+ height: "260px",
514
+ borderRadius: "30px",
515
+ backgroundColor: "#FFFFFF"
516
+ };
517
+ const sInvalidCode = {
518
+ position: "absolute",
519
+ width: "300px",
520
+ height: "300px",
521
+ borderRadius: "30px",
522
+ backgroundColor: "transparent"
523
+ };
524
+ return (_ctx, _cache) => {
525
+ const _component_qt_qr_code = resolveComponent("qt-qr-code");
526
+ const _component_qt_image = resolveComponent("qt-image");
527
+ return openBlock(), createElementBlock("div", { style: sContainer }, [
528
+ createElementVNode("div", { style: sContent }, [
529
+ createElementVNode("div", { style: sContentBg }),
530
+ createElementVNode(
531
+ "span",
532
+ { style: sTitle },
533
+ toDisplayString(pageConfig.value.title),
534
+ 1
535
+ /* TEXT */
536
+ ),
537
+ createElementVNode(
538
+ "span",
539
+ { style: sSubTitle },
540
+ toDisplayString(pageConfig.value.subTitle),
541
+ 1
542
+ /* TEXT */
543
+ ),
544
+ createElementVNode("div", { style: sQrContainer }, [
545
+ unref(adQrCode) && !unref(isInvalid) && unref(qrCodeState) !== 1 ? (openBlock(), createBlock(_component_qt_qr_code, {
546
+ key: 0,
547
+ style: sQrcode,
548
+ content: unref(adQrCode)
549
+ }, null, 8, ["content"])) : createCommentVNode("v-if", true),
550
+ unref(isInvalid) ? (openBlock(), createBlock(_component_qt_image, {
551
+ key: 1,
552
+ style: sInvalidCode,
553
+ src: pageConfig.value.invalidCodeImage
554
+ }, null, 8, ["src"])) : createCommentVNode("v-if", true),
555
+ unref(qrCodeState) === 1 ? (openBlock(), createBlock(_component_qt_image, {
556
+ key: 2,
557
+ style: sInvalidCode,
558
+ src: pageConfig.value.scannedCodeImage
559
+ }, null, 8, ["src"])) : createCommentVNode("v-if", true)
560
+ ])
561
+ ])
562
+ ]);
563
+ };
564
+ }
565
+ });
566
+
567
+ script.__file = "src/TVAdUnlockView.vue";
568
+
569
+ var defaultInvalidCodeImage = "data:image/webp;base64,UklGRgIWAABXRUJQVlA4WAoAAAAQAAAALAEAKwEAQUxQSNkBAAABkHPbtrE9+7ON3v5i27Ztq3JS2bbxC2zbdsrPtnk+PmreXeVGxATAYLuYuYfv/M4sE9u7PPP3nSPzYuxgXbte59LF1k8/19veGt4bEoWDiZt8zPPckic8LNjmZdLEZOFi6mQz/K4IH28EGNYlURiZ2MWgseXCyfIJhiyoEVbWLDVgep3wsm66rv6VwszKkToiC4SbheGaXL4JOz+5aNkh/NyrIbqSIFXxLT0Shj5roY9wdEBzD0jypJm2wtJOTQ7S5CwAx0ya5DsDfYWnA4A9RNkOvCLKGziUEaXcIUKYGjKEKsPmUmXuaqqsWk+VTVzZqfyn/Kf8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yn/Kf8p/yn/Pf/R5uWUmXVTKrMHUqVYVFUCXUoI0qFA94Q5S2whyg7gP5EGQg4ZdKkwAXAYZqcB4D2NOncBI9I8hzN9ifJ4ObwhCIv0GJsFUGqW7WE3QTZB42uP+jxxVULYgrJURQF7aNqqFEzCnoX1hGjbi70L6ujRe1yGDm9khSVk2FsjyRKpPSA0QE3CHE7CCZOSyND+gw7mOqzu5QIZXt8YXrw5mQSpG4OhiXtB1zIsvmyLg+wh3Xt4xeeePAvs8QWy//36OTiVvYwGABWUDggAhQAAPBjAJ0BKi0BLAE+kUieTCWkKbAiVskSABIJZ278Kcguz+MukFsB+bq+/+smm5fqI/1PPmbjvpwe7d4Ph/N+s13GPsP8H+VPrX7Z+t/Nd9tvw327+7n+t/JXzn+PmoF+Pfy3/PcA2AD87/tHfrejXsR9m/YA/nH9g/5nrv3u333/T+wB/Jf8d6D31f6Bvqr/4e4j+w3WPUjX538tfUFAUWQ8YbsXaq4uxavLkG80e9FkOdaDtlbzR5kDhiy9wVyPFE3M4+vq13bAMBJp0PPxPza9z7O53eGs8NntwL7rP8J37iBcA+X3QxzfuAYSP5fmBynNMvz7xGDGstTcHdL6B/PWVzh8UcYv1u9Hp9xpe7yl9y4F32cp2uAndSi9PQrUGlNg6XBFtHEHj+to6DzIT+2JLt2Za+4Te3c8Hk4KFCdwPQx8/EXO33/D/9XPWgw3dGXBU6SkFWePlBCT9Du7TTexCgyZDqB6qBhJdenCq/DNx6mCQ6Gc2jCjx584hLg3qDHsVrfbdMbn4n/uO36osg5IqgJx2ZirCco/u5frFGzY0bKiE7GlVySqC0UGGIMWu+/TwXKVknS9j7gURsowpWOyeae0x1wFKCgTNvqYiOgfJCNIjtYJKvH2c6ndA7Asb9HzPFfO5jCCqNCudNCI0o1LGCuqfJhc4loyYPUqCDSZ1e+8BjkLj1b2SBh5l5b0EIhy9H+8rPtk6wz6cBAKgs+xo7Q/BmzRxfU/8oXhPpsY6K2tCdZNq4qpmQ1MLoYrMOwOWzNhYZ1MUTi6W9Pp8bQQfl0D7wS0zgcZmOjge64ZXpSQ2X6p7n/5imAMQXAFegNaO1ksuSEpwT/hyKBQ/zT+I8r3IARinZKw4Lst1vVuSeAoL4xi6yzPTeeMDFAs9kMiShV8zujE4W295Kxts+XAvO4bHI7dRx3w3HNmjMeh8PXBzAjsN91cecV+gP7KosNKGOr/jHPir5uEUu5gwN9yGH7yI20M4YcI2J3US3xX3CC0maxGlhgs8Z5gKrOAi0pmmndduwRJI9duhSKgfdM2Ck1tDK7y1ZifmmRZDx5RBvzpx4sv2YAA/uvUgAZ3DOw+hqcpH6SFHy7FWyRMsXhDVXEbo/QAAyezVMPAguabCWfAUN9aDhLT/pXGFwUIa7qqtTmbKzT4f/W2dsZFM+dWlzZVGwiBBE8gDgAFPYEZFoZPvTGLplNB9f/7IoUDuQ2GF5LW4HRzqzScR0u1liVSdHboclW9+a82orKrXkU0agw+wYAAAIvXNrGDIRIwiD5wh9t7TNNuZHz5xCmO5ORQ6fT5RtgBO4eAFhIlFg2a/lsHfkfJy5lFrwigo0gH4aT9uvVZuWJoUfhEeqWZgAQgAe8UwGycn0wO7JyysMZuST7nPT52koZpyMr0fB+dNiwVG2oxkO61JDSi7BPBulW6rWFPQy9Ls2BGINujstGd2SkxkYk4fxzQebAgiE4vySswFE4nKivtKH6wIDw2iNZDDzn3JxA+QWHWwkWng2X8jB350lj7ed6YMKjoZxBWig3/1NbtIGaJBfybsivixNjOBq6cp0BFWBM431Q/c8uas8KAThRiKkCJZEh0lzn8h5hDZGzIwqDkJT+hj5xlXDVkJUCDl4IGtrQOoyIDhR0K55xxc/wtps2jWENtjRps9SysS9K9e8AwQTCuiawm+ligEUXqG+EVWf2ZhSFtrFmg8F3AFnNRYVJ8XVqWjeWNUbCg4MRBmnAswWwNnKGrv5Z4UGi18LNli++cmYA9qXJ/2EPIX3Zhea1m0kMjU8eHk0GL4gvDLDaxdI9mRWfyPAdWSulZ63VfWU+S3isLoV9GbRB5NnIi4wpkTJdUWxLp+ylpgwYDkHfGY7D5WMeb4p6jHBa3YZGpSac/yvIflktzoHdt0Hw6SV0asLSDz8PuZxNTOEQXCnBSp7I5QwU4DLsdf74pXSp6jKnBoYQfvDBDJ60OAmfF/AG/4xKnl7o0FYCQfB6W2h7k7SP9MQ/ZKn1tqEJU36QoGE/EBqaRk60TZhZYLGJ8xCILGv+2QQ1X1lBdM9Dzdspdp/FyhPMuQfghgdokuAiakW+jkVgcUztVAA56Z2Dg5PllkjIPvJTakb4ORPcHwmrej8ZXPf/j+rFrQR1BwOfnqrGIotzSjle9gdS/XZayLkEauDK8Axs1/gFexmuhsX+cbUPhh/J8D4g9G+VPiSaW/bZHZeP9SS1FZn2zP22BP2U0ufhycQ+rWFYjBW0jHRBTSZRH3z4GG9Qn3CPv8SVZ5cpkL7tVTfYBTh/E5c5DUhQk+sr9EpmpfSS/a93EtfGNlgiAm4eUZ7apLf//+YixD6s1ymXh5621LzF5fpdym6C9DIUcbK4Ps9i51RLDHdgrsxHu+rUeYM+dHKt6Bla/6Pv3AHwnz2M/3D8mY7Mp0I8vuYqjRype+6wfcGtcJGuTLwu668eNa6WyuGq2KliJ9T8qubPTC3YkjQGTX9lA7OpagrfYb9TkZ6KjW5bGrVebiU0bI08452G6HobyHTRFU7Kx7Zv55E0iAaU/BwfQaHDLlhNlpnqd+mckLlDsFWgEibf92o5e4y7S1MUEijlrLOAE14ErTsAeRNgO/echqWMgZ8NUUQpEYXkJh6Sh6j/2kqmddlYJ5hdh8ltt8VJoDbu/52swNFqGPzpPxDojvds/0NXJ9z8BNTqnVPQAT6mbkvF9P9BbGf+Vk3xdz5+eQafkAirc5rOsTS8v0DJfJ73TdckFLJ5ES6ZVvvuwbROLhHtpnHITQvVsCFEGaH6NFPgfDG5WK4cbdpc3A3PHqoqdnGZ1lSHVR8YzgvLvIPeJRTAnu/xJpsTFSSyGy/6BnQtDPYlRc89EwAu+LvmMPd93vSggMrX/4EAMMKDBL8Fy3lpoK0zB49wftBITle6LewtoRCZ2grjMP4XHjZzJ+a42/y7fGx16fZVDm2HY7/GgtvCVFHtO0OEvv4DL/HuaKLkaWnknUidiNpENyBxBXenLTXphdLSm2R2bjw4CAQQw+rQtmp4evDmCeAC8k2V57ckTKUQjAJKcLvlKoMwQqwT610eVd0qn7prEkOT3iaSYP92vkdDwNPMOzn7XJ7wssYP7zd040aMCK9InXghvry3sUu5Hk1jV4gkslcfnCYtW3pCYS8bC4fHa6L+qoc8nHYh79qGi43Eotan7hRZ/3xaPyYTfTuMZTSqbCFs0TYY3g5tLq6RGlXJGGyxg2BSUwIXqq+E9jqbUH9L1oLn9/cKvSHKSRr3U5je+ZV+iudDoBgGPOT4nyaiHMshlf/ONf/b/EJFg52jGsKeJfqp4DnGGL1teFsCEgRbMGbKruaHWLzeYSZbr34h2tdMr50bHTrR0fS7JK5qTOsx6wT+Jy4mh676v2X2wUq34jYhoWzArLR3xICTpkIL581ihkj2eWpX5CoLfvuTsGZPjp3toxhng1iS3mq5GwTiroufg2dsdNMmj+IuYfxKhIS9YuyxodvEzMo4bi9eU9CxIFcTLIYFtHq5W/Q4NV+KPxf+jw9fgf3R0ybvr/QekDww4kquQ51JYOP+uGwOcttFbTpw5kjHiTO0fr4nupFGYvMgTGbgwMdLOrRt8pC4QLzGthQ+mMzNL/pfZOHp4gTK18SC+fsYoXWeZmHRXKMIGNHKvKjcB1R2sW4xbA84q01SIvLtb8/tSABPSA07QAuHrjoWjpoQGx0zjPFRuKrwhZE/dfUbv1WGiWdDppPMMwxxoLeHicNKtIHS9LjpQke5KW9au59f2RzDNRBN94KtSStkjcyAm/SNxuzX+GFau5y/rjJpDhMQXUlByQC3h28hR2+zFbkwvZ0Pz2yRUqCT+uu29qXuZjMLgS471sk4Ovqoc+bp2xcNCnABLXJDkX1ymVF/2B0S4KuiZYkZoNWg3hK1fYuYY5IvtWkk6JMJ+ClHw+plAng72DPQ1qnzttCHlwA9C63bto10x2+evaWJDRVsJTJqUDEDnQxOvh7i7m4Z2hao8hsm/iP4o2xeM/2QCY6iAz9jp9OCzQe302z3jbFpfcH3UrQosPjbcrsR0woFqHy1LVUrLH+CIHnmA0kdTXMeWLQlBTq00eM7i9JYbRVVcjfjLLBRaln4AXQsfKJ6ILu9B927jt6/gb9saEnFX1BO8UI3QnT9nYvWl2ss3JHRu1ZjmkldP6NsKgifJXTEDYq+yL9HIY3gG6ceb3WiozZYDDFSVs5W0mS29ec5SuXnbFHLX+f+jG1acpdoEj2g8CS5ELfPWL0P1k4H1tZlYvgcCRFxS9/cN9q5vr1fqWr6x5sg5U5p1Dvw5Jqb1Llcg6jCuQLqo5sLnEd8xIv3kdzF0dAAOI76hAKXessMbpP6j1vCRPKBxbFKLEPl01D+PVVpLVsqi1ypJkoiZlAQr0emvS06WVZPeDLIH9D5Oaaj63lrmD7iTy7Hq0pJ2wPegImJwLtsVUIrLN6K3XdB6LJ+PO62HaLrq4ngGtqvrkZZ18hnBQBOhXIUglxnChTgJ78erhox9NtWXR5tjowNTqiettEbNoku56nAoc04saVT/8hoamr+3bO/neGi4OmqSM/6CQf3rBfNHmDYIm3B//POw4qeXnzqHkqZHF9Qa3uLHe26+kIRJoegCIcDAtAbvXQXZzB0617n/d3uZ73EiL9ol1P9z5j9GKxkpEEmqVt/ZrEth2aKQaMXeIYSw06LO5I5yNbEooLcuMnBA53SSzT9U7rLlqNdU715mlnZQkuyHOfolsHwouYZWAEw40opdS1xd76UXl0c3jpOFrbpsA4vxfDGc0Zv+mmPVjTEB2R3SMLLW5UeZY5Va+bBORioMJBMaNK+zp/7WiRaUcLHEm/axo0nwLRyUZzRYnhfYzUijtD3VXouhTV6EBKgus+LJZcIhcV4uMrQ/2ySSoTNYYXAJ8TrBJVzO8xL3+10lS6RXnVk7sjjP5c0d5Ok1ZOxLlVfHM6ckK7wV/aNXqL5Hv/wBK9bQrB5KJ8FVAzZijt7ooOVqGlkGk28PHr8tgiQys4QuABX7JBosPI45sK8KFdluCqL8KUX0yXX9opaqp9JNxGYo/3QBWnRh/7IS/Wm6yzkjiTyiVN5mgfMMYWwsOr5PKTOyWcGblNqDUXGw0h4xUmxi3LJ1o/89ALudwYQYvSWb7CsBH36VbQdR/01sCDkgwEuDRGOSenuRaiDUXkmgioHrgL4galSd8ynwffvh8+NmNuAY0yGClNHY75DLomVdv0zd4sMd8diSEDSUHcwgKbAqJH/vZXI23Ac0fZevTjprYy87+hceKdgw/m5rEt8fQ0+Fn8UckEAFKzPTm+o+eBlRo4a5B6gZCL8tmMlAKwL8U4LmZZX9H2ITgjCRKAfJHu+HPviMU8mRL3n+ZCsCoe/51OldsUj0x4jtYKXYo59iFuAJP0svziD6mewUJgaYSQ6kHgnR8rXqhOlPzuD99AzkBziplXTi5OYnJJ+og8V/FBF7Oc9PbiNc0Q55ua8HEZc7gNh5TQHdLfqZtRHswg+xbfy6JLZGcoGzrATGpKLOTWbUF+2tgkbjmgn0ABOPihwsjtXqZYemHwzbKJEIBc+8c+2FwIj+q1IK0UbFSFkCnVOMRoIv5Y0CwL/A1HDIuPQAB0bg1s0cxdvfKbi45B+1lddzrcTy9DtBIRcAeaNFaFtUfixqlN0NCNQJQYeqRL96T7EQlXTNg9KhHZOrBeB0um4ihwFAwaBfzuUIP4Z26uYNPSWEq7QDNp2Rw/5kXDCpcag0EjnSVseOPIuoB57oddQGwesSfNzVPJypEZ60nHRRphJ9v7YQNnaC/GNr9uaPqy+jvEj68N/VD73sJU5vlrw1s9URL4IcXsgTWlcScptwYXP02LurhXWwGX+5z6STwRwd5XmPRhM8Lar3zyjtoWjwo42nzIRGyekEWOxzkIiKTzQcbwxGYvRz3ks75OL5Ik9j6wslcBxZ6l2eIDhR83ZZfzdy49FF6YYuX6tRg7rvvLesM79VW5c4bV/lRLt91MTQ6hoLwSOHdc6+HV9zlCjCWGRWPBBrnM3gDy/0bojSa6uH6VlySWznTcAUgXjV2xhRMoSB3kbKhcF/xK6lE7R5Dmgpje0/yScvqTsxP7MotNjUY19giiu7hJ55npUZy64vgRimZMHKEg72A7MkNKjdOYt/egJO3sxVJ5NQBe7K4zVL2So7TpCaxWH4cVnVnA0HAJ+6M3PsAHPgFzcsaaiczWgyfa8XiwzMecWxsjekabznbuhj4VvRMI1zl97FuuXDLhwd4s895mySN/uoxSELuYP27PbrBjf2F1NeHNigBogGCJtp0o2/bbxv5TXGDObKuyEzOAd0PfkvutUzjyWo1YkfOihLbS6mHqvSQ/EaqH32hSA5idAuiWdZhYtYoYCq2ZeTdKQfdX5rC5D4/M/2AaApOq0nYcm4JljhTMEYdahDRqDU7IRnONSAEtFkk7xYKGztKZAxqqaVG1M9WvHVAXWk47i/qb05Dt5DO28B1/zA16tQvYlFq2vKchHbasH1M6UM86PjRJHkGAEjjw2RlCwZDdN11kAkdu0iOMHRCv8GkWAAD3JSzmzRv4CDQSqcMTJ9nBECBcnLlZ6semOi6JN90fwf3pgJmuAc1Wy4DdByXw2IeS/3rEkI75CtHjTSRWHc+oEmkfi0QNYQUaoX+9oOTBX8cRAAClwUGcoxur4nsX8TLxn6sPqPqXR5wyZZjDkotIKCM+dz5JL3FFcS2dIstRnLRH3FO0D++3B91Pc+704FOhUXAAAAAIOYAs4+DeJHVVExPCXgKTPakvXI9OpJdmnEvEAAAAAAENztAAAAAAAAAAA=";
570
+
571
+ var defaultScannedCodeImage = "data:image/webp;base64,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";
572
+
573
+ const DEFAULT_PAGE_CONFIG = {
574
+ title: "\u89C2\u770B30\u79D2\u5E7F\u544A \u5F53\u65E5\u89E3\u9501",
575
+ subTitle: "\u624B\u673A\u6253\u5F00\u3010\u5FAE\u4FE1\u3011\u626B\u7801",
576
+ scanTitle: "\u89C2\u770B\u5956\u52B1",
577
+ scanContent: "\u89C2\u770B\u5E7F\u544A\u540E\u53EF\u83B7\u5F97\u5956\u52B1",
578
+ scanToast: "\u5956\u52B1\u5DF2\u83B7\u5F97\uFF0C\u8BF7\u524D\u5F80\u7535\u89C6\u7AEF\u89C2\u770B",
579
+ invalidCodeImage: defaultInvalidCodeImage,
580
+ scannedCodeImage: defaultScannedCodeImage
581
+ };
582
+ const DEFAULT_SUPER_REQUEST_BASE_URL = "https://superapi.extscreen.com/extscreenapi/api";
583
+ const tvAdUnlockPlugin = {
584
+ install(app, options) {
585
+ const pageConfig = {
586
+ ...DEFAULT_PAGE_CONFIG,
587
+ ...options.pageConfig
588
+ };
589
+ app.provide(TV_AD_UNLOCK_KEY, {
590
+ requestManager: options.requestManager,
591
+ trackEvent: options.trackEvent,
592
+ pageConfig,
593
+ superRequestBaseUrl: options.superRequestBaseUrl || DEFAULT_SUPER_REQUEST_BASE_URL
594
+ });
595
+ }
596
+ };
597
+ function createTVAdRoute() {
598
+ return {
599
+ path: "/ad",
600
+ name: "ad",
601
+ component: script,
602
+ type: ESRouteType.ES_ROUTE_TYPE_DIALOG
603
+ };
604
+ }
605
+
606
+ export { createStorageKeys, createTVAdRoute, tvAdUnlockPlugin, useTVAdNavigator, useTVAdUnlock, useTVAdUnlockStorage };
607
+ //# sourceMappingURL=index.esm.js.map