@quicktvui/tv-ad-unlock 1.0.6 → 1.1.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/package.json CHANGED
@@ -1,12 +1,11 @@
1
1
  {
2
2
  "name": "@quicktvui/tv-ad-unlock",
3
- "version": "1.0.6",
3
+ "version": "1.1.0",
4
4
  "description": "TV广告解锁组件 - 用于QuickTVUI框架的电视端广告解锁功能",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "files": [
8
- "dist",
9
- "src/assets"
8
+ "dist"
10
9
  ],
11
10
  "keywords": [
12
11
  "quicktvui",
@@ -23,11 +22,14 @@
23
22
  "vue": "^3.0.0"
24
23
  },
25
24
  "devDependencies": {
26
- "@rollup/plugin-node-resolve": "^16.0.3",
27
- "@vue/compiler-sfc": "^3.5.35",
28
- "rollup": "^4.60.4",
25
+ "@rollup/plugin-commonjs": "^25.0.0",
26
+ "@rollup/plugin-node-resolve": "^15.0.0",
27
+ "@rollup/plugin-url": "^8.0.0",
28
+ "@vue/compiler-sfc": "^3.4.0",
29
+ "rollup": "^4.0.0",
30
+ "rollup-plugin-copy": "^3.5.0",
31
+ "rollup-plugin-esbuild": "^6.0.0",
29
32
  "rollup-plugin-postcss": "^4.0.2",
30
- "rollup-plugin-typescript2": "^0.37.0",
31
33
  "rollup-plugin-vue": "^6.0.0",
32
34
  "typescript": "^5.0.0",
33
35
  "vue": "^3.0.0"
@@ -37,6 +39,8 @@
37
39
  "url": ""
38
40
  },
39
41
  "scripts": {
40
- "build": "tsc && rollup -c rollup.config.mjs"
42
+ "build": "pnpm run build:js && pnpm run build:dts",
43
+ "build:js": "rollup -c rollup.config.mjs",
44
+ "build:dts": "tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist"
41
45
  }
42
46
  }
