diff --git a/lib/helpers/websocket_helper.dart b/lib/helpers/websocket_helper.dart index 0682812..a137eb1 100644 --- a/lib/helpers/websocket_helper.dart +++ b/lib/helpers/websocket_helper.dart @@ -1,15 +1,54 @@ +import 'package:comunic/models/api_request.dart'; +import 'package:comunic/models/config.dart'; +import 'package:web_socket_channel/web_socket_channel.dart'; + /// User web socket helper /// /// @author Pierre Hubert class WebSocketHelper { - /// Check out whether we are currently connected to websocket or not + static WebSocketChannel _ws; + + /// Check out whether we are currently connected to WebSocket or not static bool isConnected() { - return true; + return _ws != null && _ws.closeCode == null; } + /// Get WebSocket access token + //TODO : Handles the case user tokens were destroyed (auto sign-out user) + static Future _getWsToken() async => + (await APIRequest(uri: "ws/token", needLogin: true).exec()) + .assertOk() + .getObject()["token"]; + /// Connect to WebSocket static connect() async { if (isConnected()) return; + + // First, get an access token + final token = await _getWsToken(); + + // Determine websocket URI + final wsURL = + "${(config().apiServerSecure ? "wss" : "ws")}://${config() + .apiServerName}${config().apiServerUri}ws?token=$token"; + final wsURI = Uri.parse(wsURL); + + // Connect + _ws = WebSocketChannel.connect(wsURI); + + _ws.stream.listen( + // When we got data + (onData) => print("WS New data: $onData"), + + // Print errors on console + onError: (e, stack) { + print("WS error! $e"); + print(stack); + }, + + // Notify when the channel is closed + onDone: () => print("WS Channel closed"), + ); } } diff --git a/lib/ui/widgets/init_widget.dart b/lib/ui/widgets/init_widget.dart index 6e25b0f..44727c1 100644 --- a/lib/ui/widgets/init_widget.dart +++ b/lib/ui/widgets/init_widget.dart @@ -49,7 +49,9 @@ class _InitializeWidgetState extends State { @override Widget build(BuildContext context) { - return WebSocketHelper.isConnected() ? MainRoute() : _buildNonReadyWidget(); + return !_error && WebSocketHelper.isConnected() + ? MainRoute() + : _buildNonReadyWidget(); } /// Build loading widget