import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:huacu_mobile/models/auth_data.dart'; import 'package:huacu_mobile/ui/widgets/socket_connection_indicator.dart'; import 'package:socket_io_client/socket_io_client.dart' as io; class AuthPage extends StatefulWidget { const AuthPage({super.key}); @override State createState() => _AuthPageState(); } class _AuthPageState extends State { static const serverUrl = kDebugMode ? "http://localhost:9800" : "https://huacu.nuark.xyz"; io.Socket socket = io.io(serverUrl, { "transports": ["websocket"], }); TextEditingController loginController = TextEditingController(); TextEditingController passwordController = TextEditingController(); @override void initState() { super.initState(); if (!socket.connected) { socket.connect(); } } @override Widget build(BuildContext context) { final size = MediaQuery.of(context).size; double? formWidth = size.width * 0.5; if (formWidth < 300) { formWidth = null; } return Scaffold( body: Center( child: Container( width: formWidth, padding: const EdgeInsets.all(16), child: FocusTraversalGroup( policy: OrderedTraversalPolicy(), child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, mainAxisSize: MainAxisSize.min, children: [ Row( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( "HUACU", style: Theme.of(context).textTheme.displayLarge, ), SocketConnectionIndicator(socket: socket), ], ), const SizedBox(height: 32), TextField( controller: loginController, decoration: const InputDecoration( border: OutlineInputBorder(), labelText: "Login", ), ), const SizedBox(height: 16), TextField( controller: passwordController, decoration: const InputDecoration( border: OutlineInputBorder(), labelText: "Password", ), obscureText: true, ), const SizedBox(height: 16), Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.end, children: [ ElevatedButton( onPressed: _handleLoginClick, child: const Text("Login"), ), const SizedBox(width: 16), ElevatedButton( onPressed: _handleRegistrationClick, child: const Text("Register"), ), ], ), ], ), ), ), ), ); } void _loginEventHandler(dynamic data) { try { bool ok = data[0]; String message = data[1]; Get.snackbar( ok ? "Login successful" : "Login unsuccessful", message, ); if (ok) { Get.put( AuthData(data[2], loginController.text, passwordController.text), ); Get.put(socket); Get.offNamed("/home"); } } catch (e) { Get.snackbar("Error", e.toString()); } socket.off("login", _loginEventHandler); } void _handleLoginClick() { socket.on("login", _loginEventHandler); socket.emit( "login", [loginController.text, passwordController.text], ); } void _registerEventHandler(dynamic data) { try { bool ok = data[0]; String message = data[1]; Get.snackbar( ok ? "Registration successful" : "Registration unsuccessful", message, ); if (ok) { _handleLoginClick(); } } catch (e) { Get.snackbar("Error", e.toString()); } socket.off("register", _registerEventHandler); } void _handleRegistrationClick() { socket.on("register", _registerEventHandler); socket.emit( "register", [loginController.text, passwordController.text], ); } }