mirror of
https://gitlab.com/mysocialportal/relatica
synced 2024-10-18 15:53:32 +00:00
101 lines
3.5 KiB
Dart
101 lines
3.5 KiB
Dart
|
import 'package:email_validator/email_validator.dart';
|
||
|
import 'package:flutter/material.dart';
|
||
|
import 'package:go_router/go_router.dart';
|
||
|
import 'package:result_monad/result_monad.dart';
|
||
|
|
||
|
import '../controls/padding.dart';
|
||
|
import '../friendica_client.dart';
|
||
|
import '../globals.dart';
|
||
|
import '../models/credentials.dart';
|
||
|
import '../routes.dart';
|
||
|
import '../services/auth_service.dart';
|
||
|
import '../utils/snackbar_builder.dart';
|
||
|
|
||
|
class SignInScreen extends StatelessWidget {
|
||
|
final formKey = GlobalKey<FormState>();
|
||
|
final usernameController = TextEditingController();
|
||
|
final passwordController = TextEditingController();
|
||
|
|
||
|
@override
|
||
|
Widget build(BuildContext context) {
|
||
|
return Scaffold(
|
||
|
appBar: AppBar(
|
||
|
title: Text('Sign In'),
|
||
|
),
|
||
|
body: Padding(
|
||
|
padding: const EdgeInsets.all(20.0),
|
||
|
child: Form(
|
||
|
key: formKey,
|
||
|
child: Center(
|
||
|
child: Column(
|
||
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||
|
children: [
|
||
|
TextFormField(
|
||
|
autovalidateMode: AutovalidateMode.onUserInteraction,
|
||
|
controller: usernameController,
|
||
|
validator: (value) => EmailValidator.validate(value ?? '')
|
||
|
? null
|
||
|
: 'Not a valid Friendica Account Address',
|
||
|
decoration: InputDecoration(
|
||
|
prefixIcon: Icon(Icons.alternate_email),
|
||
|
hintText: 'Username (user@example.com)',
|
||
|
border: OutlineInputBorder(
|
||
|
borderSide: BorderSide(
|
||
|
color: Theme.of(context).backgroundColor,
|
||
|
),
|
||
|
borderRadius: BorderRadius.circular(5.0),
|
||
|
),
|
||
|
labelText: 'Username',
|
||
|
),
|
||
|
),
|
||
|
const VerticalPadding(),
|
||
|
TextFormField(
|
||
|
obscureText: true,
|
||
|
controller: passwordController,
|
||
|
decoration: InputDecoration(
|
||
|
prefixIcon: Icon(Icons.password),
|
||
|
hintText: 'Password',
|
||
|
border: OutlineInputBorder(
|
||
|
borderSide: BorderSide(
|
||
|
color: Theme.of(context).backgroundColor,
|
||
|
),
|
||
|
borderRadius: BorderRadius.circular(5.0),
|
||
|
),
|
||
|
labelText: 'Password',
|
||
|
),
|
||
|
),
|
||
|
const VerticalPadding(),
|
||
|
ElevatedButton(
|
||
|
onPressed: () => _signIn(context),
|
||
|
child: Text('Signin'),
|
||
|
),
|
||
|
],
|
||
|
),
|
||
|
),
|
||
|
),
|
||
|
),
|
||
|
);
|
||
|
}
|
||
|
|
||
|
void _signIn(BuildContext context) async {
|
||
|
if (formKey.currentState?.validate() ?? false) {
|
||
|
print('Attempting login...');
|
||
|
await Credentials.buildFromHandle(
|
||
|
usernameController.text,
|
||
|
passwordController.text,
|
||
|
)
|
||
|
.andThenSuccess((creds) => FriendicaClient(credentials: creds))
|
||
|
.andThenAsync((client) async =>
|
||
|
(await client.getMyProfile()).mapValue((_) => client))
|
||
|
.match(onSuccess: (client) {
|
||
|
print('Logged in');
|
||
|
getIt<AuthService>().updateClient(client);
|
||
|
context.pushNamed(ScreenPaths.home);
|
||
|
}, onError: (error) {
|
||
|
buildSnackbar(context, 'Error logging in: $error');
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
}
|