Files
worker/lib/core/services/onesignal_service.dart
2025-12-10 17:14:03 +07:00

93 lines
2.9 KiB
Dart

import 'package:flutter/foundation.dart';
import 'package:onesignal_flutter/onesignal_flutter.dart';
/// OneSignal service for managing push notifications and external user ID.
///
/// This service handles:
/// - Setting external user ID after login (using phone number)
/// - Restoring external user ID on app startup
/// - Clearing external user ID on logout
///
/// Usage:
/// ```dart
/// // After successful login
/// await OneSignalService.login(phoneNumber);
///
/// // On logout
/// await OneSignalService.logout();
/// ```
class OneSignalService {
OneSignalService._();
/// Login user to OneSignal by setting external user ID.
///
/// This associates the device with the user's phone number,
/// allowing targeted push notifications to specific users.
///
/// [phoneNumber] - The user's phone number (used as external ID)
static Future<void> login(String phoneNumber) async {
try {
// Set external user ID for targeting
await OneSignal.login(phoneNumber);
debugPrint('🔔 OneSignal: login - external_id set to $phoneNumber');
} catch (e) {
debugPrint('🔔 OneSignal error: Failed to set external user ID - $e');
}
}
/// Logout user from OneSignal by removing external user ID.
///
/// This disassociates the device from the user,
/// so notifications won't be sent to this specific user anymore.
static Future<void> logout() async {
try {
await OneSignal.logout();
debugPrint('🔔 OneSignal: logout - external_id cleared');
} catch (e) {
debugPrint('🔔 OneSignal error: Failed to clear external user ID - $e');
}
}
/// Add a tag to the user for segmentation.
///
/// Tags can be used to segment users for targeted notifications.
/// Example: tier = "diamond", role = "contractor"
static Future<void> setTag(String key, String value) async {
try {
await OneSignal.User.addTagWithKey(key, value);
debugPrint('🔔 OneSignal: tag set - $key: $value');
} catch (e) {
debugPrint('🔔 OneSignal error: Failed to set tag - $e');
}
}
/// Add multiple tags at once.
static Future<void> setTags(Map<String, String> tags) async {
try {
await OneSignal.User.addTags(tags);
debugPrint('🔔 OneSignal: tags set - $tags');
} catch (e) {
debugPrint('🔔 OneSignal error: Failed to set tags - $e');
}
}
/// Remove a tag from the user.
static Future<void> removeTag(String key) async {
try {
await OneSignal.User.removeTag(key);
debugPrint('🔔 OneSignal: tag removed - $key');
} catch (e) {
debugPrint('🔔 OneSignal error: Failed to remove tag - $e');
}
}
/// Get the OneSignal subscription ID (player ID).
///
/// This is the device-specific ID used by OneSignal.
static String? get subscriptionId => OneSignal.User.pushSubscription.id;
/// Check if push notifications are enabled.
static bool get isPushEnabled =>
OneSignal.User.pushSubscription.optedIn ?? false;
}