diff options
Diffstat (limited to 'lib/screens/login_screen.dart')
-rw-r--r-- | lib/screens/login_screen.dart | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/lib/screens/login_screen.dart b/lib/screens/login_screen.dart new file mode 100644 index 0000000..2b0e115 --- /dev/null +++ b/lib/screens/login_screen.dart @@ -0,0 +1,145 @@ +import 'package:flutter/material.dart'; +import 'package:pmsna1/widgets/loading_modal_widget.dart'; +import 'package:social_login_buttons/social_login_buttons.dart'; + +class LoginScreen extends StatefulWidget { + const LoginScreen({super.key}); + + @override + State<LoginScreen> createState() => _LoginScreenState(); +} + +class _LoginScreenState extends State<LoginScreen> + with SingleTickerProviderStateMixin { + late AnimationController _controller; + + bool isLoading = false; + + final padding = 16.0; + final spacer = const SizedBox(height: 16.0); + + // TextField controllers + late TextEditingController _emailController; + late TextEditingController _passwordController; + + @override + void initState() { + super.initState(); + _emailController = TextEditingController(); + _passwordController = TextEditingController(); + _controller = AnimationController(vsync: this); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Stack( + children: [ + SingleChildScrollView( + child: Column( + children: [ + Padding( + padding: EdgeInsets.all(padding * 2), + child: Image.asset('assets/logo_itc.png', height: 120.0), + ), + Container( + width: double.infinity, + alignment: Alignment.centerLeft, + padding: EdgeInsets.symmetric(horizontal: padding), + child: Text( + 'Iniciar sesión', + style: Theme.of(context).textTheme.displaySmall, + textAlign: TextAlign.left, + ), + ), + Card( + margin: EdgeInsets.all(padding), + child: Padding( + padding: EdgeInsets.all(padding), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + TextField( + controller: _emailController, + decoration: InputDecoration( + border: const OutlineInputBorder(), + labelText: 'Correo electrónico', + hintText: 'test@example.com', + ), + keyboardType: TextInputType.emailAddress, + ), + spacer, + TextField( + controller: _passwordController, + obscureText: true, + decoration: const InputDecoration( + border: OutlineInputBorder(), + labelText: 'Contraseña', + ), + ), + spacer, + SocialLoginButton( + buttonType: SocialLoginButtonType.generalLogin, + text: 'Iniciar sesión', + backgroundColor: + Theme.of(context).colorScheme.primary, + onPressed: () { + setState(() { + isLoading = true; + }); + Future.delayed(const Duration(seconds: 4)) + .whenComplete(() { + setState(() { + isLoading = false; + Navigator.of(context).pushNamed('/dash'); + }); + }); + }, + ), + spacer, + const Divider(), + spacer, + SocialLoginButton( + buttonType: SocialLoginButtonType.google, + text: 'Iniciar sesión con Google', + onPressed: () {}, + ), + spacer, + SocialLoginButton( + buttonType: SocialLoginButtonType.facebook, + text: 'Iniciar sesión con Facebook', + onPressed: () {}, + ), + spacer, + SocialLoginButton( + buttonType: SocialLoginButtonType.github, + text: 'Iniciar sesión con GitHub', + onPressed: () {}, + ), + spacer, + TextButton( + onPressed: () { + Navigator.of(context).pushNamed('/register'); + }, + child: const Text('Crear cuenta'), + ) + ], + ), + ), + ), + ], + ), + ), + isLoading ? const LoadingModal() : const SizedBox.shrink(), + ], + ), + ); + } +} |