mnemo_cards/mnemo_cards_web_v2/lib/utils/adsgram_stub.dart

91 lines
2.6 KiB
Dart
Raw Normal View History

2025-11-10 23:55:41 +00:00
/// Real Adsgram SDK interface using JavaScript interop
/// This provides a Dart interface to the Adsgram JavaScript SDK
import 'dart:js_util' as js_util;
/// Configuration for Adsgram ad display
class AdsgramAd {
final String blockId;
final int rewardAmount;
final void Function()? onReward;
final void Function(String error)? onError;
const AdsgramAd({
required this.blockId,
required this.rewardAmount,
this.onReward,
this.onError,
});
}
/// Adsgram SDK interface for showing rewarded ads
class Adsgram {
static final Adsgram _instance = Adsgram._internal();
static Adsgram get instance => _instance;
Adsgram._internal();
/// Show a rewarded ad using the Adsgram JavaScript SDK
/// This calls the JavaScript showAd() function defined in web/foos.js
Future<void> showRewardedAd(AdsgramAd adConfig) async {
try {
// Set up callbacks in JavaScript before showing ad
await _setupCallbacks(adConfig);
// Call the JavaScript showAd function
// The function is defined in web/foos.js and handles the Adsgram SDK
await js_util.callMethod<Future<void>>(
js_util.globalThis,
'showAd',
<Object?>[],
);
// Note: The actual reward/error dispatch logic is handled in the JavaScript
// The callbacks are triggered from JavaScript when ad completes or fails
} catch (e) {
// If JavaScript call fails, call error callback
adConfig.onError?.call('Failed to show ad: $e');
}
}
/// Set up JavaScript callbacks for ad completion
Future<void> _setupCallbacks(AdsgramAd adConfig) async {
// Create JavaScript functions that will call the Dart callbacks
final rewardJsFunction = js_util.jsify(() {
adConfig.onReward?.call();
});
final errorJsFunction = js_util.jsify((String error) {
adConfig.onError?.call(error);
});
// Set the callbacks in JavaScript
await js_util.callMethod<Future<void>>(
js_util.globalThis,
'setRewardCallback',
<Object?>[rewardJsFunction],
);
await js_util.callMethod<Future<void>>(
js_util.globalThis,
'setErrorCallback',
<Object?>[errorJsFunction],
);
}
/// Alternative method to show ad with specific block ID
/// This allows dynamic block ID configuration
Future<void> showAdWithBlockId(String blockId) async {
try {
await js_util.callMethod<Future<void>>(
js_util.globalThis,
'showAdWithBlockId',
<Object?>[blockId],
);
} catch (e) {
throw Exception('Failed to show ad with block ID $blockId: $e');
}
}
}