import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:frontend/providers/auth.dart'; import 'package:frontend/providers/game_messages.dart'; import 'package:frontend/providers/web_socket.dart'; import 'package:go_router/go_router.dart'; import 'package:logging/logging.dart'; import 'package:shared_models/room.dart'; final logger = Logger('GameRoomHome'); class GameRoomHome extends ConsumerStatefulWidget { const GameRoomHome({super.key, this.roomUuid}); final String? roomUuid; @override ConsumerState<GameRoomHome> createState() => _GameRoomHomeState(); } class _GameRoomHomeState extends ConsumerState<GameRoomHome> { @override void initState() { WidgetsBinding.instance.addPostFrameCallback((_) => ref.read(webSocketNotifierProvider.notifier).connect()); super.initState(); } @override Widget build(BuildContext context) { final jwt = ref.watch(jwtBodyProvider); if (jwt == null || jwt.roomUuid != widget.roomUuid) { logger.fine('Tried to open room, but not authenticated / wrong room'); // return home WidgetsBinding.instance.addPostFrameCallback((_) => context.go('/')); } final connection = ref.watch(webSocketNotifierProvider).valueOrNull; if (jwt != null) { ref.listen( gameMessageNotifierProvider, (previous, next) { final message = next.valueOrNull; if (message is GameRoomMessage) { switch (message) { case PingMessage(): final ping = PingMessage.now( jwt.roomUuid, dest: PingDestination.server, userUuid: jwt.uuid, ); ref.read(webSocketNotifierProvider.notifier).sendMessage(ping); case PlayerVoteMessage(): // TODO: Handle this case. throw UnimplementedError(); } } }, ); } // enstablish ws connection at /room/roomCode/ws and save to gameMessageProvider return Scaffold( body: Column( children: [ Text('Authenticated.'), Text('Welcome to room ${widget.roomUuid}'), ElevatedButton( onPressed: connection == null ? null : () { connection.add('Test message'); }, child: Text('Send message on socket')), ], ), ); } }