Начальный коммит

This commit is contained in:
2026-01-30 21:54:00 +07:00
parent 51de113db5
commit 3881248187
81 changed files with 5424 additions and 0 deletions

View File

@@ -0,0 +1,88 @@
// 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<Map<String, dynamic>> _messageController =
StreamController.broadcast();
Stream<Map<String, dynamic>> 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<String, dynamic> 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;
}