lemmur-app-android/lib/pages/add_account.dart

153 lines
4.9 KiB
Dart
Raw Normal View History

2020-09-20 00:15:36 +02:00
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
2021-01-24 20:01:55 +01:00
import 'package:lemmy_api_client/v2.dart';
import 'package:url_launcher/url_launcher.dart' as ul;
import '../hooks/delayed_loading.dart';
import '../hooks/stores.dart';
2021-02-27 17:02:55 +01:00
import '../l10n/l10n.dart';
2020-09-20 00:15:36 +02:00
import '../widgets/fullscreenable_image.dart';
2021-02-09 15:12:13 +01:00
import '../widgets/radio_picker.dart';
import 'add_instance.dart';
2020-09-30 19:05:00 +02:00
/// A modal where an account can be added for a given instance
class AddAccountPage extends HookWidget {
final String instanceHost;
final GlobalKey<ScaffoldState> scaffoldKey = GlobalKey();
AddAccountPage({@required this.instanceHost}) : assert(instanceHost != null);
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
2021-02-09 15:12:13 +01:00
final usernameController = useListenable(useTextEditingController());
final passwordController = useListenable(useTextEditingController());
final accountsStore = useAccountsStore();
2020-09-30 19:05:00 +02:00
final loading = useDelayedLoading();
final selectedInstance = useState(instanceHost);
2020-09-20 00:15:36 +02:00
final icon = useState<String>(null);
2021-02-09 15:12:13 +01:00
useEffect(() {
2021-01-24 20:01:55 +01:00
LemmyApiV2(selectedInstance.value)
2021-02-24 20:52:18 +01:00
.run(const GetSite())
2021-01-24 20:01:55 +01:00
.then((site) => icon.value = site.siteView.site.icon);
return null;
}, [selectedInstance.value]);
handleOnAdd() async {
try {
loading.start();
await accountsStore.addAccount(
selectedInstance.value,
usernameController.text,
passwordController.text,
);
Navigator.of(context).pop();
} on Exception catch (err) {
scaffoldKey.currentState.showSnackBar(SnackBar(
content: Text(err.toString()),
));
}
loading.cancel();
}
return Scaffold(
key: scaffoldKey,
appBar: AppBar(
2021-01-03 19:43:39 +01:00
leading: const CloseButton(),
2021-03-03 12:31:36 +01:00
title: const Text('Add account'),
),
2021-02-09 15:12:13 +01:00
body: ListView(
padding: const EdgeInsets.all(15),
2021-02-09 15:12:13 +01:00
children: [
if (icon.value == null)
const SizedBox(height: 150)
else
SizedBox(
height: 150,
child: FullscreenableImage(
url: icon.value,
child: CachedNetworkImage(
imageUrl: icon.value,
errorWidget: (_, __, ___) => const SizedBox.shrink(),
2020-09-20 00:15:36 +02:00
),
),
2021-02-09 15:12:13 +01:00
),
RadioPicker<String>(
2021-03-03 12:31:36 +01:00
title: 'select instance',
2021-02-09 15:12:13 +01:00
values: accountsStore.instances.toList(),
groupValue: selectedInstance.value,
onChanged: (value) => selectedInstance.value = value,
buttonBuilder: (context, displayValue, onPressed) => TextButton(
onPressed: onPressed,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
2021-02-09 15:12:13 +01:00
Text(displayValue),
2021-01-03 19:43:39 +01:00
const Icon(Icons.arrow_drop_down),
],
),
),
2021-02-09 15:12:13 +01:00
trailing: ListTile(
leading: const Padding(
padding: EdgeInsets.all(8),
child: Icon(Icons.add),
),
2021-03-03 12:31:36 +01:00
title: const Text('Add instance'),
2021-02-09 15:12:13 +01:00
onTap: () async {
final value = await showCupertinoModalPopup<String>(
context: context,
builder: (context) => AddInstancePage(),
);
Navigator.of(context).pop(value);
},
),
2021-02-09 15:12:13 +01:00
),
// TODO: add support for password managers
TextField(
autofocus: true,
controller: usernameController,
2021-02-27 17:02:55 +01:00
decoration:
2021-02-28 19:46:27 +01:00
InputDecoration(labelText: L10n.of(context).email_or_username),
2021-02-09 15:12:13 +01:00
),
const SizedBox(height: 5),
TextField(
controller: passwordController,
obscureText: true,
2021-02-27 17:02:55 +01:00
decoration: InputDecoration(labelText: L10n.of(context).password),
2021-02-09 15:12:13 +01:00
),
ElevatedButton(
onPressed: usernameController.text.isEmpty ||
passwordController.text.isEmpty
? null
: loading.pending
? () {}
: handleOnAdd,
child: !loading.loading
2021-03-03 12:31:36 +01:00
? const Text('Sign in')
2021-02-09 15:12:13 +01:00
: SizedBox(
width: 20,
height: 20,
child: CircularProgressIndicator(
valueColor:
AlwaysStoppedAnimation<Color>(theme.canvasColor),
),
),
),
TextButton(
onPressed: () {
2021-02-27 17:02:55 +01:00
// TODO: extract to LemmyUrls or something
2021-02-09 15:12:13 +01:00
ul.launch('https://${selectedInstance.value}/login');
},
2021-03-03 12:31:36 +01:00
child: const Text('Register'),
2021-02-09 15:12:13 +01:00
),
],
),
);
}
}