@@ -1,61 +0,0 @@
1
-
2
- .ad-container[data-v-72decd47] {
3
- width: 1920px;
4
- height: 1080px;
5
- background-color: rgba(0, 0, 0, 0.7);
6
- display: flex;
7
- justify-content: center;
8
- align-items: center;
9
- }
10
- .content[data-v-72decd47] {
11
- width: 892px;
12
- height: 646px;
13
- display: flex;
14
- flex-direction: column;
15
- align-items: center;
16
- justify-content: center;
17
- }
18
- .content-bg[data-v-72decd47] {
19
- position: absolute;
20
- width: 892px;
21
- height: 646px;
22
- background-color: #FBE6C4;
23
- border-radius: 30px;
24
- border-width: 1px;
25
- border-color: #979797;
26
- }
27
- .title[data-v-72decd47] {
28
- font-weight: 500;
29
- font-size: 46px;
30
- color: #000000;
31
- }
32
- .sub-title[data-v-72decd47] {
33
- margin-top: 32px;
34
- font-weight: 400;
35
- font-size: 30px;
36
- color: rgba(0, 0, 0, 0.65);
37
- }
38
- .qrcode-container[data-v-72decd47] {
39
- margin-top: 32px;
40
- width: 300px;
41
- height: 300px;
42
- border-radius: 30px;
43
- background-color: #FFFFFF;
44
- display: flex;
45
- justify-content: center;
46
- align-items: center;
47
- }
48
- .qrcode[data-v-72decd47] {
49
- position: absolute;
50
- width: 260px;
51
- height: 260px;
52
- border-radius: 30px;
53
- background-color: #FFFFFF;
54
- }
55
- .invalid-code[data-v-72decd47] {
56
- position: absolute;
57
- width: 300px;
58
- height: 300px;
59
- border-radius: 30px;
60
- background-color: transparent;
61
- }
@@ -1,2 +0,0 @@
1
- export { default } from './TVAdUnlockView.vue';
2
- //# sourceMappingURL=TVAdUnlockView.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TVAdUnlockView.d.ts","sourceRoot":"","sources":["../src/TVAdUnlockView.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA"}
@@ -1,183 +0,0 @@
1
- import { defineComponent, inject, ref, computed, resolveComponent, openBlock, createElementBlock, createElementVNode, toDisplayString, unref, createBlock, createCommentVNode } from 'vue';
2
- import { useESToast, useESLocalStorage, useESRuntime, ESKeyCode } from '@extscreen/es3-core';
3
- import { useESRouter } from '@extscreen/es3-router';
4
- import { TV_AD_UNLOCK_KEY } from './plugin';
5
- import { createStorageKeys, useTVAdUnlockStorage, useTVAdUnlock } from './useTVAdUnlock';
6
-
7
- const _hoisted_1 = { class: "ad-container" };
8
- const _hoisted_2 = { class: "content" };
9
- const _hoisted_3 = { class: "title" };
10
- const _hoisted_4 = { class: "sub-title" };
11
- const _hoisted_5 = { class: "qrcode-container" };
12
- const _hoisted_6 = ["src"];
13
- const _hoisted_7 = ["src"];
14
- var script = /*@__PURE__*/ defineComponent({
15
- __name: 'TVAdUnlockView',
16
- setup(__props, { expose: __expose }) {
17
- const pluginContext = inject(TV_AD_UNLOCK_KEY);
18
- const { requestManager, pageConfig: rawPageConfig, trackEvent } = pluginContext;
19
- const toast = useESToast();
20
- const storage = useESLocalStorage();
21
- const router = useESRouter();
22
- const runtime = useESRuntime();
23
- const dnum = runtime.getRuntimeDeviceId();
24
- const packageName = runtime.getESAppName?.() ?? 'unknown';
25
- const keys = createStorageKeys(packageName);
26
- const adStorage = useTVAdUnlockStorage(storage, keys);
27
- const routeOverrides = ref({});
28
- const routeRuleParams = ref({
29
- creditsPerAd: 5,
30
- permanentUnlockAfterTotalAds: 10
31
- });
32
- const pageConfig = computed(() => ({
33
- ...rawPageConfig,
34
- ...routeOverrides.value
35
- }));
36
- const payParams = ref({
37
- assetId: '',
38
- assetName: '',
39
- fromId: '',
40
- fromName: ''
41
- });
42
- async function handleUnlockSuccess() {
43
- await adStorage.setTodayUnlocked();
44
- await adStorage.addCredits(routeRuleParams.value.creditsPerAd);
45
- const totalAds = await adStorage.incrementTotalAdsWatched();
46
- await adStorage.incrementTodayAdCount();
47
- if (totalAds >= routeRuleParams.value.permanentUnlockAfterTotalAds) {
48
- await adStorage.setPermanentUnlocked();
49
- }
50
- trackEvent?.({ type: 'page', name: 'unlock_success' });
51
- toast.showToast('解锁成功!');
52
- router.back();
53
- }
54
- const { adQrCode, isInvalid, qrCodeState, isLoading, isShowConfirmToast, getAdQrCode, stopPollTvADStatusTimer, stopInvalidTimer, reset } = useTVAdUnlock({
55
- packageName,
56
- superRequestBaseUrl: '',
57
- invalidTimeout: 300000,
58
- pollInterval: 1000
59
- }, keys, requestManager, {
60
- onUnlockSuccess: () => handleUnlockSuccess(),
61
- onUnlockFailed: (error) => {
62
- trackEvent?.({ type: 'click', name: 'unlock_failed' });
63
- },
64
- onQrCodeInvalid: () => {
65
- trackEvent?.({ type: 'click', name: 'qr_code_invalid' });
66
- },
67
- onQrCodeScanned: () => {
68
- trackEvent?.({ type: 'click', name: 'qr_code_scanned' });
69
- }
70
- });
71
- function onKeyDown(event) {
72
- switch (event.keyCode) {
73
- case ESKeyCode.ES_KEYCODE_DPAD_CENTER:
74
- case ESKeyCode.ES_KEYCODE_ENTER:
75
- if (isInvalid.value || qrCodeState.value === 1) {
76
- const cfg = pageConfig.value;
77
- getAdQrCode(dnum, cfg.scanTitle, cfg.scanContent, cfg.scanToast);
78
- }
79
- break;
80
- }
81
- }
82
- function onESCreate(params) {
83
- payParams.value = {
84
- assetId: params.assetId || '',
85
- assetName: params.assetName || '',
86
- fromId: params.fromId || '',
87
- fromName: params.fromName || ''
88
- };
89
- if (params.creditsPerAd) {
90
- routeRuleParams.value.creditsPerAd = parseInt(params.creditsPerAd) || 5;
91
- }
92
- if (params.permanentUnlockAfterTotalAds) {
93
- routeRuleParams.value.permanentUnlockAfterTotalAds = parseInt(params.permanentUnlockAfterTotalAds) || 10;
94
- }
95
- const extra = {};
96
- if (params.title)
97
- extra.title = params.title;
98
- if (params.subTitle)
99
- extra.subTitle = params.subTitle;
100
- if (params.scanTitle)
101
- extra.scanTitle = params.scanTitle;
102
- if (params.scanContent)
103
- extra.scanContent = params.scanContent;
104
- if (params.scanToast)
105
- extra.scanToast = params.scanToast;
106
- if (params.invalidCodeImage)
107
- extra.invalidCodeImage = params.invalidCodeImage;
108
- if (params.scannedCodeImage)
109
- extra.scannedCodeImage = params.scannedCodeImage;
110
- routeOverrides.value = extra;
111
- trackEvent?.({
112
- type: 'page',
113
- name: 'ad_page_show',
114
- assetId: payParams.value.assetId,
115
- assetName: payParams.value.assetName,
116
- fromId: payParams.value.fromId,
117
- fromName: payParams.value.fromName
118
- });
119
- const cfg = pageConfig.value;
120
- getAdQrCode(dnum, cfg.scanTitle, cfg.scanContent, cfg.scanToast);
121
- }
122
- function onBackPressed() {
123
- if (!isShowConfirmToast.value && qrCodeState.value === 1) {
124
- toast.showToast('广告播放中,请不要关闭弹窗');
125
- isShowConfirmToast.value = true;
126
- return true;
127
- }
128
- else {
129
- stopPollTvADStatusTimer();
130
- stopInvalidTimer();
131
- router.back();
132
- }
133
- }
134
- function onESDestroy() {
135
- stopPollTvADStatusTimer();
136
- stopInvalidTimer();
137
- }
138
- __expose({
139
- onESCreate,
140
- onKeyDown,
141
- onBackPressed,
142
- onESDestroy
143
- });
144
- return (_ctx, _cache) => {
145
- const _component_qt_qr_code = resolveComponent("qt-qr-code");
146
- return (openBlock(), createElementBlock("div", _hoisted_1, [
147
- createElementVNode("div", _hoisted_2, [
148
- _cache[0] || (_cache[0] = createElementVNode("div", { class: "content-bg" }, null, -1 /* CACHED */)),
149
- createElementVNode("span", _hoisted_3, toDisplayString(pageConfig.value.title), 1 /* TEXT */),
150
- createElementVNode("span", _hoisted_4, toDisplayString(pageConfig.value.subTitle), 1 /* TEXT */),
151
- createElementVNode("div", _hoisted_5, [
152
- (unref(adQrCode) && !unref(isInvalid) && unref(qrCodeState) !== 1)
153
- ? (openBlock(), createBlock(_component_qt_qr_code, {
154
- key: 0,
155
- class: "qrcode",
156
- content: unref(adQrCode)
157
- }, null, 8 /* PROPS */, ["content"]))
158
- : createCommentVNode("v-if", true),
159
- (unref(isInvalid))
160
- ? (openBlock(), createElementBlock("img", {
161
- key: 1,
162
- class: "invalid-code",
163
- src: pageConfig.value.invalidCodeImage
164
- }, null, 8 /* PROPS */, _hoisted_6))
165
- : createCommentVNode("v-if", true),
166
- (unref(qrCodeState) === 1)
167
- ? (openBlock(), createElementBlock("img", {
168
- key: 2,
169
- class: "invalid-code",
170
- src: pageConfig.value.scannedCodeImage
171
- }, null, 8 /* PROPS */, _hoisted_7))
172
- : createCommentVNode("v-if", true)
173
- ])
174
- ])
175
- ]));
176
- };
177
- }
178
- });
179
-
180
- script.__scopeId = "data-v-72decd47";
181
- script.__file = "src/TVAdUnlockView.vue";
182
-
183
- export { script as default };
@@ -1 +0,0 @@
1
- {"version":3,"file":"TVAdUnlockView.js","sourceRoot":"","sources":["../src/TVAdUnlockView.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA"}
package/dist/plugin.js DELETED
@@ -1,34 +0,0 @@
1
- import { ESRouteType } from '@extscreen/es3-router';
2
- import TVAdUnlockView from './TVAdUnlockView';
3
- export const TV_AD_UNLOCK_KEY = Symbol('tvAdUnlock');
4
- const DEFAULT_PAGE_CONFIG = {
5
- title: '观看30秒广告 当日解锁',
6
- subTitle: '手机打开【微信】扫码',
7
- scanTitle: '观看奖励',
8
- scanContent: '观看广告后可获得奖励',
9
- scanToast: '奖励已获得,请前往电视端观看',
10
- invalidCodeImage: '',
11
- scannedCodeImage: ''
12
- };
13
- export const tvAdUnlockPlugin = {
14
- install(app, options) {
15
- const pageConfig = {
16
- ...DEFAULT_PAGE_CONFIG,
17
- ...options.pageConfig
18
- };
19
- app.provide(TV_AD_UNLOCK_KEY, {
20
- requestManager: options.requestManager,
21
- trackEvent: options.trackEvent,
22
- pageConfig
23
- });
24
- }
25
- };
26
- export function createTVAdRoute() {
27
- return {
28
- path: '/ad',
29
- name: 'ad',
30
- component: TVAdUnlockView,
31
- type: ESRouteType.ES_ROUTE_TYPE_DIALOG
32
- };
33
- }
34
- //# sourceMappingURL=plugin.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAMnD,OAAO,cAAc,MAAM,kBAAkB,CAAA;AAE7C,MAAM,CAAC,MAAM,gBAAgB,GAA2C,MAAM,CAAC,YAAY,CAAC,CAAA;AAE5F,MAAM,mBAAmB,GAAmC;IAC1D,KAAK,EAAE,cAAc;IACrB,QAAQ,EAAE,YAAY;IACtB,SAAS,EAAE,MAAM;IACjB,WAAW,EAAE,YAAY;IACzB,SAAS,EAAE,gBAAgB;IAC3B,gBAAgB,EAAE,EAAE;IACpB,gBAAgB,EAAE,EAAE;CACrB,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,OAAO,CAAC,GAAQ,EAAE,OAAgC;QAChD,MAAM,UAAU,GAAmC;YACjD,GAAG,mBAAmB;YACtB,GAAG,OAAO,CAAC,UAAU;SACtB,CAAA;QAED,GAAG,CAAC,OAAO,CAAC,gBAAgB,EAAE;YAC5B,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,UAAU;SACX,CAAC,CAAA;IACJ,CAAC;CACF,CAAA;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO;QACL,IAAI,EAAE,KAAK;QACX,IAAI,EAAE,IAAI;QACV,SAAS,EAAE,cAAc;QACzB,IAAI,EAAE,WAAW,CAAC,oBAAoB;KACvC,CAAA;AACH,CAAC"}
package/dist/types.js DELETED
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=types.js.map
package/dist/types.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -1,82 +0,0 @@
1
- import { useESRouter } from '@extscreen/es3-router';
2
- import { useESLocalStorage } from '@extscreen/es3-core';
3
- import { createStorageKeys, useTVAdUnlockStorage } from './useTVAdUnlock';
4
- const DEFAULT_RULES = {
5
- initialCredits: 5,
6
- creditsPerAd: 5,
7
- dailyUnlockEnabled: true,
8
- permanentUnlockAfterTotalAds: 10
9
- };
10
- export function useTVAdNavigator(config) {
11
- const router = useESRouter();
12
- const storage = useESLocalStorage();
13
- const keys = createStorageKeys(config.packageName);
14
- const adStorage = useTVAdUnlockStorage(storage, keys, config.initialCredits ?? DEFAULT_RULES.initialCredits);
15
- const rules = {
16
- initialCredits: config.initialCredits ?? DEFAULT_RULES.initialCredits,
17
- creditsPerAd: config.creditsPerAd ?? DEFAULT_RULES.creditsPerAd,
18
- dailyUnlockEnabled: config.dailyUnlockEnabled ?? DEFAULT_RULES.dailyUnlockEnabled,
19
- permanentUnlockAfterTotalAds: config.permanentUnlockAfterTotalAds ?? DEFAULT_RULES.permanentUnlockAfterTotalAds
20
- };
21
- async function consume(amount) {
22
- const consumed = await adStorage.consumeCredits(amount);
23
- return { success: consumed > 0, consumed };
24
- }
25
- async function consumeAll() {
26
- return adStorage.consumeAllCredits();
27
- }
28
- async function consumeAndNavigate(params) {
29
- await adStorage.checkDailyReset();
30
- // 规则①:永久解锁 → 放行
31
- if (rules.permanentUnlockAfterTotalAds > 0) {
32
- const permanent = await adStorage.isPermanentlyUnlocked();
33
- if (permanent)
34
- return false;
35
- }
36
- // 规则②:今日已解锁 → 放行
37
- if (rules.dailyUnlockEnabled) {
38
- const today = await adStorage.isTodayUnlocked();
39
- if (today)
40
- return false;
41
- }
42
- // 规则③:信用点 > 0 → 扣 1 分,放行
43
- const credits = await adStorage.getCredits();
44
- if (credits > 0) {
45
- await adStorage.consumeCredits(1);
46
- return false;
47
- }
48
- // 规则④:兜底 → 弹广告
49
- router.push({
50
- name: 'ad',
51
- params: {
52
- creditsPerAd: String(rules.creditsPerAd),
53
- permanentUnlockAfterTotalAds: String(rules.permanentUnlockAfterTotalAds)
54
- }
55
- });
56
- return true;
57
- }
58
- async function getCredits() {
59
- return adStorage.getCredits();
60
- }
61
- async function isPermanentlyUnlocked() {
62
- if (rules.permanentUnlockAfterTotalAds <= 0)
63
- return false;
64
- return adStorage.isPermanentlyUnlocked();
65
- }
66
- async function getTodayAdCount() {
67
- return adStorage.getTodayAdCount();
68
- }
69
- async function addCredits(amount) {
70
- return adStorage.addCredits(amount);
71
- }
72
- return {
73
- consume,
74
- consumeAll,
75
- consumeAndNavigate,
76
- getCredits,
77
- isPermanentlyUnlocked,
78
- getTodayAdCount,
79
- addCredits
80
- };
81
- }
82
- //# sourceMappingURL=useTVAdNavigator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useTVAdNavigator.js","sourceRoot":"","sources":["../src/useTVAdNavigator.ts"],"names":[],"mappings":"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"}