import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:zenith/rooms.dart'; import 'package:zenith/zenith_client_provider.dart'; class LoginPage extends StatefulWidget { const LoginPage({super.key}); @override State createState() => _LoginPageState(); } class _LoginPageState extends State { final serverController = TextEditingController(); final usernameController = TextEditingController(); final passwordController = TextEditingController(); bool loggingIn = false; String failedMessage = ''; void connectMatrix() async { setState(() { loggingIn = true; }); try { final provider = Provider.of(context, listen: false); await provider.initialize(serverController.text, usernameController.text, passwordController.text); } catch (error) { print("Error signing in $error"); setState(() { failedMessage = error.toString(); }); Future.delayed(const Duration(seconds: 10), () { setState(() { failedMessage = ''; }); }); return; } finally { setState(() { loggingIn = false; }); } final prefs = await SharedPreferences.getInstance(); prefs.setString("homeserver", serverController.text); prefs.setString("username", usernameController.text); prefs.setString("password", passwordController.text); if (!mounted) return; Navigator.pushAndRemoveUntil( context, MaterialPageRoute(builder: (context) => const RoomsPage()), (route) => false); } @override void initState() { super.initState(); } @override Widget build(BuildContext context) { return Consumer( builder: (context, provider, child) => Scaffold( appBar: AppBar( backgroundColor: Theme.of(context).colorScheme.inversePrimary, title: const Text("Login"), ), body: Padding( padding: const EdgeInsets.all(16.0), child: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ TextFormField( controller: serverController, decoration: const InputDecoration( labelText: 'Server', hintText: 'https://matrix.org'), ), TextFormField( controller: usernameController, decoration: const InputDecoration( labelText: 'Username', hintText: 'john'), ), TextFormField( controller: passwordController, decoration: const InputDecoration(labelText: 'Password'), obscureText: true, onFieldSubmitted: (value) => connectMatrix(), ), Text(failedMessage, style: Theme.of(context).textTheme.headlineSmall) ], ), ), ), floatingActionButton: loggingIn ? const CircularProgressIndicator() : FloatingActionButton( onPressed: connectMatrix, tooltip: 'Log in', child: const Icon(Icons.login), ), ), ); } }