Force well-known checks, updated welcome screen

This commit is contained in:
Inex Code 2020-06-13 22:38:12 +03:00
parent d6379a9189
commit d4d9a28067
2 changed files with 115 additions and 37 deletions

View file

@ -1,13 +1,20 @@
import 'dart:math'; import 'dart:math';
import 'package:famedlysdk/matrix_api/model/well_known_informations.dart';
import 'package:fluffychat/components/dialogs/simple_dialogs.dart'; import 'package:fluffychat/components/dialogs/simple_dialogs.dart';
import 'package:fluffychat/components/matrix.dart'; import 'package:fluffychat/components/matrix.dart';
import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/l10n/l10n.dart';
import 'package:fluffychat/utils/app_route.dart'; import 'package:fluffychat/utils/app_route.dart';
import 'package:fluffychat/views/login.dart';
import 'package:fluffychat/views/sign_up.dart'; import 'package:fluffychat/views/sign_up.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class HomeserverPicker extends StatelessWidget { class HomeserverPicker extends StatefulWidget {
@override
_HomeserverPickerState createState() => _HomeserverPickerState();
}
class _HomeserverPickerState extends State<HomeserverPicker> {
Future<void> _setHomeserverAction(BuildContext context) async { Future<void> _setHomeserverAction(BuildContext context) async {
final homeserver = await SimpleDialogs(context).enterText( final homeserver = await SimpleDialogs(context).enterText(
titleText: L10n.of(context).enterYourHomeserver, titleText: L10n.of(context).enterYourHomeserver,
@ -18,15 +25,69 @@ class HomeserverPicker extends StatelessWidget {
} }
void _checkHomeserverAction(String homeserver, BuildContext context) async { void _checkHomeserverAction(String homeserver, BuildContext context) async {
if (!homeserver.startsWith('https://')) { if (!_isMXID && !homeserver.startsWith('https://')) {
homeserver = 'https://$homeserver'; homeserver = 'https://$homeserver';
} }
WellKnownInformations wellknown;
if (_isMXID) {
if (!homeserver.startsWith('@')) {
homeserver = '@$homeserver';
}
wellknown = await SimpleDialogs(context).tryRequestWithLoadingDialog(
Matrix.of(context)
.client
.getWellKnownInformationsByUserId(homeserver));
final success = await SimpleDialogs(context).tryRequestWithLoadingDialog( final success = await SimpleDialogs(context).tryRequestWithLoadingDialog(
Matrix.of(context).client.checkServer(homeserver)); Matrix.of(context).client.checkServer(wellknown.mHomeserver != null
? 'https://${Uri.parse(wellknown.mHomeserver.baseUrl).host}'
: homeserver));
if (success != false) {
await Navigator.of(context).push(AppRoute(Login(
username: homeserver,
)));
}
} else {
wellknown = await SimpleDialogs(context).tryRequestWithLoadingDialog(
Matrix.of(context)
.client
.getWellKnownInformationsByDomain(homeserver));
final success = await SimpleDialogs(context).tryRequestWithLoadingDialog(
Matrix.of(context).client.checkServer(wellknown.mHomeserver != null
? 'https://${Uri.parse(wellknown.mHomeserver.baseUrl).host}'
: homeserver));
if (success != false) { if (success != false) {
await Navigator.of(context).push(AppRoute(SignUp())); await Navigator.of(context).push(AppRoute(SignUp()));
} }
} }
}
final textController = TextEditingController();
bool _isMXID = false;
void _checkInputType() {
if (textController.text.contains(':')) {
setState(() {
_isMXID = true;
});
} else {
setState(() {
_isMXID = false;
});
}
}
@override
void initState() {
super.initState();
textController.addListener(_checkInputType);
}
@override
void dispose() {
textController.dispose();
super.dispose();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -40,7 +101,15 @@ class HomeserverPicker extends StatelessWidget {
children: <Widget>[ children: <Widget>[
Hero( Hero(
tag: 'loginBanner', tag: 'loginBanner',
child: Image.asset('assets/fluffychat-banner.png'), child: Center(
child: Padding(
padding: const EdgeInsets.fromLTRB(0.0, 32.0, 0.0, 18.0),
child: Text(
L10n.of(context).fluffychat,
style: TextStyle(fontSize: 28.0),
),
),
),
), ),
Padding( Padding(
padding: const EdgeInsets.all(16.0), padding: const EdgeInsets.all(16.0),
@ -53,6 +122,23 @@ class HomeserverPicker extends StatelessWidget {
), ),
), ),
Spacer(), Spacer(),
Padding(
padding: const EdgeInsets.all(16.0),
child: TextField(
controller: textController,
onSubmitted: (s) {
_checkHomeserverAction(s, context);
},
decoration: InputDecoration(
icon: (_isMXID
? Icon(Icons.person_outline)
: Icon(Icons.business)),
labelText: L10n.of(context).homeserverOrMXID,
border: OutlineInputBorder(),
),
),
),
Spacer(),
Hero( Hero(
tag: 'loginButton', tag: 'loginButton',
child: Container( child: Container(
@ -66,40 +152,14 @@ class HomeserverPicker extends StatelessWidget {
borderRadius: BorderRadius.circular(6), borderRadius: BorderRadius.circular(6),
), ),
child: Text( child: Text(
L10n.of(context).connect.toUpperCase(), (_isMXID ? L10n.of(context).login.toUpperCase() : L10n.of(context).connect.toUpperCase()),
style: TextStyle(color: Colors.white, fontSize: 16), style: TextStyle(color: Colors.white, fontSize: 16),
), ),
onPressed: () => _checkHomeserverAction( onPressed: () =>
Matrix.defaultHomeserver, context), _checkHomeserverAction(textController.text, context),
), ),
), ),
), ),
Padding(
padding:
const EdgeInsets.only(left: 16.0, right: 16.0, top: 16.0),
child: Opacity(
opacity: 0.75,
child: Text(
L10n.of(context).byDefaultYouWillBeConnectedTo(
Matrix.defaultHomeserver),
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 16,
),
),
),
),
FlatButton(
child: Text(
L10n.of(context).changeTheHomeserver,
style: TextStyle(
decoration: TextDecoration.underline,
color: Colors.blue,
fontSize: 16,
),
),
onPressed: () => _setHomeserverAction(context),
),
SizedBox(height: 16), SizedBox(height: 16),
], ],
), ),

