import 'dart:convert'; import 'dart:io'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:frontend/providers/dio.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:shared_models/room.dart'; part 'game_messages.g.dart'; @riverpod class GameMessageNotifier extends _$GameMessageNotifier { @override Stream<GameRoomMessage> build() { return Stream.empty(); } Future<void> connect(String gameRoomUuid) async { final dio = ref.read(dioProvider); Uri.parse('ws://localhost:8080/room/$gameRoomUuid/ws'); // connect to websocket and then set stream of websocket to state final wsUrl = Uri.parse('ws://localhost:8080/room/$gameRoomUuid/ws'); final connection = await WebSocket.connect(wsUrl.toString()); final Stream<GameRoomMessage> gameRoomStream = connection.map((message) { try { if (message is String) { GameRoomMessage.fromJson(jsonDecode(message) as Map<String, dynamic>); } else { logger.info('Recieved non-string message in socket: $message'); } } catch (e) { print('Error parsing message: $e'); rethrow; } }); gameRoomStream.listen( (event) => state = AsyncValue.data(event), ); } }