1
1
import { onMessage } from 'webext-bridge'
2
- import { alarms , cookies , i18n , notifications , runtime , storage } from 'webextension-polyfill'
2
+ import { action , alarms , cookies , i18n , notifications , runtime , storage } from 'webextension-polyfill'
3
3
import type { Cookies , Notifications } from 'webextension-polyfill'
4
4
import type { IAlertSetting , IAlertStatus , IRoleDataItem , IUserData , IUserDataItem } from '~/types'
5
5
import { getRoleDataByCookie , getRoleInfoByCookie } from '~/utils'
@@ -163,6 +163,9 @@ const writeDataToStorage = async function <T>(key: string, data: T) {
163
163
await storage . local . set ( { [ key ] : data } )
164
164
}
165
165
166
+ // selected uid
167
+ let selectedUid = ''
168
+
166
169
const targetPages = [
167
170
'https://api-os-takumi.mihoyo.com/binding/api/getUserGameRolesByCookie?game_biz=hk4e_global&asource=paimon' ,
168
171
'https://api-takumi.mihoyo.com/binding/api/getUserGameRolesByCookie?game_biz=hk4e_cn&asource=paimon' ,
@@ -230,6 +233,10 @@ const readDataFromStorage = async function <T>(key: string, defaultVal: T): Prom
230
233
return defaultVal
231
234
}
232
235
236
+ const getSelectedUid = async ( ) => {
237
+ return await readDataFromStorage < string > ( 'selectedRole' , '' )
238
+ }
239
+
233
240
// 获取国服cookie
234
241
const getMiHoYoCookie = async function ( ) {
235
242
let cookieString = ''
@@ -372,36 +379,61 @@ const doAlertCheck = async function (roleInfo: IUserDataItem) {
372
379
}
373
380
}
374
381
375
- const refreshData = async function ( ) {
382
+ const refreshData = async function ( uiOnly = false ) {
376
383
// 取出原始 roleList
377
384
const originRoleList = await readDataFromStorage < IUserDataItem [ ] > ( 'roleList' , [ ] )
378
385
// 取出启用的 role
379
386
const enabledRoleList = originRoleList . filter ( ( item ) => {
380
387
return item . isEnabled
381
388
} )
382
389
390
+ // 如果当前还没有 selectedUid 则获取一个
391
+ let _selectedUid = selectedUid || await getSelectedUid ( )
392
+
393
+ if ( enabledRoleList . length > 0 ) {
394
+ // 查看选中uid是否已经启用
395
+ if ( ! enabledRoleList . find ( item => item . uid === _selectedUid ) ) {
396
+ // 未启用则选中第一个
397
+ _selectedUid = enabledRoleList [ 0 ] ?. uid
398
+ }
399
+ }
400
+
383
401
const setCookie = async ( cookie : string ) => {
384
402
currentCookie = cookie
385
403
await updateRules ( )
386
404
}
387
405
406
+ let hasUpdatedBadge = false
388
407
// 遍历启用的 role
389
408
for ( const role of enabledRoleList ) {
390
- const data = await getRoleDataByCookie ( role . serverType === 'os' , role . cookie , role . uid , role . serverRegion , setCookie )
409
+ const data = uiOnly ? role . data : await getRoleDataByCookie ( role . serverType === 'os' , role . cookie , role . uid , role . serverRegion , setCookie )
410
+
391
411
if ( data ) {
392
412
// 更新 roleList
393
- const index = originRoleList . findIndex ( ( item ) => {
413
+ const roleIndex = originRoleList . findIndex ( ( item ) => {
394
414
return item . uid === role . uid
395
415
} )
396
416
397
- originRoleList . splice ( index , 1 , {
417
+ originRoleList . splice ( roleIndex , 1 , {
398
418
...role ,
399
419
data,
400
420
isError : false ,
401
421
errorMessage : '' ,
402
422
updateTimestamp : Date . now ( ) ,
403
423
} )
404
424
doAlertCheck ( role )
425
+
426
+ if ( ! hasUpdatedBadge ) {
427
+ let shouldUpdateBadge = false
428
+ if ( _selectedUid && _selectedUid === role . uid )
429
+ shouldUpdateBadge = true // 更新 _selectedUid 当前的 resin 数据到 badge
430
+
431
+ if ( shouldUpdateBadge && role ?. data ?. current_resin ) {
432
+ action . setBadgeText ( { text : `${ role . data . current_resin } ` } )
433
+ action . setBadgeBackgroundColor ( { color : '#6F9FDF' } )
434
+ hasUpdatedBadge = true
435
+ }
436
+ }
405
437
}
406
438
else {
407
439
// 获取失败,写入错误信息
@@ -457,7 +489,7 @@ onMessage('get_role_list', async () => {
457
489
} )
458
490
459
491
onMessage ( 'get_selected_role' , async ( ) => {
460
- return await readDataFromStorage < string > ( 'selectedRole' , '' )
492
+ return await getSelectedUid ( )
461
493
} )
462
494
463
495
onMessage ( 'refresh_request' , async ( ) => {
@@ -466,7 +498,9 @@ onMessage('refresh_request', async () => {
466
498
} )
467
499
468
500
onMessage < { uid : string } , 'set_selected_role' > ( 'set_selected_role' , async ( { data : { uid } } ) => {
501
+ selectedUid = uid // update cache
469
502
await writeDataToStorage ( 'selectedRole' , uid )
503
+ refreshData ( )
470
504
} )
471
505
472
506
onMessage < { uid : string ; status : boolean } , 'set_role_status' > ( 'set_role_status' , async ( { data : { uid, status } } ) => {
@@ -479,6 +513,8 @@ onMessage<{ uid: string; status: boolean }, 'set_role_status'>('set_role_status'
479
513
clearNotifications ( originRoleList [ index ] . alertStatus )
480
514
originRoleList [ index ] . alertStatus = defaultAlertStatus
481
515
await writeDataToStorage ( 'roleList' , originRoleList )
516
+ // 刷新一次数据(仅刷新ui,例如badge/notification)
517
+ refreshData ( true )
482
518
} )
483
519
484
520
onMessage < { uid : string ; status : boolean } , 'set_role_alert_status' > ( 'set_role_alert_status' , async ( { data : { uid, status } } ) => {
0 commit comments