You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
cloudsolutions-atoms/lib/services/app_initialization_service....

112 lines
4.6 KiB
Dart

import 'dart:developer';
import 'package:flutter/foundation.dart';
import 'package:test_sa/modules/cx_module/chat/services/call_manager.dart';
import 'package:test_sa/modules/cx_module/chat/services/signalr_service.dart';
/// App-level initialization service
/// Handles initialization of core services like SignalR and CallManager
class AppInitializationService {
static final AppInitializationService _instance = AppInitializationService._internal();
factory AppInitializationService() => _instance;
AppInitializationService._internal();
bool _isInitialized = false;
bool get isInitialized => _isInitialized;
/// Initialize SignalR and CallManager after user login
/// This should be called from the landing page after successful login
Future<void> initializeAfterLogin({
required String userId,
required String authToken,
required String employeeNumber,
String? conversationId,
String? moduleId,
String? referenceId,
}) async {
if (_isInitialized) {
log('⚠️ [APP INIT] Already initialized, skipping...', name: 'AppInitializationService');
return;
}
try {
log('═══════════════════════════════════════════', name: 'AppInitializationService');
log('🚀 [APP INIT] Starting app initialization...', name: 'AppInitializationService');
log(' User ID: $userId', name: 'AppInitializationService');
log(' Employee Number: $employeeNumber', name: 'AppInitializationService');
log('═══════════════════════════════════════════', name: 'AppInitializationService');
// Step 1: Initialize SignalR Service
log('🔌 [APP INIT] Step 1: Initializing SignalR Service...', name: 'AppInitializationService');
final signalRService = SignalRService();
final connected = await signalRService.initialize(
userId: userId,
authToken: authToken,
conversationId: conversationId,
);
if (!connected) {
throw Exception('Failed to initialize SignalR connection');
}
log('✅ [APP INIT] SignalR Service initialized', name: 'AppInitializationService');
log(' Connection State: ${signalRService.connectionState}', name: 'AppInitializationService');
log(' Connection ID: ${signalRService.connectionId ?? "NULL"}', name: 'AppInitializationService');
// Step 2: Initialize CallManager
log('📞 [APP INIT] Step 2: Initializing CallManager...', name: 'AppInitializationService');
await CallManager().initialize(
userId: userId,
authToken: authToken,
conversationId: conversationId,
moduleId: moduleId,
referenceId: referenceId,
employeeNumber: employeeNumber,
);
log('✅ [APP INIT] CallManager initialized', name: 'AppInitializationService');
_isInitialized = true;
log('═══════════════════════════════════════════', name: 'AppInitializationService');
log('✅ [APP INIT] App initialization complete!', name: 'AppInitializationService');
log(' ✅ SignalR Service: Ready', name: 'AppInitializationService');
log(' ✅ CallManager: Ready', name: 'AppInitializationService');
log(' ✅ WebRTC: Will initialize on first call', name: 'AppInitializationService');
log('═══════════════════════════════════════════', name: 'AppInitializationService');
} catch (e, stackTrace) {
log('❌ [APP INIT] Initialization failed: $e',
name: 'AppInitializationService', error: e, stackTrace: stackTrace);
_isInitialized = false;
rethrow;
}
}
/// Reset initialization state (for logout)
Future<void> reset() async {
log('🔄 [APP INIT] Resetting app initialization...', name: 'AppInitializationService');
try {
// Reset CallManager
await CallManager().reset();
// Disconnect SignalR
await SignalRService().disconnect();
_isInitialized = false;
log('✅ [APP INIT] Reset complete', name: 'AppInitializationService');
} catch (e) {
log('⚠️ [APP INIT] Error during reset: $e', name: 'AppInitializationService');
}
}
/// Check if services are ready for calling
bool areServicesReady() {
final signalRConnected = SignalRService().isConnected;
final callManagerInitialized = CallManager().isCallInProgress || _isInitialized;
return signalRConnected && _isInitialized;
}
}