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.
112 lines
4.6 KiB
Dart
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;
|
|
}
|
|
}
|
|
|