import 'dart:async'; import 'package:socket_io_client/socket_io_client.dart' as io; import '../../../core/config.dart'; import '../../../core/storage/token_store.dart'; import '../../home/data/models/trip_offer_model.dart'; import 'trip_event_merger.dart'; /// خدمة WebSocket للسائق — تتصل بالسيرفر وتستقبل: /// - `trip:offer` — عرض رحلة وارد /// - `trip:offer_taken` — تم قبول العرض (من سائق آخر) /// - `trip:update` — تحديث حالة الرحلة النشطة /// - `trip:new` — رحلة جديدة متاحة class DriverSocketService { final TokenStore _tokenStore; final DriverTripEventMerger _merger; io.Socket? _socket; bool _connected = false; String? _currentTripId; DriverSocketService(this._tokenStore, this._merger); /// الاتصال بالخادم. Future connect() async { if (_connected) return; final token = await _tokenStore.access(); if (token == null || token.isEmpty) return; _socket = io.io( AppConfig.baseUrl.replaceAll('/api', ''), io.OptionBuilder() .setTransports(['websocket']) .enableAutoConnect() .enableReconnection() .setReconnectionDelay(2000) .setReconnectionAttempts(10) .setAuth({'token': token}) .build(), ); _socket!.onConnect((_) { _connected = true; }); _socket!.onDisconnect((_) { _connected = false; }); _socket!.onReconnect((_) { if (_currentTripId != null) { joinTrip(_currentTripId!); } }); // استقبال عروض الرحلات الواردة. _socket!.on('trip:offer', (data) { if (data is! Map) return; final map = Map.from(data); _merger.addOffer(TripOfferModel.fromJson(map)); }); // العرض تم قبوله من سائق آخر. _socket!.on('trip:offer_taken', (data) { if (data is! Map) return; final map = Map.from(data); final tripId = map['tripId'] as String?; if (tripId != null) { _merger.addOfferTaken(tripId); } }); // تحديث حالة الرحلة النشطة. _socket!.on('trip:update', (data) { if (data is! Map) return; final map = Map.from(data); _merger.addUpdate(DriverTripUpdate( tripId: map['tripId'] as String? ?? '', status: map['status'] as String? ?? '', extra: map..remove('tripId')..remove('status'), )); }); // رحلة جديدة متاحة (إشعار عام). _socket!.on('trip:new', (data) { if (data is! Map) return; final map = Map.from(data); final tripId = map['tripId'] as String?; if (tripId != null) { _merger.addNewTrip(tripId); } }); _socket!.connect(); } /// الانضمام لغرفة الرحلة. void joinTrip(String tripId) { _currentTripId = tripId; _socket?.emit('trip:join', {'tripId': tripId}); } /// مغادرة غرفة الرحلة. void leaveTrip(String tripId) { _currentTripId = null; } /// قطع الاتصال. void disconnect() { _socket?.disconnect(); _socket?.dispose(); _socket = null; _connected = false; } bool get isConnected => _connected; }