@@ -38,10 +38,18 @@ export interface PromoNotificationData {
38
38
}
39
39
}
40
40
41
+ const CHECK_TIMEOUT_MS = 10 * 60 * 1000 ; // 10 minutes
42
+
43
+ const MIN_PERIOD_MS = 30 * 60 * 1000 ; // 30 minutes
44
+
45
+ const NOTIFICATION_DELAY_MS = 30 * 1000 ; // clear notification in 30 seconds
46
+
41
47
const VIEWED_NOTIFICATIONS = 'viewed-notifications' ;
42
48
const LAST_NOTIFICATION_TIME = 'viewed-notification-time' ;
43
49
44
- const PROMO_LINK = `https://${ FORWARDER_DOMAIN } /forward.html?action=back_to_school_23_vpn&from=popup&app=vpn_extension` ;
50
+ const TDS_PROMO_ACTION = 'halloween_23_vpn' ;
51
+
52
+ const PROMO_LINK = `https://${ FORWARDER_DOMAIN } /forward.html?action=${ TDS_PROMO_ACTION } &from=popup&app=vpn_extension` ;
45
53
46
54
const normalizeLanguage = ( locale : string ) : string | null => {
47
55
if ( ! locale ) {
@@ -51,185 +59,199 @@ const normalizeLanguage = (locale: string): string | null => {
51
59
return locale . toLowerCase ( ) . replace ( '-' , '_' ) ;
52
60
} ;
53
61
54
- const backToSchoolPromo23Notification = {
55
- id : 'backToSchool23' ,
62
+ const HALLOWEEN_23_ID = 'halloween23' ;
63
+
64
+ const halloween23PromoNotification = {
65
+ id : HALLOWEEN_23_ID ,
56
66
locales : {
57
67
en : {
58
- title : 'Back to school: Quiz and prize ' ,
59
- btn : 'Test yourself ' ,
68
+ title : 'Fact or fiction? ' ,
69
+ btn : 'Investigate ' ,
60
70
} ,
61
71
ru : {
62
- title : 'Снова в школу: квиз и приз ' ,
63
- btn : 'Пройти ' ,
72
+ title : 'Верю не верю ' ,
73
+ btn : 'Давайте проверим ' ,
64
74
} ,
65
75
es : {
66
- title : 'Vuelta al cole: quiz y recompensa ' ,
67
- btn : 'Hacer el quiz ' ,
76
+ title : '¿Realidad o ficción? ' ,
77
+ btn : '¡Adivinar! ' ,
68
78
} ,
69
79
de : {
70
- title : 'Back to School: Quiz und Preis ' ,
71
- btn : 'Quiz los ' ,
80
+ title : 'Falsch oder wahr? ' ,
81
+ btn : 'Kommen Sie klar ' ,
72
82
} ,
73
83
fr : {
74
- title : 'La rentrée avec AdGuard : Quiz et cadeaux ' ,
75
- btn : 'Passez le Quiz ' ,
84
+ title : 'Fait ou fiction ? ' ,
85
+ btn : 'Examinons ' ,
76
86
} ,
77
87
it : {
78
- title : 'A Scuola con AdGuard: un quiz e un regalo ' ,
79
- btn : 'Supera il Quiz ' ,
88
+ title : 'Fatto o finzione? ' ,
89
+ btn : 'Esaminiamo ' ,
80
90
} ,
81
91
ko : {
82
- title : '백 투 스쿨: 퀴즈 및 할인 ' ,
83
- btn : '퀴즈게임 시작' ,
92
+ title : '사실일까, 괴담일까? ' ,
93
+ btn : '퀴즈 시작' ,
84
94
} ,
85
95
ja : {
86
- title : 'Back to School セールとクイズ ' ,
87
- btn : 'クイズに挑戦! ' ,
96
+ title : '事実か怪談か? ' ,
97
+ btn : 'クイズに挑戦する ' ,
88
98
} ,
89
99
zh_cn : {
90
- title : '开学特惠:小测验大惊喜 ' ,
91
- btn : '测试自己 ' ,
100
+ title : '万圣节答题小游戏 ' ,
101
+ btn : '开始玩儿 ' ,
92
102
} ,
93
103
zh_tw : {
94
- title : '開學特惠:小測驗大驚喜 ' ,
95
- btn : '測試自己 ' ,
104
+ title : '萬聖節答題小遊戲 ' ,
105
+ btn : '開始玩 ' ,
96
106
} ,
97
107
uk : {
98
- title : 'Знову до школи: іспит і приз ' ,
99
- btn : 'Скласти ' ,
108
+ title : 'Факт чи вигадка? ' ,
109
+ btn : 'Вгадай! ' ,
100
110
} ,
101
111
pt_br : {
102
- title : 'Volta às aulas: quiz e prêmio ' ,
103
- btn : 'Fazer o quiz ' ,
112
+ title : 'Realidade ou ficção? ' ,
113
+ btn : 'Adivinhar ' ,
104
114
} ,
105
115
pt_pt : {
106
- title : 'Volta às aulas: quiz e prémio ' ,
107
- btn : 'Fazer o quiz ' ,
116
+ title : 'Realidade ou ficção? ' ,
117
+ btn : 'Adivinhar ' ,
108
118
} ,
109
119
ar : {
110
- title : 'العودة إلى المدرسة: مسابقة وجائزة ' ,
111
- btn : 'حل الاختبار ' ,
120
+ title : 'حقيقة أم خيال؟ ' ,
121
+ btn : '!يخمن ' ,
112
122
} ,
113
123
be : {
114
- title : 'Зноў у школу: віктарына і прызы ' ,
115
- btn : 'Прайсці ' ,
124
+ title : 'Факт ці выдумка? ' ,
125
+ btn : 'Адгадайце! ' ,
116
126
} ,
117
127
bg : {
118
- title : 'Отново в училище: тест и награда ' ,
119
- btn : 'Преминете ' ,
128
+ title : 'Факт или измислица? ' ,
129
+ btn : 'Познайте! ' ,
120
130
} ,
121
131
ca : {
122
- title : "Tornada a l'escola: qüestionari i premi" ,
123
- btn : 'Passar ' ,
132
+ title : 'Realitat o ficció?' ,
133
+ btn : 'Endevina! ' ,
124
134
} ,
125
135
cs : {
126
- title : 'Zpátky do školy: kvíz a cena ' ,
127
- btn : 'Projít ' ,
136
+ title : 'Pravda nebo fikce? ' ,
137
+ btn : 'Tipni si! ' ,
128
138
} ,
129
139
da : {
130
- title : 'Tilbage til skolen: quiz og præmie ' ,
131
- btn : 'Test deg selv ' ,
140
+ title : 'Fakta eller fiktion? ' ,
141
+ btn : 'Gætte! ' ,
132
142
} ,
133
143
el : {
134
- title : 'Επιστροφή στο σχολείο ' ,
135
- btn : 'Περάστε ' ,
144
+ title : 'Σωστό ή λάθος? ' ,
145
+ btn : 'Εικασία! ' ,
136
146
} ,
137
147
es_419 : {
138
- title : 'Vuelta al cole: quiz y recompensa ' ,
139
- btn : 'Hacer el quiz ' ,
148
+ title : '¿Realidad o ficción? ' ,
149
+ btn : '¡Adivinar! ' ,
140
150
} ,
141
151
fa : {
142
- title : 'بازگشت به مدرسه: مسابقه و جایزه ' ,
143
- btn : 'امتحان را پاس کنید ' ,
152
+ title : 'واقعیت یا تخیل؟ ' ,
153
+ btn : '!حدس بزن ' ,
144
154
} ,
145
155
fi : {
146
- title : 'Takaisin kouluun: tietokilpailu ja palkinto ' ,
147
- btn : 'Läpäise ' ,
156
+ title : 'Totta vai tarua? ' ,
157
+ btn : 'Arvaus! ' ,
148
158
} ,
149
159
he : {
150
- title : 'חזרה לבית הספר: חידון ופרס ' ,
151
- btn : 'לעבור ' ,
160
+ title : '?עובדה או בדיה ' ,
161
+ btn : '!לְנַחֵשׁ ' ,
152
162
} ,
153
163
hr : {
154
- title : 'Povratak u školu: kviz i nagrada ' ,
155
- btn : 'Provjerite se ' ,
164
+ title : 'Činjenica ili fikcija? ' ,
165
+ btn : 'Pogodite! ' ,
156
166
} ,
157
167
hu : {
158
- title : 'Vissza az iskolába: egy kvíz és egy díj ' ,
159
- btn : 'Teszteld magad ' ,
168
+ title : 'Tény vagy fikció? ' ,
169
+ btn : 'Találd ki! ' ,
160
170
} ,
161
171
hy : {
162
- title : 'Վերադառնալ դպրոց ' ,
163
- btn : 'Ստուգեք ինքներդ ' ,
172
+ title : 'Փաստ, թե հորինված. ' ,
173
+ btn : 'Գուշակիր ' ,
164
174
} ,
165
175
id : {
166
- title : 'Kembali ke Sekolah: kuis dan Hadiah ' ,
167
- btn : 'Uji dirimu ' ,
176
+ title : 'Fakta atau Fiksi? ' ,
177
+ btn : 'Tebakan! ' ,
168
178
} ,
169
179
lt : {
170
- title : 'Atgal į mokyklą: viktorina ir prizas ' ,
171
- btn : 'Išbandyk save ' ,
180
+ title : 'Faktas ar fikcija? ' ,
181
+ btn : 'Atspėk! ' ,
172
182
} ,
173
183
ms : {
174
- title : 'Kembali ke Sekolah: kuiz dan Hadiah ' ,
175
- btn : 'Uji diri sendiri ' ,
184
+ title : 'Fakta atau fiksyen? ' ,
185
+ btn : 'Teka! ' ,
176
186
} ,
177
187
nb : {
178
- title : 'Tilbake til skolen: quiz og premie ' ,
179
- btn : 'Test deg selv ' ,
188
+ title : 'Fakta eller fiksjon? ' ,
189
+ btn : 'Gjett! ' ,
180
190
} ,
181
191
nl : {
182
- title : 'Terug naar school: quiz en prijs ' ,
183
- btn : 'Test jezelf ' ,
192
+ title : 'Feit of Fictie? ' ,
193
+ btn : 'Gok! ' ,
184
194
} ,
185
195
pl : {
186
- title : 'Powrót do szkoły: quiz i nagroda ' ,
187
- btn : 'Sprawdź się ' ,
196
+ title : 'Fakt czy fikcja? ' ,
197
+ btn : 'Zgadywać! ' ,
188
198
} ,
189
199
ro : {
190
- title : 'Înapoi la școală: test și premiu ' ,
191
- btn : 'Testați-vă ' ,
200
+ title : 'Realitate sau fictiune? ' ,
201
+ btn : 'Ghici! ' ,
192
202
} ,
193
203
sk : {
194
- title : 'Späť do školy: kvíz a cena ' ,
195
- btn : 'Otestujte sa ' ,
204
+ title : 'Skutočnosť alebo fikcia? ' ,
205
+ btn : 'Hádaj! ' ,
196
206
} ,
197
207
sl : {
198
- title : 'Nazaj v šolo: kviz in nagrada ' ,
199
- btn : 'Preizkusite se ' ,
208
+ title : 'Dejstvo ali fikcija? ' ,
209
+ btn : 'Ugani! ' ,
200
210
} ,
201
211
'sr-Latn' : {
202
- title : 'Povratak u školu: kviz i nagrada ' ,
203
- btn : 'Proverite sami ' ,
212
+ title : 'Tačno ili netačno? ' ,
213
+ btn : 'Izgleda! ' ,
204
214
} ,
205
215
sv : {
206
- title : 'Tillbaka till skolan: quiz och pris ' ,
207
- btn : 'Testa dig själv ' ,
216
+ title : 'Fakta eller påhitt? ' ,
217
+ btn : 'Gissa! ' ,
208
218
} ,
209
219
tr : {
210
- title : 'Okula Dönüş: Sınav ve Ödül ' ,
211
- btn : 'Kendinizi test edin ' ,
220
+ title : 'Gerçek mi kurgu mu? ' ,
221
+ btn : 'Tahmin etmek! ' ,
212
222
} ,
213
223
vi : {
214
- title : 'Back to School: câu đố và giải thưởng' ,
215
- btn : 'Tự kiểm tra' ,
224
+ title : 'Sự thật hay hư cấu?' ,
225
+ btn : 'Đoán!' ,
226
+ } ,
227
+ hi : {
228
+ title : 'तथ्य या कल्पना?' ,
229
+ btn : 'अनुमान लगाना!' ,
230
+ } ,
231
+ et : {
232
+ title : 'Fakt või väljamõeldis?' ,
233
+ btn : 'Arva ära!' ,
234
+ } ,
235
+ th : {
236
+ title : 'เรื่องจริงหรือนิยาย?' ,
237
+ btn : 'เดา!' ,
216
238
} ,
217
239
} ,
218
240
// will be selected for locale, see usage of getNotificationText
219
241
text : null ,
220
242
url : PROMO_LINK ,
221
- from : '28 August 2023 12:00:00' ,
222
- to : '3 September 2023 23:59:00' ,
243
+ from : '25 October 2023 12:00:00' ,
244
+ to : '1 November 2023 23:59:00' ,
223
245
type : 'animated' ,
224
246
get icons ( ) {
225
- return lazyGet ( backToSchoolPromo23Notification , 'icons' , ( ) => ( {
247
+ return lazyGet ( halloween23PromoNotification , 'icons' , ( ) => ( {
226
248
ENABLED : {
227
- 19 : getUrl ( 'assets/images/icons/bts2023 -on-19.png' ) ,
228
- 38 : getUrl ( 'assets/images/icons/bts2023 -on-38.png' ) ,
249
+ 19 : getUrl ( 'assets/images/icons/halloween23 -on-19.png' ) ,
250
+ 38 : getUrl ( 'assets/images/icons/halloween23 -on-38.png' ) ,
229
251
} ,
230
252
DISABLED : {
231
- 19 : getUrl ( 'assets/images/icons/bts2023 -off-19.png' ) ,
232
- 38 : getUrl ( 'assets/images/icons/bts2023 -off-38.png' ) ,
253
+ 19 : getUrl ( 'assets/images/icons/halloween23 -off-19.png' ) ,
254
+ 38 : getUrl ( 'assets/images/icons/halloween23 -off-38.png' ) ,
233
255
} ,
234
256
} ) ) ;
235
257
} ,
@@ -252,7 +274,7 @@ const backToSchoolPromo23Notification = {
252
274
*/
253
275
254
276
const notifications : { [ key : string ] : PromoNotificationData } = {
255
- backToSchoolPromo23 : backToSchoolPromo23Notification ,
277
+ [ HALLOWEEN_23_ID ] : halloween23PromoNotification ,
256
278
} ;
257
279
258
280
/**
@@ -315,9 +337,6 @@ initNotifications();
315
337
316
338
let currentNotification : PromoNotificationData | null ;
317
339
let notificationCheckTime : number ;
318
- const checkTimeoutMs = 10 * 60 * 1000 ; // 10 minutes
319
- const minPeriod = 30 * 60 * 1000 ; // 30 minutes
320
- const NOTIFICATION_DELAY = 30 * 1000 ; // clear notification in 30 seconds
321
340
let timeoutId : number ;
322
341
323
342
/**
@@ -329,7 +348,9 @@ const setNotificationViewed = async (withDelay: boolean): Promise<void> => {
329
348
clearTimeout ( timeoutId ) ;
330
349
timeoutId = setTimeout ( ( ) => {
331
350
setNotificationViewed ( false ) ;
332
- } , NOTIFICATION_DELAY ) as any ; // TODO setup tsconfig to fix types
351
+ } , NOTIFICATION_DELAY_MS ) as any ; // TODO setup tsconfig to fix types
352
+ // do not continue if `withDelay` is true, otherwise it may set a notification as viewed
353
+ return ;
333
354
}
334
355
335
356
if ( currentNotification ) {
@@ -357,14 +378,14 @@ const getCurrentNotification = async (): Promise<PromoNotificationData | null> =
357
378
const currentTime = new Date ( ) . getTime ( ) ;
358
379
359
380
const timeSinceLastNotification = currentTime - ( await getLastNotificationTime ( ) ) ;
360
- if ( timeSinceLastNotification < minPeriod ) {
381
+ if ( timeSinceLastNotification < MIN_PERIOD_MS ) {
361
382
// Just a check to not show the notification too often
362
383
return null ;
363
384
}
364
385
365
386
// Check not often than once in 10 minutes
366
387
const timeSinceLastCheck = currentTime - notificationCheckTime ;
367
- if ( notificationCheckTime > 0 && timeSinceLastCheck <= checkTimeoutMs ) {
388
+ if ( notificationCheckTime > 0 && timeSinceLastCheck <= CHECK_TIMEOUT_MS ) {
368
389
return currentNotification ;
369
390
}
370
391
0 commit comments