@jolibox/implement 1.1.33 → 1.1.35

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.
@@ -1,9 +1,9 @@
1
1
  Invoking: npm run clean && npm run build:esm && tsc
2
2
 
3
- > @jolibox/implement@1.1.33 clean
3
+ > @jolibox/implement@1.1.35 clean
4
4
  > rimraf ./dist
5
5
 
6
6
 
7
- > @jolibox/implement@1.1.33 build:esm
7
+ > @jolibox/implement@1.1.35 build:esm
8
8
  > BUILD_VERSION=$(node -p "require('./package.json').version") node esbuild.config.js --format=esm
9
9
 
package/package.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "@jolibox/implement",
3
3
  "description": "This project is Jolibox JS-SDk implement for Native && H5",
4
- "version": "1.1.33",
4
+ "version": "1.1.35",
5
5
  "main": "dist/index.js",
6
6
  "typings": "dist/index.d.ts",
7
7
  "license": "MIT",
8
8
  "dependencies": {
9
- "@jolibox/common": "1.1.33",
10
- "@jolibox/types": "1.1.33",
11
- "@jolibox/native-bridge": "1.1.33",
12
- "@jolibox/ads": "1.1.33",
9
+ "@jolibox/common": "1.1.35",
10
+ "@jolibox/types": "1.1.35",
11
+ "@jolibox/native-bridge": "1.1.35",
12
+ "@jolibox/ads": "1.1.35",
13
13
  "localforage": "1.10.0",
14
14
  "@jolibox/ui": "1.0.0",
15
15
  "web-vitals": "4.2.4"
@@ -39,7 +39,9 @@ type MPType = 'game' | 'miniApp';
39
39
  export enum SDKEnvironment {
40
40
  jolibox = 'jolibox', // 默认
41
41
  dlightek = 'dlightek', // 传音
42
- funmax = 'funmax' // 小米
42
+ funmax = 'funmax', // 小米
43
+ huaweiQuick = 'huaweiQuick', // 华为快应用
44
+ gamedistribution = 'gamedistribution'
43
45
  }
44
46
 
45
47
  type Viewport = {
@@ -48,8 +50,7 @@ type Viewport = {
48
50
  };
49
51
 
50
52
  function hasMetaTag(name: string, content: string): boolean {
51
- const metaTag = document?.head.querySelector(`meta[name="${name}"][content="${content}"]`);
52
- return metaTag !== null;
53
+ return document?.head.querySelector(`meta[name="${name}"][content="${content}"]`) !== null;
53
54
  }
54
55
 
55
56
  const wrapContext = () => {
@@ -135,10 +136,15 @@ const wrapContext = () => {
135
136
  return env.deviceInfo.lang;
136
137
  },
137
138
  get sdkEnvironment(): SDKEnvironment {
138
- const hasDlightekMeta = hasMetaTag('dlightek', 'jolibox');
139
- if (hasDlightekMeta) {
139
+ if (hasMetaTag('dlightek', 'jolibox')) {
140
140
  return SDKEnvironment.dlightek;
141
141
  }
142
+ if (urlParams.get('huaweiQuick') === 'true') {
143
+ return SDKEnvironment.huaweiQuick;
144
+ }
145
+ if (hasMetaTag('gamedistribution', 'jolibox')) {
146
+ return SDKEnvironment.gamedistribution;
147
+ }
142
148
  return SDKEnvironment.jolibox;
143
149
  },
144
150
  get viewport(): Viewport {
package/src/h5/api/ads.ts CHANGED
@@ -18,47 +18,27 @@ import {
18
18
  } from '@jolibox/ads';
19
19
  import { context, SDKEnvironment } from '@/common/context';
20
20
  import '../rewards';
21
+ import DlightekAdsHandler from './platformAdsHandle/DlightekAdsHandler';
22
+ import HuaweiQuickAdsHandler from './platformAdsHandle/HuaweiQuickAdsHandler';
23
+ import GamedistributionAdsHandler from './platformAdsHandle/GamedistributionAdsHandler';
21
24
 
22
25
  declare global {
23
26
  interface Window {
24
- h5sdk: any;
27
+ // 传音sdk
28
+ h5sdk: JoliboxAdsForGame;
29
+ // 华为快应用
30
+ system: {
31
+ postMessage: (params: string) => void;
32
+ };
25
33
  }
26
34
  }
27
-
28
- // 统一的广告处理器接口
29
- interface IAdsHandler {
35
+ export interface IAdsHandler {
30
36
  init(config?: IAdsInitParams): void;
31
37
  adConfig(params: IAdConfigParams): void;
32
38
  adBreak(params: IAdBreakParams): Promise<void> | void;
33
39
  adUnit(params: IAdUnitParams): void;
34
- getAdsInstance(): JoliboxAdsForGame | any;
35
- }
36
-
37
- // 具体处理器实现
38
- class DlightekAdsHandler implements IAdsHandler {
39
- constructor(private ads: any) {}
40
-
41
- getAdsInstance(): any {
42
- return this.ads;
43
- }
44
-
45
- init(_config?: IAdsInitParams): void {
46
- // Dlightek 不需要初始化
47
- }
48
-
49
- adConfig(params: IAdConfigParams): void {
50
- this.ads.adConfig(params);
51
- }
52
-
53
- adBreak(params: IAdBreakParams): void {
54
- this.ads.adBreak(params);
55
- }
56
-
57
- adUnit(_params: IAdUnitParams): void {
58
- // Dlightek 不需要 adUnit
59
- }
40
+ getAdsInstance(): JoliboxAdsForGame;
60
41
  }
61
-
62
42
  class JoliboxAdsHandler implements IAdsHandler {
63
43
  constructor(private ads: JoliboxAdsForGame) {}
64
44
 
@@ -115,6 +95,14 @@ class H5AdsManager {
115
95
  this.cacheHandler = new DlightekAdsHandler(window.h5sdk);
116
96
  break;
117
97
  }
98
+ case SDKEnvironment.huaweiQuick: {
99
+ this.cacheHandler = HuaweiQuickAdsHandler.getInstance();
100
+ break;
101
+ }
102
+ case SDKEnvironment.gamedistribution: {
103
+ this.cacheHandler = GamedistributionAdsHandler.getInstance();
104
+ break;
105
+ }
118
106
  default: {
119
107
  const joliboxAds = new JoliboxAdsForGame(this.context);
120
108
  this.cacheHandler = new JoliboxAdsHandler(joliboxAds);
@@ -0,0 +1,26 @@
1
+ import { IAdConfigParams, IAdBreakParams, JoliboxAdsForGame } from '@jolibox/ads';
2
+ import { IAdsHandler } from '../ads';
3
+
4
+ export default class DlightekAdsHandler implements IAdsHandler {
5
+ constructor(private ads: JoliboxAdsForGame) {}
6
+
7
+ getAdsInstance(): JoliboxAdsForGame {
8
+ return this.ads;
9
+ }
10
+
11
+ init(): void {
12
+ // Dlightek 不需要初始化
13
+ }
14
+
15
+ adConfig(params: IAdConfigParams): void {
16
+ this.ads.adConfig(params);
17
+ }
18
+
19
+ adBreak(params: IAdBreakParams): void {
20
+ this.ads.adBreak(params);
21
+ }
22
+
23
+ adUnit(): void {
24
+ // Dlightek 不需要 adUnit
25
+ }
26
+ }
@@ -0,0 +1,123 @@
1
+ import {
2
+ IAdsInitParams,
3
+ IAdConfigParams,
4
+ IAdBreakParams,
5
+ IAdUnitParams,
6
+ JoliboxAdsForGame
7
+ } from '@jolibox/ads';
8
+ import { IAdsHandler } from '../ads';
9
+
10
+ declare global {
11
+ interface Window {
12
+ // gamedistribution
13
+ gdsdk: {
14
+ preloadAd: (type: string) => Promise<void>;
15
+ showAd: (type: string) => Promise<{ adType: string; args: { success: boolean } }>;
16
+ };
17
+ }
18
+ }
19
+
20
+ export default class GamedistributionAdsHandler implements IAdsHandler {
21
+ private static instance: GamedistributionAdsHandler;
22
+
23
+ private constructor() {
24
+ // 不需要初始化
25
+ }
26
+
27
+ public static getInstance(): GamedistributionAdsHandler {
28
+ if (!GamedistributionAdsHandler.instance) {
29
+ GamedistributionAdsHandler.instance = new GamedistributionAdsHandler();
30
+ }
31
+ return GamedistributionAdsHandler.instance;
32
+ }
33
+
34
+ getAdsInstance(): JoliboxAdsForGame {
35
+ return GamedistributionAdsHandler.getInstance() as unknown as JoliboxAdsForGame;
36
+ }
37
+
38
+ init(): void {
39
+ // 不需要初始化
40
+ }
41
+
42
+ adConfig(params: IAdConfigParams): void {
43
+ if (params.onReady) params.onReady();
44
+ }
45
+
46
+ adBreak(params: IAdBreakParams): Promise<void> | void {
47
+ try {
48
+ if (params.type === 'reward') {
49
+ window.gdsdk
50
+ .preloadAd('rewarded')
51
+ .then(() => {
52
+ params.beforeReward?.(() => {
53
+ if (params.beforeAd) params.beforeAd();
54
+
55
+ window.gdsdk
56
+ .showAd('rewarded')
57
+ .then((response) => {
58
+ if (response?.args?.success) {
59
+ params.adViewed?.();
60
+ } else {
61
+ params.adDismissed?.();
62
+ }
63
+
64
+ if (params.afterAd) params.afterAd();
65
+
66
+ params.adBreakDone?.({
67
+ breakType: params.type,
68
+ breakName: params.name,
69
+ breakFormat: 'reward',
70
+ breakStatus: response?.args?.success ? 'viewed' : 'dismissed'
71
+ });
72
+ })
73
+ .catch((error) => {
74
+ console.log('showReward error => ', error);
75
+
76
+ params.adBreakDone?.({
77
+ breakType: params.type,
78
+ breakName: params.name,
79
+ breakFormat: 'reward',
80
+ breakStatus: 'noAdPreloaded'
81
+ });
82
+ });
83
+ });
84
+ })
85
+ .catch((error) => {
86
+ console.log('preloadAd error => ', error);
87
+
88
+ params.adBreakDone?.({
89
+ breakType: params.type,
90
+ breakName: params.name,
91
+ breakFormat: 'reward',
92
+ breakStatus: 'noAdPreloaded'
93
+ });
94
+ });
95
+ } else {
96
+ if (params.type !== 'preroll' && params.beforeAd) params.beforeAd();
97
+ window.gdsdk.showAd('interstitial').then(() => {
98
+ if (params.type !== 'preroll' && params.afterAd) params.afterAd();
99
+
100
+ params.adBreakDone?.({
101
+ breakType: params.type,
102
+ breakName: params.type === 'preroll' ? undefined : params.name,
103
+ breakFormat: 'interstitial',
104
+ breakStatus: 'viewed'
105
+ });
106
+ });
107
+ }
108
+ } catch (e) {
109
+ console.log('adBreak error => ', e);
110
+
111
+ params.adBreakDone?.({
112
+ breakType: params.type,
113
+ breakName: params.type === 'preroll' ? undefined : params.name,
114
+ breakFormat: params.type === 'reward' ? 'reward' : 'interstitial',
115
+ breakStatus: 'error'
116
+ });
117
+ }
118
+ }
119
+
120
+ adUnit(): void {
121
+ // 不需要初始化
122
+ }
123
+ }
@@ -0,0 +1,268 @@
1
+ import {
2
+ IAdsInitParams,
3
+ IAdConfigParams,
4
+ IAdBreakParams,
5
+ IAdUnitParams,
6
+ JoliboxAdsForGame,
7
+ IPlacementInfo
8
+ } from '@jolibox/ads';
9
+ import { IAdsHandler } from '../ads';
10
+
11
+ enum HuaweiQuickAdsEventEnum {
12
+ INIT = 'huawei_quick_ads_init',
13
+ AD_CONFIG = 'huawei_quick_ads_ad_config',
14
+ AD_BREAK = 'huawei_quick_ads_ad_break',
15
+ AD_UNIT = 'huawei_quick_ads_ad_unit',
16
+
17
+ AD_OPERATION = 'huawei_quick_ads_ad_operation'
18
+ }
19
+
20
+ enum HuaweiQuickAdsOnMessageEventEnum {
21
+ INIT = 'huawei_quick_ads_on_message_init',
22
+ AD_CONFIG = 'huawei_quick_ads_on_message_ad_config',
23
+ AD_BREAK = 'huawei_quick_ads_on_message_ad_break',
24
+ AD_UNIT = 'huawei_quick_ads_on_message_ad_unit'
25
+ }
26
+
27
+ interface HuaweiQuickAdsEventMap {
28
+ [HuaweiQuickAdsEventEnum.INIT]: IAdsInitParams | undefined;
29
+ [HuaweiQuickAdsEventEnum.AD_CONFIG]: IAdConfigParams;
30
+ [HuaweiQuickAdsEventEnum.AD_BREAK]: IAdBreakParams;
31
+ [HuaweiQuickAdsEventEnum.AD_UNIT]: IAdUnitParams;
32
+ [HuaweiQuickAdsEventEnum.AD_OPERATION]: undefined;
33
+ }
34
+
35
+ // 通用事件接口
36
+ interface HuaweiQuickAdsEvent<T extends HuaweiQuickAdsEventEnum> {
37
+ type: T;
38
+ data?: HuaweiQuickAdsEventMap[T];
39
+ }
40
+
41
+ interface HuaweiQuickAdsCallbackMap {
42
+ onReady?: () => void;
43
+
44
+ adBreakDone?: (placementInfo: IPlacementInfo) => void;
45
+ beforeAd?: () => void;
46
+ afterAd?: () => void;
47
+ beforeReward?: (showAdFn: () => void) => void;
48
+ adDismissed?: () => void;
49
+ adViewed?: () => void;
50
+
51
+ breakType?: string;
52
+ breakName?: string;
53
+ breakFormat?: 'interstitial' | 'reward';
54
+ }
55
+
56
+ export default class HuaweiQuickAdsHandler implements IAdsHandler {
57
+ private static instance: HuaweiQuickAdsHandler;
58
+
59
+ private callbacksId: number;
60
+ private callbackMap: Map<number, HuaweiQuickAdsCallbackMap>;
61
+
62
+ private constructor() {
63
+ this.callbacksId = 0;
64
+ this.callbackMap = new Map();
65
+
66
+ this.initOnMessage();
67
+ }
68
+
69
+ public static getInstance(): HuaweiQuickAdsHandler {
70
+ if (!HuaweiQuickAdsHandler.instance) {
71
+ HuaweiQuickAdsHandler.instance = new HuaweiQuickAdsHandler();
72
+ }
73
+ return HuaweiQuickAdsHandler.instance;
74
+ }
75
+
76
+ private initOnMessage() {
77
+ window.addEventListener('message', (event) => {
78
+ // const { data, origin, source } = event;
79
+ console.log(`HuaweiQuickAdsHandler,event => ${event}`);
80
+ if (event.origin != window.location.origin) return;
81
+
82
+ console.log(`data => ${event.data}`);
83
+
84
+ if (event.data && event.data.type == null) {
85
+ const data = JSON.parse(event.data);
86
+
87
+ console.log(`HuaweiQuickAdsHandler type => ${data.type}`);
88
+ switch (data.type) {
89
+ case HuaweiQuickAdsOnMessageEventEnum.INIT:
90
+ console.log('HuaweiQuickAdsHandler window.addEventListener init', data);
91
+ break;
92
+ case HuaweiQuickAdsOnMessageEventEnum.AD_CONFIG:
93
+ {
94
+ const callbackId = data.callbackId;
95
+ if (callbackId) {
96
+ const callbacks = this.callbackMap.get(callbackId);
97
+ callbacks?.onReady?.();
98
+ }
99
+ console.log('HuaweiQuickAdsHandler window.addEventListener adConfig', data);
100
+ }
101
+ break;
102
+ case HuaweiQuickAdsOnMessageEventEnum.AD_BREAK:
103
+ {
104
+ const callbackId = data.callbackId;
105
+ if (callbackId) {
106
+ const callbacks = this.callbackMap.get(callbackId);
107
+ let adsRes:
108
+ | 'notReady'
109
+ | 'timeout'
110
+ | 'error'
111
+ | 'noAdPreloaded'
112
+ | 'frequencyCapped'
113
+ | 'ignored'
114
+ | 'other'
115
+ | 'dismissed'
116
+ | 'viewed' = 'noAdPreloaded';
117
+ let isBreakDone = false;
118
+
119
+ switch (data.adsRes) {
120
+ case 'viewed':
121
+ adsRes = 'viewed';
122
+ callbacks?.adViewed?.();
123
+ isBreakDone = true;
124
+ break;
125
+ case 'dismissed':
126
+ adsRes = 'dismissed';
127
+ callbacks?.adDismissed?.();
128
+ isBreakDone = true;
129
+ break;
130
+ case 'error':
131
+ adsRes = 'error';
132
+ isBreakDone = true;
133
+ break;
134
+ case 'other':
135
+ adsRes = 'other';
136
+ isBreakDone = true;
137
+ break;
138
+
139
+ case 'beforeReward':
140
+ callbacks?.beforeReward?.(() => {
141
+ // this.sendPostMessage(HuaweiQuickAdsEventEnum.AD_OPERATION, undefined, undefined);
142
+ window.system.postMessage(
143
+ JSON.stringify({
144
+ type: HuaweiQuickAdsEventEnum.AD_OPERATION
145
+ })
146
+ );
147
+ console.log('HuaweiQuickAdsHandler beforeReward postMessage AD_OPERATION');
148
+ });
149
+ isBreakDone = false;
150
+ break;
151
+ case 'beforeAd':
152
+ callbacks?.beforeAd?.();
153
+ isBreakDone = false;
154
+ break;
155
+ case 'afterAd':
156
+ callbacks?.afterAd?.();
157
+ isBreakDone = false;
158
+ break;
159
+ }
160
+
161
+ isBreakDone &&
162
+ callbacks?.adBreakDone?.({
163
+ breakType: callbacks.breakType ?? '',
164
+ breakName: callbacks.breakName,
165
+ breakFormat: callbacks.breakFormat ?? 'interstitial',
166
+ breakStatus: adsRes
167
+ });
168
+ }
169
+
170
+ console.log('HuaweiQuickAdsHandler window.addEventListener adBreak', data);
171
+ }
172
+ break;
173
+ case HuaweiQuickAdsOnMessageEventEnum.AD_UNIT:
174
+ console.log('HuaweiQuickAdsHandler window.addEventListener adUnit', data);
175
+ break;
176
+ default:
177
+ break;
178
+ }
179
+ }
180
+ });
181
+ }
182
+
183
+ getAdsInstance(): JoliboxAdsForGame {
184
+ return HuaweiQuickAdsHandler.getInstance() as unknown as JoliboxAdsForGame;
185
+ }
186
+
187
+ init(config?: IAdsInitParams): void {
188
+ try {
189
+ this.sendPostMessage(HuaweiQuickAdsEventEnum.INIT, undefined, config);
190
+ } catch (e) {
191
+ console.error('init failed', e);
192
+ }
193
+ }
194
+
195
+ adConfig(params: IAdConfigParams): void {
196
+ try {
197
+ let callbackId = undefined;
198
+ if (params.onReady) {
199
+ callbackId = ++this.callbacksId;
200
+ this.callbackMap.set(callbackId, { onReady: params.onReady });
201
+ }
202
+
203
+ this.sendPostMessage(HuaweiQuickAdsEventEnum.AD_CONFIG, callbackId, params);
204
+ } catch (e) {
205
+ console.error('adConfig failed', e);
206
+ }
207
+ }
208
+
209
+ adBreak(params: IAdBreakParams): void {
210
+ try {
211
+ const callbackId = ++this.callbacksId;
212
+ const callbacks: HuaweiQuickAdsCallbackMap = {};
213
+
214
+ callbacks.breakType = params.type;
215
+ if (params.type !== 'preroll' && params.name) callbacks.breakName = params.name;
216
+ callbacks.breakFormat = params.type === 'reward' ? 'reward' : 'interstitial';
217
+
218
+ if (params.adBreakDone) callbacks.adBreakDone = params.adBreakDone;
219
+ if (params.type !== 'preroll' && params.beforeAd) callbacks.beforeAd = params.beforeAd;
220
+ if (params.type !== 'preroll' && params.afterAd) callbacks.afterAd = params.afterAd;
221
+ if (params.type === 'reward' && params.beforeReward) callbacks.beforeReward = params.beforeReward;
222
+ if (params.type === 'reward' && params.adDismissed) callbacks.adDismissed = params.adDismissed;
223
+ if (params.type === 'reward' && params.adViewed) callbacks.adViewed = params.adViewed;
224
+
225
+ this.callbackMap.set(callbackId, callbacks);
226
+
227
+ this.sendPostMessage(HuaweiQuickAdsEventEnum.AD_BREAK, callbackId, params);
228
+ } catch (e) {
229
+ params.adBreakDone?.({
230
+ breakType: params.type,
231
+ breakName: params.type === 'preroll' ? undefined : params.name,
232
+ breakFormat: params.type === 'reward' ? 'reward' : 'interstitial',
233
+ breakStatus: 'noAdPreloaded'
234
+ });
235
+ }
236
+ }
237
+
238
+ adUnit(params: IAdUnitParams): void {
239
+ try {
240
+ this.sendPostMessage(HuaweiQuickAdsEventEnum.AD_UNIT, undefined, params);
241
+ } catch (e) {
242
+ console.error('adUnit failed', e);
243
+ }
244
+ }
245
+
246
+ private sendPostMessage<T extends HuaweiQuickAdsEventEnum>(
247
+ type: T,
248
+ callbackId?: number,
249
+ data?: HuaweiQuickAdsEventMap[T]
250
+ ): void {
251
+ try {
252
+ if (!window.system?.postMessage) {
253
+ throw new Error('window.system.postMessage is not available');
254
+ }
255
+
256
+ const message: HuaweiQuickAdsEvent<T> = {
257
+ type,
258
+ ...(callbackId !== undefined && { callbackId }),
259
+ ...(data !== undefined && { data })
260
+ };
261
+
262
+ window.system.postMessage(JSON.stringify(message));
263
+ } catch (e) {
264
+ console.error('sendPostMessage failed', e);
265
+ throw e;
266
+ }
267
+ }
268
+ }
@@ -23,15 +23,38 @@ registerCanIUse('checkSession', {
23
23
  }
24
24
  });
25
25
 
26
+ const loginDeferredMap = new Map<string, Deferred<{ isLogin: boolean; token?: string }>>();
27
+
28
+ onNative('onLoginStateChange', ({ isLogin, token, uuid }) => {
29
+ const deferred = loginDeferredMap.get(uuid);
30
+ if (deferred) {
31
+ deferred.resolve({ isLogin, token });
32
+ loginDeferredMap.delete(uuid);
33
+ }
34
+ });
35
+
26
36
  export const login = createAPI('login', {
27
- async implement() {
37
+ paramsSchema: t.tuple(
38
+ t
39
+ .object({
40
+ skipLogin: t.boolean().optional(),
41
+ triggerFrom: t.string().optional()
42
+ })
43
+ .optional()
44
+ ),
45
+ async implement(params) {
28
46
  const {
29
47
  data: { isLogin }
30
48
  } = await applyNative('checkLoginAsync');
31
49
  if (isLogin) {
32
50
  return { isLogin: true, token: context.hostUserInfo?.token };
33
51
  }
34
- const res = invokeNative('loginSync');
52
+
53
+ const { skipLogin, triggerFrom } = params ?? {};
54
+ const res = invokeNative('loginSync', {
55
+ skipLogin,
56
+ triggerFrom
57
+ });
35
58
 
36
59
  const {
37
60
  data: { uuid: loginUUID }
@@ -42,17 +65,12 @@ export const login = createAPI('login', {
42
65
  msg: 'login failed'
43
66
  });
44
67
  }
45
- onNative('onLoginStateChange', ({ isLogin, token, uuid }) => {
46
- if (uuid == loginUUID) {
47
- resolve({ isLogin, token });
48
- }
49
- });
50
- const { promise, resolve } = new Deferred<{ isLogin: boolean; token?: string }>();
51
68
 
52
- const loginRes = await promise;
69
+ const deferred = new Deferred<{ isLogin: boolean; token?: string }>();
70
+ loginDeferredMap.set(loginUUID, deferred);
71
+ const loginRes = await deferred.promise;
53
72
  context.onEnvConfigChanged({ hostUserInfo: loginRes });
54
73
  hostEmitter.emit('onLoginComplete', loginRes);
55
-
56
74
  return loginRes;
57
75
  }
58
76
  });
@@ -229,7 +229,9 @@ rewardsEmitter.on(
229
229
  ?.totalAmountStr ?? ''
230
230
  });
231
231
  if (!context.hostUserInfo?.isLogin) {
232
- const { data } = await login();
232
+ const { data } = await login({
233
+ skipLogin: true
234
+ });
233
235
  if (!data?.isLogin) {
234
236
  console.log('login failed');
235
237
  return;