// lib/services/api/socket_service.dart import 'dart:convert'; import 'package:flutter_stocky/utils/constants.dart'; import 'package:get/get.dart'; import 'package:web_socket_channel/web_socket_channel.dart'; class SocketService extends GetxService { final String _baseUrl = Constants.BASE_SOCKET_URL; WebSocketChannel? _channel; bool _connected = false; // Поток для получения сообщений StreamController> _messageController = StreamController.broadcast(); Stream> get messages => _messageController.stream; @override void onInit() { connect(); super.onInit(); } @override void onClose() { _disconnect(); _messageController.close(); super.onClose(); } void connect() async { if (_connected) return; try { _channel = WebSocketChannel.connect(Uri.parse('$_baseUrl/ws')); _channel!.stream.listen( (message) { final data = json.decode(message); _messageController.add(data); }, onDone: () { _connected = false; debugPrint('WebSocket отключен'); }, onError: (error) { debugPrint('WebSocket ошибка: $error'); _connected = false; // Автоподключение через 3 сек Future.delayed(const Duration(seconds: 3), connect); }, ); _connected = true; debugPrint('WebSocket подключен'); } catch (e) { debugPrint('Ошибка подключения к WebSocket: $e'); } } void _disconnect() { _channel?.close(); _channel = null; _connected = false; } void sendMessage(Map message) { if (_connected && _channel != null) { _channel?.sink.add(json.encode(message)); } } // Пример: отправить обновление задачи void notifyTaskUpdate(String taskId) { sendMessage({'type': 'task_updated', 'task_id': taskId}); } // Пример: подписаться на изменения задач void subscribeToTasks() { sendMessage({'type': 'subscribe', 'entity': 'tasks'}); } // Пример: уведомить о создании задачи void notifyTaskCreated(Task task) { sendMessage({'type': 'task_created', 'data': task.toJson()}); } bool get isConnected => _connected; }