View file

@ -13,6 +13,10 @@ import 'package:flutter/material.dart';
import 'chat_list.dart'; import 'chat_list.dart';
class Login extends StatefulWidget { class Login extends StatefulWidget {
Login({Key key, String this.username: null}) : super(key:key);
final String username;
@override @override
_LoginState createState() => _LoginState(); _LoginState createState() => _LoginState();
} }
@ -101,6 +105,19 @@ class _LoginState extends State<Login> {
} }
} }
@override
void initState() {
super.initState();
usernameController.text = widget?.username;
}
@override
void dispose() {
usernameController.dispose();
passwordController.dispose();
super.dispose();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
@ -130,7 +147,7 @@ class _LoginState extends State<Login> {
title: TextField( title: TextField(
readOnly: loading, readOnly: loading,
autocorrect: false, autocorrect: false,
autofocus: true, autofocus: widget.username != null ? false : true,
onChanged: (t) => _checkWellKnownWithCoolDown(t, context), onChanged: (t) => _checkWellKnownWithCoolDown(t, context),
controller: usernameController, controller: usernameController,
decoration: InputDecoration( decoration: InputDecoration(
@ -150,6 +167,7 @@ class _LoginState extends State<Login> {
title: TextField( title: TextField(
readOnly: loading, readOnly: loading,
autocorrect: false, autocorrect: false,
autofocus: widget.username != null ? true : false,
controller: passwordController, controller: passwordController,
obscureText: !showPassword, obscureText: !showPassword,
onSubmitted: (t) => login(context), onSubmitted: (t) => login(context),