import 'dart:async'; import 'package:flutter/foundation.dart'; import '../models/agent_status.dart'; import '../models/queue_state.dart'; import '../services/api_client.dart'; import '../services/sse_service.dart'; class AgentProvider extends ChangeNotifier { final ApiClient _api; final SseService _sse; AgentStatus? _status; List _queues = []; bool _sseConnected = false; StreamSubscription? _sseSub; StreamSubscription? _connSub; AgentStatus? get status => _status; List get queues => _queues; bool get sseConnected => _sseConnected; AgentProvider(this._api, this._sse) { _connSub = _sse.connectionState.listen((connected) { _sseConnected = connected; notifyListeners(); }); _sseSub = _sse.events.listen(_handleSseEvent); } Future fetchStatus() async { try { final response = await _api.dio.get('/agent/status'); _status = AgentStatus.fromJson(response.data); notifyListeners(); } catch (_) {} } Future updateStatus(AgentStatusValue newStatus) async { final statusStr = newStatus.name; try { await _api.dio.post('/agent/status', data: { 'status': statusStr, 'is_logged_in': true, }); _status = AgentStatus( status: newStatus, isLoggedIn: true, currentCallSid: _status?.currentCallSid, ); notifyListeners(); } catch (_) {} } Future fetchQueues() async { try { final response = await _api.dio.get('/queues/state'); final data = response.data; _queues = (data['queues'] as List) .map((q) => QueueInfo.fromJson(q as Map)) .toList(); notifyListeners(); } catch (_) {} } Future refresh() async { await Future.wait([fetchStatus(), fetchQueues()]); } void _handleSseEvent(SseEvent event) { switch (event.event) { case 'call_enqueued': case 'call_dequeued': fetchQueues(); break; case 'agent_status_changed': fetchStatus(); break; } } @override void dispose() { _sseSub?.cancel(); _connSub?.cancel(); super.dispose(); } }