diff --git a/duo_client/lib/provider/api_provider.dart b/duo_client/lib/provider/api_provider.dart index d13e6a8..fd73dce 100644 --- a/duo_client/lib/provider/api_provider.dart +++ b/duo_client/lib/provider/api_provider.dart @@ -1,3 +1,5 @@ +import 'package:duo_client/pb/lobby.pb.dart'; + import 'storage_provider.dart'; import '../utils/connection/abstract_connection.dart'; import '../utils/connection/grpc_server_connection.dart'; @@ -13,6 +15,9 @@ class ApiProvider extends ChangeNotifier implements AbstractServerConnection { AbstractServerConnection? _serverConnection; final StorageProvider _storageProvider; + @override + LobbyStatus? get lobbyStatus => _serverConnection?.lobbyStatus; + ApiProvider(this._storageProvider) { init(_storageProvider.lastSelectedConnectionType); //Defaults to grpc } @@ -39,18 +44,18 @@ class ApiProvider extends ChangeNotifier implements AbstractServerConnection { } @override - Future createSession(String token, String pin) { - return _serverConnection!.createSession(token, pin); + Future createLobby(String token) { + return _serverConnection!.createLobby(token); } @override - Future disconnectSession(String token, int sessionId) { - return _serverConnection!.disconnectSession(token, sessionId); + Future disconnectLobby(String token, int lobbyId) { + return _serverConnection!.disconnectLobby(token, lobbyId); } @override - Future joinSession(String token, int sessionId) { - return _serverConnection!.joinSession(token, sessionId); + Future joinLobby(String token, int lobbyId) { + return _serverConnection!.joinLobby(token, lobbyId); } @override @@ -62,6 +67,9 @@ class ApiProvider extends ChangeNotifier implements AbstractServerConnection { Future registerUser(String username) { return _serverConnection!.registerUser(username); } + + @override + set lobbyStatus(LobbyStatus? _lobbyStatus) {} } final apiProvider = ChangeNotifierProvider((ref) { diff --git a/duo_client/lib/screens/lobby_screen.dart b/duo_client/lib/screens/lobby_screen.dart index 0c4e5f0..75a3758 100644 --- a/duo_client/lib/screens/lobby_screen.dart +++ b/duo_client/lib/screens/lobby_screen.dart @@ -1,4 +1,3 @@ -import 'dart:math'; import 'package:animated_background/animated_background.dart'; import 'package:duo_client/provider/api_provider.dart'; import 'package:duo_client/provider/storage_provider.dart'; @@ -6,6 +5,7 @@ import 'package:duo_client/utils/constants.dart'; import 'package:duo_client/utils/helpers.dart'; import 'package:duo_client/widgets/add_tile.dart'; import 'package:duo_client/widgets/invite_dialog.dart'; +import 'package:duo_client/widgets/user_tile.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_spinkit/flutter_spinkit.dart'; @@ -23,8 +23,8 @@ class _LobbyScreenState extends ConsumerState with TickerProviderStateMixin { bool creatingLobby = true; late final ApiProvider _apiProvider; - int sessionID = -1; - String displaySessionID = ''; + int lobbyID = -1; + String displaylobbyID = ''; late final StorageProvider _storageProvider; void createLobby() async { @@ -32,12 +32,10 @@ class _LobbyScreenState extends ConsumerState _apiProvider = ref.watch(apiProvider); _storageProvider = ref.watch(storageProvider); _apiProvider.init(ServerConnectionType.grpc); - _apiProvider - .createSession(_storageProvider.accessToken, sessionID.toString()) - .then( + _apiProvider.createLobby(_storageProvider.accessToken).then( (value) { - sessionID = value; - displaySessionID = Helpers.fillPrefixWithZeros(sessionID); + lobbyID = value; + displaylobbyID = Helpers.fillPrefixWithZeros(lobbyID); setState(() { creatingLobby = false; }); @@ -122,54 +120,19 @@ class _LobbyScreenState extends ConsumerState childAspectRatio: 1.5, ), children: [ - Padding( - padding: const EdgeInsets.all(8.0), - child: AddTile( + ..._apiProvider.lobbyStatus!.users.map((user) { + return UserTile(user: user); + }), + ...List.generate( + _apiProvider.lobbyStatus!.maxPlayers - + _apiProvider.lobbyStatus!.users.length, + (index) { + return AddTile( Dialog: InviteDialog( - invideCode: displaySessionID, + invideCode: displaylobbyID, ), - ), - ), - Padding( - padding: const EdgeInsets.all(8.0), - child: AddTile( - Dialog: InviteDialog( - invideCode: displaySessionID, - ), - ), - ), - Padding( - padding: const EdgeInsets.all(8.0), - child: AddTile( - Dialog: InviteDialog( - invideCode: displaySessionID, - ), - ), - ), - Padding( - padding: const EdgeInsets.all(8.0), - child: AddTile( - Dialog: InviteDialog( - invideCode: displaySessionID, - ), - ), - ), - Padding( - padding: const EdgeInsets.all(8.0), - child: AddTile( - Dialog: InviteDialog( - invideCode: displaySessionID, - ), - ), - ), - Padding( - padding: const EdgeInsets.all(8.0), - child: AddTile( - Dialog: InviteDialog( - invideCode: displaySessionID, - ), - ), - ), + ); + }) ], ), ), @@ -184,9 +147,9 @@ class _LobbyScreenState extends ConsumerState onPressed: () async { int status = await ref .read(apiProvider) - .disconnectSession( + .disconnectLobby( ref.read(storageProvider).accessToken, - sessionID); + lobbyID); if (status == 0) { Navigator.of(context).pop(); } else { diff --git a/duo_client/lib/utils/connection/abstract_connection.dart b/duo_client/lib/utils/connection/abstract_connection.dart index 9ad6c0b..1f1b800 100644 --- a/duo_client/lib/utils/connection/abstract_connection.dart +++ b/duo_client/lib/utils/connection/abstract_connection.dart @@ -1,8 +1,12 @@ +import 'package:duo_client/pb/lobby.pb.dart'; + abstract class AbstractServerConnection { + LobbyStatus? lobbyStatus; + AbstractServerConnection(); Future registerUser(String username); Future loginUser(String uuid); - Future createSession(String token, String pin); - Future joinSession(String token, int sessionId); - Future disconnectSession(String token, int sessionId); + Future createLobby(String token); + Future joinLobby(String token, int sessionId); + Future disconnectLobby(String token, int sessionId); } diff --git a/duo_client/lib/utils/connection/grpc_server_connection.dart b/duo_client/lib/utils/connection/grpc_server_connection.dart index 18c627f..587bf83 100644 --- a/duo_client/lib/utils/connection/grpc_server_connection.dart +++ b/duo_client/lib/utils/connection/grpc_server_connection.dart @@ -1,8 +1,8 @@ import 'dart:convert'; +import 'package:duo_client/pb/lobby.pb.dart'; import 'package:duo_client/provider/storage_provider.dart'; import '../../pb/auth_messages.pb.dart'; -import '../../pb/session_messages.pb.dart'; import 'abstract_connection.dart'; import '../constants.dart'; import '../encryption/encryption_handler.dart'; @@ -104,17 +104,16 @@ class GrpcServerConnection extends AbstractServerConnection { } @override - Future createSession(String token, String pin) async { + Future createLobby(String token) async { try { - CreateSessionResponse response = - await client.createSession(CreateSessionRequest() - ..token = token - ..pin = pin); - - if (response.sessionId != 0) { - print('Session ID: ${response.sessionId}'); - - return response.sessionId; + ResponseStream response = + await client.createLobby(CreateLobbyRequest()..token = token); + + await for (LobbyStatus ls in response) { + // Todo Update LobbyProvider with new state + //print('Received: ${ls.lobbyId}'); + lobbyStatus = ls; + _notifyListeners(); } } catch (e) { print('Error: $e'); @@ -124,15 +123,16 @@ class GrpcServerConnection extends AbstractServerConnection { } @override - Future joinSession(String token, int sessionId) async { + Future joinLobby(String token, int lobbyId) async { try { - ResponseStream stream = - client.joinSession(JoinSessionRequest() - ..token = token - ..sessionId = sessionId); - - await for (SessionStream ss in stream) { - print('Received: ${ss.sessionState.users.length}'); + ResponseStream stream = client.joinLobby(JoinLobbyRequest() + ..token = token + ..lobbyId = lobbyId); + + await for (LobbyStatus ls in stream) { + //print('Received: ${ls.users}'); + lobbyStatus = ls; + _notifyListeners(); } } catch (e) { return -1; @@ -141,12 +141,15 @@ class GrpcServerConnection extends AbstractServerConnection { } @override - Future disconnectSession(String token, int sessionId) async { + Future disconnectLobby(String token, int lobbyId) async { try { - DisconnectSessionResponse res = - await client.disconnectSession(DisconnectSessionRequest() + DisconnectLobbyResponse res = + await client.disconnectLobby(DisconnectLobbyRequest() ..token = token - ..sessionId = sessionId); + ..lobbyId = lobbyId); + + lobbyStatus = null; + _notifyListeners(); if (res.success) { return 0; diff --git a/duo_client/lib/widgets/join_dialog.dart b/duo_client/lib/widgets/join_dialog.dart index 2f322eb..5301b31 100644 --- a/duo_client/lib/widgets/join_dialog.dart +++ b/duo_client/lib/widgets/join_dialog.dart @@ -4,7 +4,6 @@ import 'package:duo_client/screens/lobby_screen.dart'; import 'package:duo_client/screens/qr_scanner_screen.dart'; import 'package:duo_client/utils/constants.dart'; import 'package:duo_client/utils/helpers.dart'; -import 'package:duo_client/widgets/duo_container.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; @@ -82,7 +81,7 @@ class _JoinDialogState extends ConsumerState { const SizedBox(width: Constants.defaultPadding / 2), IconButton( onPressed: () async { - dynamic? id = await Navigator.of(context) + dynamic id = await Navigator.of(context) .pushNamed(QrCodeScanner.route); if (id != null) { _controller.text = @@ -114,7 +113,7 @@ class _JoinDialogState extends ConsumerState { }); return; } - int stauts = await ref.read(apiProvider).joinSession( + int stauts = await ref.read(apiProvider).joinLobby( ref.read(storageProvider).accessToken, int.parse(_controller.text)); if (stauts == 0) { diff --git a/duo_client/lib/widgets/user_tile.dart b/duo_client/lib/widgets/user_tile.dart new file mode 100644 index 0000000..3ee3aa8 --- /dev/null +++ b/duo_client/lib/widgets/user_tile.dart @@ -0,0 +1,53 @@ +import 'package:duo_client/pb/user.pb.dart'; +import 'package:duo_client/utils/constants.dart'; +import 'package:duo_client/widgets/duo_container.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; + +class UserTile extends StatelessWidget { + const UserTile({ + super.key, + required this.user, + }); + + final User user; + + @override + Widget build(BuildContext context) { + double width = MediaQuery.of(context).size.width; + double height = MediaQuery.of(context).size.height; + return DuoContainer( + width: width / 3.5, + height: height / 4.5, + child: Material( + color: Colors.transparent, + child: InkWell( + borderRadius: BorderRadius.circular(Constants.defaultRadius), + child: Padding( + padding: const EdgeInsets.all(Constants.defaultPadding), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SvgPicture.asset( + 'res/icons/user.svg', + colorFilter: ColorFilter.mode( + Theme.of(context).colorScheme.onPrimary, + BlendMode.srcIn, + ), + ), + const SizedBox(height: 10), + Text( + user.name, + style: TextStyle( + color: Theme.of(context).colorScheme.onPrimary, + fontSize: 20, + ), + ), + ], + ), + ), + ), + ), + ); + } +}