@quicktvui/tv-ad-unlock 1.0.7 → 1.1.1
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.css +2 -0
- package/dist/index.css.map +1 -0
- package/dist/index.js +553 -5
- package/dist/index.js.map +1 -1
- package/package.json +16 -11
- package/dist/TVAdUnlockView.css +0 -61
- package/dist/TVAdUnlockView.d.ts +0 -2
- package/dist/TVAdUnlockView.d.ts.map +0 -1
- package/dist/TVAdUnlockView.js +0 -183
- package/dist/TVAdUnlockView.js.map +0 -1
- package/dist/plugin.js +0 -34
- package/dist/plugin.js.map +0 -1
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
- package/dist/useTVAdNavigator.js +0 -82
- package/dist/useTVAdNavigator.js.map +0 -1
- package/dist/useTVAdUnlock.js +0 -255
- package/dist/useTVAdUnlock.js.map +0 -1
- /package/{src → dist}/assets/invalid-code.webp +0 -0
- /package/{src → dist}/assets/scanned-code.webp +0 -0
package/dist/index.css
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
.ad-container[data-v-72decd47]{align-items:center;background-color:rgba(0,0,0,.7);display:flex;height:1080px;justify-content:center;width:1920px}.content[data-v-72decd47]{align-items:center;display:flex;flex-direction:column;height:646px;justify-content:center;width:892px}.content-bg[data-v-72decd47]{background-color:#fbe6c4;border-color:#979797;border-radius:30px;border-width:1px;height:646px;position:absolute;width:892px}.title[data-v-72decd47]{color:#000;font-size:46px;font-weight:500}.sub-title[data-v-72decd47]{color:rgba(0,0,0,.65);font-size:30px;font-weight:400;margin-top:32px}.qrcode-container[data-v-72decd47]{align-items:center;background-color:#fff;border-radius:30px;display:flex;height:300px;justify-content:center;margin-top:32px;width:300px}.qrcode[data-v-72decd47]{background-color:#fff;border-radius:30px;height:260px;position:absolute;width:260px}.invalid-code[data-v-72decd47]{background-color:transparent;border-radius:30px;height:300px;position:absolute;width:300px}
|
|
2
|
+
/*# sourceMappingURL=index.css.map */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["TVAdUnlockView.vue%3Fvue&type=style&index=0&id=72decd47&scoped=true&lang.css"],"names":[],"mappings":"AACA,+BAME,kBAAmB,CAHnB,+BAAoC,CACpC,YAAa,CAFb,aAAc,CAGd,sBAAuB,CAJvB,YAMF,CACA,0BAKE,kBAAmB,CAFnB,YAAa,CACb,qBAAsB,CAFtB,YAAa,CAIb,sBAAuB,CALvB,WAMF,CACA,6BAIE,wBAAyB,CAGzB,oBAAqB,CAFrB,kBAAmB,CACnB,gBAAiB,CAHjB,YAAa,CAFb,iBAAkB,CAClB,WAMF,CACA,wBAGE,UAAc,CADd,cAAe,CADf,eAGF,CACA,4BAIE,qBAA0B,CAD1B,cAAe,CADf,eAAgB,CADhB,eAIF,CACA,mCAQE,kBAAmB,CAHnB,qBAAyB,CADzB,kBAAmB,CAEnB,YAAa,CAHb,YAAa,CAIb,sBAAuB,CANvB,eAAgB,CAChB,WAOF,CACA,yBAKE,qBAAyB,CADzB,kBAAmB,CADnB,YAAa,CAFb,iBAAkB,CAClB,WAIF,CACA,+BAKE,4BAA6B,CAD7B,kBAAmB,CADnB,YAAa,CAFb,iBAAkB,CAClB,WAIF","file":"index.css","sourcesContent":["\n.ad-container[data-v-72decd47] {\n width: 1920px;\n height: 1080px;\n background-color: rgba(0, 0, 0, 0.7);\n display: flex;\n justify-content: center;\n align-items: center;\n}\n.content[data-v-72decd47] {\n width: 892px;\n height: 646px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n}\n.content-bg[data-v-72decd47] {\n position: absolute;\n width: 892px;\n height: 646px;\n background-color: #FBE6C4;\n border-radius: 30px;\n border-width: 1px;\n border-color: #979797;\n}\n.title[data-v-72decd47] {\n font-weight: 500;\n font-size: 46px;\n color: #000000;\n}\n.sub-title[data-v-72decd47] {\n margin-top: 32px;\n font-weight: 400;\n font-size: 30px;\n color: rgba(0, 0, 0, 0.65);\n}\n.qrcode-container[data-v-72decd47] {\n margin-top: 32px;\n width: 300px;\n height: 300px;\n border-radius: 30px;\n background-color: #FFFFFF;\n display: flex;\n justify-content: center;\n align-items: center;\n}\n.qrcode[data-v-72decd47] {\n position: absolute;\n width: 260px;\n height: 260px;\n border-radius: 30px;\n background-color: #FFFFFF;\n}\n.invalid-code[data-v-72decd47] {\n position: absolute;\n width: 300px;\n height: 300px;\n border-radius: 30px;\n background-color: transparent;\n}\n"]}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,553 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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 _hoisted_1 = { class: "ad-container" };
|
|
327
|
+
const _hoisted_2 = { class: "content" };
|
|
328
|
+
const _hoisted_3 = { class: "title" };
|
|
329
|
+
const _hoisted_4 = { class: "sub-title" };
|
|
330
|
+
const _hoisted_5 = { class: "qrcode-container" };
|
|
331
|
+
const _hoisted_6 = ["src"];
|
|
332
|
+
const _hoisted_7 = ["src"];
|
|
333
|
+
var script = /* @__PURE__ */ defineComponent({
|
|
334
|
+
__name: "TVAdUnlockView",
|
|
335
|
+
setup(__props, { expose: __expose }) {
|
|
336
|
+
const pluginContext = inject(TV_AD_UNLOCK_KEY);
|
|
337
|
+
const { requestManager, pageConfig: rawPageConfig, trackEvent } = pluginContext;
|
|
338
|
+
const toast = useESToast();
|
|
339
|
+
const storage = useESLocalStorage();
|
|
340
|
+
const router = useESRouter();
|
|
341
|
+
const runtime = useESRuntime();
|
|
342
|
+
const dnum = runtime.getRuntimeDeviceId();
|
|
343
|
+
const packageName = runtime.getESAppName?.() ?? "unknown";
|
|
344
|
+
const keys = createStorageKeys(packageName);
|
|
345
|
+
const adStorage = useTVAdUnlockStorage(storage, keys);
|
|
346
|
+
const routeOverrides = ref({});
|
|
347
|
+
const routeRuleParams = ref({
|
|
348
|
+
creditsPerAd: 5,
|
|
349
|
+
permanentUnlockAfterTotalAds: 10
|
|
350
|
+
});
|
|
351
|
+
const pageConfig = computed(() => ({
|
|
352
|
+
...rawPageConfig,
|
|
353
|
+
...routeOverrides.value
|
|
354
|
+
}));
|
|
355
|
+
const payParams = ref({
|
|
356
|
+
assetId: "",
|
|
357
|
+
assetName: "",
|
|
358
|
+
fromId: "",
|
|
359
|
+
fromName: ""
|
|
360
|
+
});
|
|
361
|
+
async function handleUnlockSuccess() {
|
|
362
|
+
await adStorage.setTodayUnlocked();
|
|
363
|
+
await adStorage.addCredits(routeRuleParams.value.creditsPerAd);
|
|
364
|
+
const totalAds = await adStorage.incrementTotalAdsWatched();
|
|
365
|
+
await adStorage.incrementTodayAdCount();
|
|
366
|
+
if (totalAds >= routeRuleParams.value.permanentUnlockAfterTotalAds) {
|
|
367
|
+
await adStorage.setPermanentUnlocked();
|
|
368
|
+
}
|
|
369
|
+
trackEvent?.({ type: "page", name: "unlock_success" });
|
|
370
|
+
toast.showToast("\u89E3\u9501\u6210\u529F\uFF01");
|
|
371
|
+
router.back();
|
|
372
|
+
}
|
|
373
|
+
const {
|
|
374
|
+
adQrCode,
|
|
375
|
+
isInvalid,
|
|
376
|
+
qrCodeState,
|
|
377
|
+
isLoading,
|
|
378
|
+
isShowConfirmToast,
|
|
379
|
+
getAdQrCode,
|
|
380
|
+
stopPollTvADStatusTimer,
|
|
381
|
+
stopInvalidTimer,
|
|
382
|
+
reset
|
|
383
|
+
} = useTVAdUnlock(
|
|
384
|
+
{
|
|
385
|
+
superRequestBaseUrl: "",
|
|
386
|
+
invalidTimeout: 3e5,
|
|
387
|
+
pollInterval: 1e3
|
|
388
|
+
},
|
|
389
|
+
keys,
|
|
390
|
+
requestManager,
|
|
391
|
+
{
|
|
392
|
+
onUnlockSuccess: () => handleUnlockSuccess(),
|
|
393
|
+
onUnlockFailed: (error) => {
|
|
394
|
+
trackEvent?.({ type: "click", name: "unlock_failed" });
|
|
395
|
+
},
|
|
396
|
+
onQrCodeInvalid: () => {
|
|
397
|
+
trackEvent?.({ type: "click", name: "qr_code_invalid" });
|
|
398
|
+
},
|
|
399
|
+
onQrCodeScanned: () => {
|
|
400
|
+
trackEvent?.({ type: "click", name: "qr_code_scanned" });
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
);
|
|
404
|
+
function onKeyDown(event) {
|
|
405
|
+
switch (event.keyCode) {
|
|
406
|
+
case ESKeyCode.ES_KEYCODE_DPAD_CENTER:
|
|
407
|
+
case ESKeyCode.ES_KEYCODE_ENTER:
|
|
408
|
+
if (isInvalid.value || qrCodeState.value === 1) {
|
|
409
|
+
const cfg = pageConfig.value;
|
|
410
|
+
getAdQrCode(dnum, cfg.scanTitle, cfg.scanContent, cfg.scanToast);
|
|
411
|
+
}
|
|
412
|
+
break;
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
function onESCreate(params) {
|
|
416
|
+
payParams.value = {
|
|
417
|
+
assetId: params.assetId || "",
|
|
418
|
+
assetName: params.assetName || "",
|
|
419
|
+
fromId: params.fromId || "",
|
|
420
|
+
fromName: params.fromName || ""
|
|
421
|
+
};
|
|
422
|
+
if (params.creditsPerAd) {
|
|
423
|
+
routeRuleParams.value.creditsPerAd = parseInt(params.creditsPerAd) || 5;
|
|
424
|
+
}
|
|
425
|
+
if (params.permanentUnlockAfterTotalAds) {
|
|
426
|
+
routeRuleParams.value.permanentUnlockAfterTotalAds = parseInt(params.permanentUnlockAfterTotalAds) || 10;
|
|
427
|
+
}
|
|
428
|
+
const extra = {};
|
|
429
|
+
if (params.title) extra.title = params.title;
|
|
430
|
+
if (params.subTitle) extra.subTitle = params.subTitle;
|
|
431
|
+
if (params.scanTitle) extra.scanTitle = params.scanTitle;
|
|
432
|
+
if (params.scanContent) extra.scanContent = params.scanContent;
|
|
433
|
+
if (params.scanToast) extra.scanToast = params.scanToast;
|
|
434
|
+
if (params.invalidCodeImage) extra.invalidCodeImage = params.invalidCodeImage;
|
|
435
|
+
if (params.scannedCodeImage) extra.scannedCodeImage = params.scannedCodeImage;
|
|
436
|
+
routeOverrides.value = extra;
|
|
437
|
+
trackEvent?.({
|
|
438
|
+
type: "page",
|
|
439
|
+
name: "ad_page_show",
|
|
440
|
+
assetId: payParams.value.assetId,
|
|
441
|
+
assetName: payParams.value.assetName,
|
|
442
|
+
fromId: payParams.value.fromId,
|
|
443
|
+
fromName: payParams.value.fromName
|
|
444
|
+
});
|
|
445
|
+
const cfg = pageConfig.value;
|
|
446
|
+
getAdQrCode(dnum, cfg.scanTitle, cfg.scanContent, cfg.scanToast);
|
|
447
|
+
}
|
|
448
|
+
function onBackPressed() {
|
|
449
|
+
if (!isShowConfirmToast.value && qrCodeState.value === 1) {
|
|
450
|
+
toast.showToast("\u5E7F\u544A\u64AD\u653E\u4E2D\uFF0C\u8BF7\u4E0D\u8981\u5173\u95ED\u5F39\u7A97");
|
|
451
|
+
isShowConfirmToast.value = true;
|
|
452
|
+
return true;
|
|
453
|
+
} else {
|
|
454
|
+
stopPollTvADStatusTimer();
|
|
455
|
+
stopInvalidTimer();
|
|
456
|
+
router.back();
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
function onESDestroy() {
|
|
460
|
+
stopPollTvADStatusTimer();
|
|
461
|
+
stopInvalidTimer();
|
|
462
|
+
}
|
|
463
|
+
__expose({
|
|
464
|
+
onESCreate,
|
|
465
|
+
onKeyDown,
|
|
466
|
+
onBackPressed,
|
|
467
|
+
onESDestroy
|
|
468
|
+
});
|
|
469
|
+
return (_ctx, _cache) => {
|
|
470
|
+
const _component_qt_qr_code = resolveComponent("qt-qr-code");
|
|
471
|
+
return openBlock(), createElementBlock("div", _hoisted_1, [
|
|
472
|
+
createElementVNode("div", _hoisted_2, [
|
|
473
|
+
_cache[0] || (_cache[0] = createElementVNode(
|
|
474
|
+
"div",
|
|
475
|
+
{ class: "content-bg" },
|
|
476
|
+
null,
|
|
477
|
+
-1
|
|
478
|
+
/* CACHED */
|
|
479
|
+
)),
|
|
480
|
+
createElementVNode(
|
|
481
|
+
"span",
|
|
482
|
+
_hoisted_3,
|
|
483
|
+
toDisplayString(pageConfig.value.title),
|
|
484
|
+
1
|
|
485
|
+
/* TEXT */
|
|
486
|
+
),
|
|
487
|
+
createElementVNode(
|
|
488
|
+
"span",
|
|
489
|
+
_hoisted_4,
|
|
490
|
+
toDisplayString(pageConfig.value.subTitle),
|
|
491
|
+
1
|
|
492
|
+
/* TEXT */
|
|
493
|
+
),
|
|
494
|
+
createElementVNode("div", _hoisted_5, [
|
|
495
|
+
unref(adQrCode) && !unref(isInvalid) && unref(qrCodeState) !== 1 ? (openBlock(), createBlock(_component_qt_qr_code, {
|
|
496
|
+
key: 0,
|
|
497
|
+
class: "qrcode",
|
|
498
|
+
content: unref(adQrCode)
|
|
499
|
+
}, null, 8, ["content"])) : createCommentVNode("v-if", true),
|
|
500
|
+
unref(isInvalid) ? (openBlock(), createElementBlock("img", {
|
|
501
|
+
key: 1,
|
|
502
|
+
class: "invalid-code",
|
|
503
|
+
src: pageConfig.value.invalidCodeImage
|
|
504
|
+
}, null, 8, _hoisted_6)) : createCommentVNode("v-if", true),
|
|
505
|
+
unref(qrCodeState) === 1 ? (openBlock(), createElementBlock("img", {
|
|
506
|
+
key: 2,
|
|
507
|
+
class: "invalid-code",
|
|
508
|
+
src: pageConfig.value.scannedCodeImage
|
|
509
|
+
}, null, 8, _hoisted_7)) : createCommentVNode("v-if", true)
|
|
510
|
+
])
|
|
511
|
+
])
|
|
512
|
+
]);
|
|
513
|
+
};
|
|
514
|
+
}
|
|
515
|
+
});
|
|
516
|
+
|
|
517
|
+
script.__scopeId = "data-v-72decd47";
|
|
518
|
+
script.__file = "src/TVAdUnlockView.vue";
|
|
519
|
+
|
|
520
|
+
const TV_AD_UNLOCK_KEY = /* @__PURE__ */ Symbol("tvAdUnlock");
|
|
521
|
+
const DEFAULT_PAGE_CONFIG = {
|
|
522
|
+
title: "\u89C2\u770B30\u79D2\u5E7F\u544A \u5F53\u65E5\u89E3\u9501",
|
|
523
|
+
subTitle: "\u624B\u673A\u6253\u5F00\u3010\u5FAE\u4FE1\u3011\u626B\u7801",
|
|
524
|
+
scanTitle: "\u89C2\u770B\u5956\u52B1",
|
|
525
|
+
scanContent: "\u89C2\u770B\u5E7F\u544A\u540E\u53EF\u83B7\u5F97\u5956\u52B1",
|
|
526
|
+
scanToast: "\u5956\u52B1\u5DF2\u83B7\u5F97\uFF0C\u8BF7\u524D\u5F80\u7535\u89C6\u7AEF\u89C2\u770B",
|
|
527
|
+
invalidCodeImage: "",
|
|
528
|
+
scannedCodeImage: ""
|
|
529
|
+
};
|
|
530
|
+
const tvAdUnlockPlugin = {
|
|
531
|
+
install(app, options) {
|
|
532
|
+
const pageConfig = {
|
|
533
|
+
...DEFAULT_PAGE_CONFIG,
|
|
534
|
+
...options.pageConfig
|
|
535
|
+
};
|
|
536
|
+
app.provide(TV_AD_UNLOCK_KEY, {
|
|
537
|
+
requestManager: options.requestManager,
|
|
538
|
+
trackEvent: options.trackEvent,
|
|
539
|
+
pageConfig
|
|
540
|
+
});
|
|
541
|
+
}
|
|
542
|
+
};
|
|
543
|
+
function createTVAdRoute() {
|
|
544
|
+
return {
|
|
545
|
+
path: "/ad",
|
|
546
|
+
name: "ad",
|
|
547
|
+
component: script,
|
|
548
|
+
type: ESRouteType.ES_ROUTE_TYPE_DIALOG
|
|
549
|
+
};
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
export { createStorageKeys, createTVAdRoute, tvAdUnlockPlugin, useTVAdNavigator, useTVAdUnlock, useTVAdUnlockStorage };
|
|
553
|
+
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AACvB,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACxF,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/useTVAdUnlock.ts","../src/useTVAdNavigator.ts","../src/TVAdUnlockView.vue","../src/plugin.ts"],"sourcesContent":["import { ref, watch, onUnmounted } from 'vue'\nimport type { ESLocalStorage } from '@extscreen/es3-core'\nimport type {\n TVAdUnlockConfig,\n TVAdUnlockParams,\n TVAdUnlockCallbacks,\n TVAdUnlockStorageKeys,\n RequestManager\n} from './types'\n\nconst DEFAULT_INVALID_TIMEOUT = 300000\nconst DEFAULT_POLL_INTERVAL = 1000\n\nexport function createStorageKeys(packageName: string): TVAdUnlockStorageKeys {\n return {\n credits: `${packageName}_ad_credits`,\n totalAdsWatched: `${packageName}_ad_total_ads`,\n permanentUnlocked: `${packageName}_ad_permanent`,\n todayUnlocked: `${packageName}_ad_today_unlocked`,\n todayPlayCount: `${packageName}_ad_today_plays`,\n todayAdCount: `${packageName}_ad_today_ad_count`,\n todayDate: `${packageName}_ad_today_date`\n }\n}\n\nexport function useTVAdUnlockStorage(\n storage: ESLocalStorage,\n keys: TVAdUnlockStorageKeys,\n initialCredits: number = 5\n) {\n function getTodayString(): string {\n const today = new Date()\n return `${today.getFullYear()}-${today.getMonth() + 1}-${today.getDate()}`\n }\n\n async function checkDailyReset(): Promise<void> {\n const today = getTodayString()\n const savedDate = await storage.getString(keys.todayDate, '')\n if (savedDate !== today) {\n await storage.putString(keys.todayDate, today)\n await storage.putInt(keys.todayPlayCount, 0)\n await storage.putBoolean(keys.todayUnlocked, false)\n await storage.putInt(keys.todayAdCount, 0)\n }\n }\n\n async function getCredits(): Promise<number> {\n return storage.getInt(keys.credits, initialCredits)\n }\n\n async function setCredits(value: number): Promise<void> {\n await storage.putInt(keys.credits, value)\n }\n\n async function addCredits(amount: number): Promise<void> {\n const current = await getCredits()\n await storage.putInt(keys.credits, current + amount)\n }\n\n async function consumeCredits(amount: number): Promise<number> {\n const current = await getCredits()\n if (current <= 0) return 0\n const consumed = Math.min(current, amount)\n await storage.putInt(keys.credits, current - consumed)\n return consumed\n }\n\n async function consumeAllCredits(): Promise<number> {\n const current = await getCredits()\n if (current > 0) {\n await storage.putInt(keys.credits, 0)\n }\n return current\n }\n\n async function isTodayUnlocked(): Promise<boolean> {\n await checkDailyReset()\n return storage.getBoolean(keys.todayUnlocked, false)\n }\n\n async function setTodayUnlocked(): Promise<void> {\n const today = getTodayString()\n await storage.putString(keys.todayDate, today)\n await storage.putBoolean(keys.todayUnlocked, true)\n }\n\n async function getTodayPlayCount(): Promise<number> {\n await checkDailyReset()\n return storage.getInt(keys.todayPlayCount, 0)\n }\n\n async function incrementPlayCount(): Promise<number> {\n const count = await getTodayPlayCount()\n const newCount = count + 1\n await storage.putInt(keys.todayPlayCount, newCount)\n return newCount\n }\n\n async function getTotalAdsWatched(): Promise<number> {\n return storage.getInt(keys.totalAdsWatched, 0)\n }\n\n async function incrementTotalAdsWatched(): Promise<number> {\n const count = await getTotalAdsWatched()\n const newCount = count + 1\n await storage.putInt(keys.totalAdsWatched, newCount)\n return newCount\n }\n\n async function isPermanentlyUnlocked(): Promise<boolean> {\n return storage.getBoolean(keys.permanentUnlocked, false)\n }\n\n async function setPermanentUnlocked(): Promise<void> {\n await storage.putBoolean(keys.permanentUnlocked, true)\n }\n\n async function getTodayAdCount(): Promise<number> {\n await checkDailyReset()\n return storage.getInt(keys.todayAdCount, 0)\n }\n\n async function incrementTodayAdCount(): Promise<number> {\n const count = await getTodayAdCount()\n const newCount = count + 1\n await storage.putInt(keys.todayAdCount, newCount)\n return newCount\n }\n\n return {\n checkDailyReset,\n getCredits,\n setCredits,\n addCredits,\n consumeCredits,\n consumeAllCredits,\n isTodayUnlocked,\n setTodayUnlocked,\n getTodayPlayCount,\n incrementPlayCount,\n getTotalAdsWatched,\n incrementTotalAdsWatched,\n isPermanentlyUnlocked,\n setPermanentUnlocked,\n getTodayAdCount,\n incrementTodayAdCount\n }\n}\n\nexport function useTVAdUnlock(\n config: TVAdUnlockConfig,\n storageKeys: TVAdUnlockStorageKeys,\n requestManager: RequestManager,\n callbacks?: TVAdUnlockCallbacks\n) {\n const adQrCode = ref('')\n const isInvalid = ref(false)\n const qrCodeState = ref(0)\n const isLoading = ref(false)\n const isStopPoll = ref(false)\n const isShowConfirmToast = ref(false)\n\n let invalidTimer: ReturnType<typeof setTimeout> | null = null\n let pollTimer: ReturnType<typeof setTimeout> | null = null\n\n const invalidTimeout = config.invalidTimeout ?? DEFAULT_INVALID_TIMEOUT\n const pollInterval = config.pollInterval ?? DEFAULT_POLL_INTERVAL\n\n const urlGetDeviceCode = config.superRequestBaseUrl + '/superc/ad/open/v2/tv/getAdUrl'\n const urlPollTVADStatus = config.superRequestBaseUrl + '/superc/ad/open/v2/tv/pollTVADStatus'\n\n watch(() => qrCodeState.value, (newVal: number, oldVal: number) => {\n if (newVal === 1 && oldVal === 0) {\n startInvalidTimer()\n callbacks?.onQrCodeScanned?.()\n }\n })\n\n async function pollTVADStatus(deviceId: string): Promise<void> {\n try {\n const res = await requestManager.post(urlPollTVADStatus, {\n data: { deviceId }\n })\n\n if (isStopPoll.value) {\n return\n }\n\n qrCodeState.value = parseInt(`${res}`)\n\n if (qrCodeState.value === 2) {\n callbacks?.onUnlockSuccess?.()\n } else {\n pollTimer = setTimeout(() => {\n pollTVADStatus(deviceId)\n }, pollInterval)\n }\n } catch {\n pollTimer = setTimeout(() => {\n pollTVADStatus(deviceId)\n }, pollInterval)\n }\n }\n\n async function getAdQrCode(deviceId: string, scanTitle: string = '观看奖励', scanContent: string = '观看广告后可获得奖励', scanToast: string = '奖励已获得,请前往电视端观看'): Promise<string> {\n isLoading.value = true\n isInvalid.value = false\n qrCodeState.value = 0\n\n try {\n const res = await requestManager.post(urlGetDeviceCode, {\n data: {\n deviceId,\n scanTitle,\n scanContent,\n scanToast\n }\n })\n\n if (res) {\n adQrCode.value = res\n isInvalid.value = false\n startPollTvADStatusTimer(deviceId)\n startInvalidTimer()\n isLoading.value = false\n return res\n } else {\n isLoading.value = false\n callbacks?.onUnlockFailed?.(new Error('获取二维码失败'))\n return ''\n }\n } catch (e) {\n isLoading.value = false\n callbacks?.onUnlockFailed?.(e as Error)\n return ''\n }\n }\n\n function startPollTvADStatusTimer(deviceId: string): void {\n stopPollTvADStatusTimer()\n isStopPoll.value = false\n pollTimer = setTimeout(() => {\n pollTVADStatus(deviceId)\n }, pollInterval)\n }\n\n function stopPollTvADStatusTimer(): void {\n if (pollTimer) {\n clearTimeout(pollTimer)\n pollTimer = null\n isStopPoll.value = true\n }\n }\n\n function stopInvalidTimer(): void {\n if (invalidTimer) {\n clearTimeout(invalidTimer)\n invalidTimer = null\n }\n }\n\n function startInvalidTimer(): void {\n stopInvalidTimer()\n invalidTimer = setTimeout(() => {\n invalidQrCode()\n invalidTimer = null\n }, invalidTimeout)\n }\n\n function invalidQrCode(): void {\n isInvalid.value = true\n stopPollTvADStatusTimer()\n callbacks?.onQrCodeInvalid?.()\n }\n\n function reset(): void {\n adQrCode.value = ''\n isInvalid.value = false\n qrCodeState.value = 0\n isLoading.value = false\n isStopPoll.value = false\n isShowConfirmToast.value = false\n stopPollTvADStatusTimer()\n stopInvalidTimer()\n }\n\n onUnmounted(() => {\n stopPollTvADStatusTimer()\n stopInvalidTimer()\n })\n\n return {\n adQrCode,\n isInvalid,\n qrCodeState,\n isLoading,\n isShowConfirmToast,\n getAdQrCode,\n startPollTvADStatusTimer,\n stopPollTvADStatusTimer,\n startInvalidTimer,\n stopInvalidTimer,\n invalidQrCode,\n reset\n }\n}","import { useESRouter } from '@extscreen/es3-router'\nimport { useESLocalStorage } from '@extscreen/es3-core'\nimport { createStorageKeys, useTVAdUnlockStorage } from './useTVAdUnlock'\nimport type { TVAdUnlockNavigatorConfig, TVAdUnlockRuleConfig } from './types'\n\nconst DEFAULT_RULES: Required<TVAdUnlockRuleConfig> = {\n initialCredits: 5,\n creditsPerAd: 5,\n dailyUnlockEnabled: true,\n permanentUnlockAfterTotalAds: 10\n}\n\nexport function useTVAdNavigator(config: TVAdUnlockNavigatorConfig) {\n const router = useESRouter()\n const storage = useESLocalStorage()\n const keys = createStorageKeys(config.packageName)\n const adStorage = useTVAdUnlockStorage(storage, keys, config.initialCredits ?? DEFAULT_RULES.initialCredits)\n\n const rules: Required<TVAdUnlockRuleConfig> = {\n initialCredits: config.initialCredits ?? DEFAULT_RULES.initialCredits,\n creditsPerAd: config.creditsPerAd ?? DEFAULT_RULES.creditsPerAd,\n dailyUnlockEnabled: config.dailyUnlockEnabled ?? DEFAULT_RULES.dailyUnlockEnabled,\n permanentUnlockAfterTotalAds: config.permanentUnlockAfterTotalAds ?? DEFAULT_RULES.permanentUnlockAfterTotalAds\n }\n\n async function consume(amount: number): Promise<{ success: boolean; consumed: number }> {\n const consumed = await adStorage.consumeCredits(amount)\n return { success: consumed > 0, consumed }\n }\n\n async function consumeAll(): Promise<number> {\n return adStorage.consumeAllCredits()\n }\n\n async function consumeAndNavigate(params?: {\n onUnlockSuccess?: () => void\n }): Promise<boolean> {\n await adStorage.checkDailyReset()\n\n // 规则①:永久解锁 → 放行\n if (rules.permanentUnlockAfterTotalAds > 0) {\n const permanent = await adStorage.isPermanentlyUnlocked()\n if (permanent) return false\n }\n\n // 规则②:今日已解锁 → 放行\n if (rules.dailyUnlockEnabled) {\n const today = await adStorage.isTodayUnlocked()\n if (today) return false\n }\n\n // 规则③:信用点 > 0 → 扣 1 分,放行\n const credits = await adStorage.getCredits()\n if (credits > 0) {\n await adStorage.consumeCredits(1)\n return false\n }\n\n // 规则④:兜底 → 弹广告\n router.push({\n name: 'ad',\n params: {\n creditsPerAd: String(rules.creditsPerAd),\n permanentUnlockAfterTotalAds: String(rules.permanentUnlockAfterTotalAds)\n }\n })\n return true\n }\n\n async function getCredits(): Promise<number> {\n return adStorage.getCredits()\n }\n\n async function isPermanentlyUnlocked(): Promise<boolean> {\n if (rules.permanentUnlockAfterTotalAds <= 0) return false\n return adStorage.isPermanentlyUnlocked()\n }\n\n async function getTodayAdCount(): Promise<number> {\n return adStorage.getTodayAdCount()\n }\n\n async function addCredits(amount: number): Promise<void> {\n return adStorage.addCredits(amount)\n }\n\n return {\n consume,\n consumeAll,\n consumeAndNavigate,\n getCredits,\n isPermanentlyUnlocked,\n getTodayAdCount,\n addCredits\n }\n}","<template>\n <div class=\"ad-container\">\n <div class=\"content\">\n <div class=\"content-bg\" />\n <span class=\"title\">{{ pageConfig.title }}</span>\n <span class=\"sub-title\">{{ pageConfig.subTitle }}</span>\n <div class=\"qrcode-container\">\n <qt-qr-code\n v-if=\"adQrCode && !isInvalid && qrCodeState !== 1\"\n class=\"qrcode\"\n :content=\"adQrCode\"\n />\n <img\n v-if=\"isInvalid\"\n class=\"invalid-code\"\n :src=\"pageConfig.invalidCodeImage\"\n />\n <img\n v-if=\"qrCodeState === 1\"\n class=\"invalid-code\"\n :src=\"pageConfig.scannedCodeImage\"\n />\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, inject, computed } from 'vue'\nimport { ESKeyCode, useESRuntime, useESToast, useESLocalStorage } from '@extscreen/es3-core'\nimport { useESRouter } from '@extscreen/es3-router'\nimport { TV_AD_UNLOCK_KEY } from './plugin'\nimport { createStorageKeys, useTVAdUnlock, useTVAdUnlockStorage } from './useTVAdUnlock'\nimport type { TVAdUnlockPluginProvided, TVAdUnlockParams } from './types'\n\nconst pluginContext = inject(TV_AD_UNLOCK_KEY) as TVAdUnlockPluginProvided\nconst { requestManager, pageConfig: rawPageConfig, trackEvent } = pluginContext\n\nconst toast = useESToast()\nconst storage = useESLocalStorage()\nconst router = useESRouter()\nconst runtime = useESRuntime()\nconst dnum = runtime.getRuntimeDeviceId()\n\nconst packageName = runtime.getESAppName?.() ?? 'unknown'\nconst keys = createStorageKeys(packageName)\nconst adStorage = useTVAdUnlockStorage(storage, keys)\n\nconst routeOverrides = ref<Partial<typeof rawPageConfig>>({})\n\nconst routeRuleParams = ref({\n creditsPerAd: 5,\n permanentUnlockAfterTotalAds: 10\n})\n\nconst pageConfig = computed(() => ({\n ...rawPageConfig,\n ...routeOverrides.value\n}))\n\nconst payParams = ref<TVAdUnlockParams>({\n assetId: '',\n assetName: '',\n fromId: '',\n fromName: ''\n})\n\nasync function handleUnlockSuccess() {\n await adStorage.setTodayUnlocked()\n await adStorage.addCredits(routeRuleParams.value.creditsPerAd)\n const totalAds = await adStorage.incrementTotalAdsWatched()\n await adStorage.incrementTodayAdCount()\n\n if (totalAds >= routeRuleParams.value.permanentUnlockAfterTotalAds) {\n await adStorage.setPermanentUnlocked()\n }\n\n trackEvent?.({ type: 'page', name: 'unlock_success' })\n toast.showToast('解锁成功!')\n router.back()\n}\n\nconst {\n adQrCode,\n isInvalid,\n qrCodeState,\n isLoading,\n isShowConfirmToast,\n getAdQrCode,\n stopPollTvADStatusTimer,\n stopInvalidTimer,\n reset\n} = useTVAdUnlock(\n {\n packageName,\n superRequestBaseUrl: '',\n invalidTimeout: 300000,\n pollInterval: 1000\n },\n keys,\n requestManager,\n {\n onUnlockSuccess: () => handleUnlockSuccess(),\n onUnlockFailed: (error) => {\n trackEvent?.({ type: 'click', name: 'unlock_failed' })\n },\n onQrCodeInvalid: () => {\n trackEvent?.({ type: 'click', name: 'qr_code_invalid' })\n },\n onQrCodeScanned: () => {\n trackEvent?.({ type: 'click', name: 'qr_code_scanned' })\n }\n }\n)\n\nfunction onKeyDown(event: any) {\n switch (event.keyCode) {\n case ESKeyCode.ES_KEYCODE_DPAD_CENTER:\n case ESKeyCode.ES_KEYCODE_ENTER:\n if (isInvalid.value || qrCodeState.value === 1) {\n const cfg = pageConfig.value\n getAdQrCode(dnum, cfg.scanTitle, cfg.scanContent, cfg.scanToast)\n }\n break\n }\n}\n\nfunction onESCreate(params: TVAdUnlockParams & Record<string, string>) {\n payParams.value = {\n assetId: params.assetId || '',\n assetName: params.assetName || '',\n fromId: params.fromId || '',\n fromName: params.fromName || ''\n }\n\n if (params.creditsPerAd) {\n routeRuleParams.value.creditsPerAd = parseInt(params.creditsPerAd) || 5\n }\n if (params.permanentUnlockAfterTotalAds) {\n routeRuleParams.value.permanentUnlockAfterTotalAds = parseInt(params.permanentUnlockAfterTotalAds) || 10\n }\n\n const extra: Partial<typeof rawPageConfig> = {}\n if (params.title) extra.title = params.title\n if (params.subTitle) extra.subTitle = params.subTitle\n if (params.scanTitle) extra.scanTitle = params.scanTitle\n if (params.scanContent) extra.scanContent = params.scanContent\n if (params.scanToast) extra.scanToast = params.scanToast\n if (params.invalidCodeImage) extra.invalidCodeImage = params.invalidCodeImage\n if (params.scannedCodeImage) extra.scannedCodeImage = params.scannedCodeImage\n routeOverrides.value = extra\n\n trackEvent?.({\n type: 'page',\n name: 'ad_page_show',\n assetId: payParams.value.assetId,\n assetName: payParams.value.assetName,\n fromId: payParams.value.fromId,\n fromName: payParams.value.fromName\n })\n\n const cfg = pageConfig.value\n getAdQrCode(dnum, cfg.scanTitle, cfg.scanContent, cfg.scanToast)\n}\n\nfunction onBackPressed() {\n if (!isShowConfirmToast.value && qrCodeState.value === 1) {\n toast.showToast('广告播放中,请不要关闭弹窗')\n isShowConfirmToast.value = true\n return true\n } else {\n stopPollTvADStatusTimer()\n stopInvalidTimer()\n router.back()\n }\n}\n\nfunction onESDestroy() {\n stopPollTvADStatusTimer()\n stopInvalidTimer()\n}\n\ndefineExpose({\n onESCreate,\n onKeyDown,\n onBackPressed,\n onESDestroy\n})\n</script>\n\n<style scoped>\n.ad-container {\n width: 1920px;\n height: 1080px;\n background-color: rgba(0, 0, 0, 0.7);\n display: flex;\n justify-content: center;\n align-items: center;\n}\n\n.content {\n width: 892px;\n height: 646px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n}\n\n.content-bg {\n position: absolute;\n width: 892px;\n height: 646px;\n background-color: #FBE6C4;\n border-radius: 30px;\n border-width: 1px;\n border-color: #979797;\n}\n\n.title {\n font-weight: 500;\n font-size: 46px;\n color: #000000;\n}\n\n.sub-title {\n margin-top: 32px;\n font-weight: 400;\n font-size: 30px;\n color: rgba(0, 0, 0, 0.65);\n}\n\n.qrcode-container {\n margin-top: 32px;\n width: 300px;\n height: 300px;\n border-radius: 30px;\n background-color: #FFFFFF;\n display: flex;\n justify-content: center;\n align-items: center;\n}\n\n.qrcode {\n position: absolute;\n width: 260px;\n height: 260px;\n border-radius: 30px;\n background-color: #FFFFFF;\n}\n\n.invalid-code {\n position: absolute;\n width: 300px;\n height: 300px;\n border-radius: 30px;\n background-color: transparent;\n}\n</style>","import { type App, type InjectionKey } from 'vue'\nimport { ESRouteType } from '@extscreen/es3-router'\nimport type {\n TVAdUnlockPluginOptions,\n TVAdUnlockPluginProvided,\n TVAdUnlockPageConfig\n} from './types'\nimport TVAdUnlockView from './TVAdUnlockView.vue'\n\nexport const TV_AD_UNLOCK_KEY: InjectionKey<TVAdUnlockPluginProvided> = Symbol('tvAdUnlock')\n\nconst DEFAULT_PAGE_CONFIG: Required<TVAdUnlockPageConfig> = {\n title: '观看30秒广告 当日解锁',\n subTitle: '手机打开【微信】扫码',\n scanTitle: '观看奖励',\n scanContent: '观看广告后可获得奖励',\n scanToast: '奖励已获得,请前往电视端观看',\n invalidCodeImage: '',\n scannedCodeImage: ''\n}\n\nexport const tvAdUnlockPlugin = {\n install(app: App, options: TVAdUnlockPluginOptions) {\n const pageConfig: Required<TVAdUnlockPageConfig> = {\n ...DEFAULT_PAGE_CONFIG,\n ...options.pageConfig\n }\n\n app.provide(TV_AD_UNLOCK_KEY, {\n requestManager: options.requestManager,\n trackEvent: options.trackEvent,\n pageConfig\n })\n }\n}\n\nexport function createTVAdRoute() {\n return {\n path: '/ad',\n name: 'ad',\n component: TVAdUnlockView,\n type: ESRouteType.ES_ROUTE_TYPE_DIALOG\n }\n}"],"names":["_openBlock","_createElementBlock","_createElementVNode","_toDisplayString","_unref","_createBlock","TVAdUnlockView"],"mappings":"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"}
|