import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:socket_io_client/socket_io_client.dart' as io; final darkTheme = ThemeData( useMaterial3: true, primarySwatch: Colors.amber, brightness: Brightness.dark, ); void main() { runApp(GetMaterialApp( initialRoute: '/auth', title: 'HUACU', darkTheme: darkTheme, themeMode: ThemeMode.dark, defaultTransition: Transition.native, getPages: [ GetPage(name: '/auth', page: () => const AuthPage()), GetPage(name: '/home', page: () => const HomePage()), ], )); } class AuthData { final String login; final String password; const AuthData(this.login, this.password); } class AuthPage extends StatefulWidget { const AuthPage({super.key}); @override State createState() => _AuthPageState(); } class _AuthPageState extends State { final wsUrl = Uri.parse("ws://localhost:9800/ws"); late io.Socket socket; TextEditingController loginController = TextEditingController(); TextEditingController passwordController = TextEditingController(); @override void initState() { super.initState(); socket = io.io("http://localhost:9800/", { "transports": ["websocket"], }); } @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: [ Text("HUACU", style: Theme.of(context).textTheme.headline1), 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", ), ), 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(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], ); } } class HomePage extends StatefulWidget { const HomePage({super.key}); @override State createState() => _HomePageState(); } class _HomePageState extends State { late io.Socket socket; @override void initState() { super.initState(); socket = Get.find(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text("HUACU"), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text("Hello, ${Get.find().login}"), ], ), ), ); } }