fluffychat/lib/components/dialogs/simple_dialogs.dart

183 lines
5.3 KiB
Dart
Raw Normal View History

2020-05-07 07:52:40 +02:00
import 'package:fluffychat/l10n/l10n.dart';
import 'package:flutter/material.dart';
2020-04-27 13:36:39 +02:00
import 'package:famedlysdk/famedlysdk.dart';
2020-05-13 10:45:50 +02:00
import 'package:bot_toast/bot_toast.dart';
class SimpleDialogs {
final BuildContext context;
const SimpleDialogs(this.context);
Future<String> enterText(
{String titleText,
String confirmText,
String cancelText,
String hintText,
String labelText,
String prefixText,
String suffixText,
bool password = false,
bool multiLine = false,
TextInputType keyboardType}) async {
2020-05-13 15:58:59 +02:00
var textEditingController = TextEditingController();
final controller = textEditingController;
2020-02-16 09:56:17 +01:00
String input;
await showDialog(
context: context,
builder: (c) => AlertDialog(
2020-04-27 13:36:39 +02:00
title: Text(titleText ?? 'Please enter a text'),
2020-02-16 09:56:17 +01:00
content: TextField(
controller: controller,
autofocus: true,
2020-04-08 17:43:07 +02:00
autocorrect: false,
2020-02-16 09:56:17 +01:00
onSubmitted: (s) {
input = s;
Navigator.of(context).pop();
},
2020-02-16 11:09:28 +01:00
minLines: multiLine ? 3 : 1,
maxLines: multiLine ? 3 : 1,
2020-02-19 16:23:13 +01:00
obscureText: password,
2020-02-16 11:09:28 +01:00
textInputAction: multiLine ? TextInputAction.newline : null,
keyboardType: keyboardType,
2020-02-16 09:56:17 +01:00
decoration: InputDecoration(
hintText: hintText,
labelText: labelText,
2020-02-16 11:09:28 +01:00
prefixText: prefixText,
suffixText: suffixText,
2020-02-16 11:36:18 +01:00
prefixStyle: TextStyle(color: Theme.of(context).primaryColor),
suffixStyle: TextStyle(color: Theme.of(context).primaryColor),
2020-02-16 09:56:17 +01:00
border: OutlineInputBorder(),
),
),
actions: <Widget>[
FlatButton(
2020-02-16 11:36:18 +01:00
child: Text(
cancelText?.toUpperCase() ??
2020-05-07 07:52:40 +02:00
L10n.of(context).close.toUpperCase(),
2020-02-16 09:56:17 +01:00
style: TextStyle(color: Colors.blueGrey)),
onPressed: () => Navigator.of(context).pop(),
),
FlatButton(
child: Text(
2020-02-16 11:36:18 +01:00
confirmText?.toUpperCase() ??
2020-05-07 07:52:40 +02:00
L10n.of(context).confirm.toUpperCase(),
2020-02-16 09:56:17 +01:00
),
onPressed: () {
input = controller.text;
Navigator.of(context).pop();
},
),
],
),
);
return input;
}
Future<bool> askConfirmation({
String titleText,
2020-02-22 08:27:08 +01:00
String contentText,
String confirmText,
String cancelText,
}) async {
2020-05-13 15:58:59 +02:00
var confirmed = false;
await showDialog(
context: context,
builder: (c) => AlertDialog(
2020-05-07 07:52:40 +02:00
title: Text(titleText ?? L10n.of(context).areYouSure),
2020-02-22 08:27:08 +01:00
content: contentText != null ? Text(contentText) : null,
actions: <Widget>[
FlatButton(
2020-02-16 11:36:18 +01:00
child: Text(
cancelText?.toUpperCase() ??
2020-05-07 07:52:40 +02:00
L10n.of(context).close.toUpperCase(),
style: TextStyle(color: Colors.blueGrey)),
onPressed: () => Navigator.of(context).pop(),
),
FlatButton(
child: Text(
2020-02-16 11:36:18 +01:00
confirmText?.toUpperCase() ??
2020-05-07 07:52:40 +02:00
L10n.of(context).confirm.toUpperCase(),
),
onPressed: () {
confirmed = true;
Navigator.of(context).pop();
},
),
],
),
);
return confirmed;
}
2020-04-27 13:36:39 +02:00
2020-05-12 09:02:33 +02:00
Future<void> inform({
String titleText,
String contentText,
String okText,
}) async {
await showDialog(
context: context,
builder: (c) => AlertDialog(
title: titleText != null ? Text(titleText) : null,
content: contentText != null ? Text(contentText) : null,
2020-05-13 10:45:50 +02:00
actions: <Widget>[
2020-05-12 09:02:33 +02:00
FlatButton(
child: Text(
okText ?? L10n.of(context).ok.toUpperCase(),
),
onPressed: () {
Navigator.of(context).pop();
},
),
],
),
);
}
2020-04-27 13:36:39 +02:00
Future<dynamic> tryRequestWithLoadingDialog(Future<dynamic> request,
{Function(MatrixException) onAdditionalAuth}) async {
showLoadingDialog(context);
final dynamic = await tryRequestWithErrorToast(request,
onAdditionalAuth: onAdditionalAuth);
Navigator.of(context)?.pop();
return dynamic;
}
Future<dynamic> tryRequestWithErrorToast(Future<dynamic> request,
{Function(MatrixException) onAdditionalAuth}) async {
try {
return await request;
} on MatrixException catch (exception) {
if (exception.requireAdditionalAuthentication &&
onAdditionalAuth != null) {
return await tryRequestWithErrorToast(onAdditionalAuth(exception));
} else {
2020-05-13 10:45:50 +02:00
BotToast.showText(text: exception.errorMessage);
2020-04-27 13:36:39 +02:00
}
} catch (exception) {
2020-05-13 10:45:50 +02:00
BotToast.showText(text: exception.toString());
2020-04-27 13:36:39 +02:00
return false;
}
}
2020-05-13 15:58:59 +02:00
void showLoadingDialog(BuildContext context) async {
await showDialog(
2020-04-27 13:36:39 +02:00
context: context,
barrierDismissible: false,
builder: (BuildContext context) => AlertDialog(
content: Row(
children: <Widget>[
CircularProgressIndicator(),
SizedBox(width: 16),
2020-06-18 13:39:24 +02:00
Expanded(
child: Text(
L10n.of(context).loadingPleaseWait,
overflow: TextOverflow.ellipsis,
maxLines: 1,
)),
2020-04-27 13:36:39 +02:00
],
),
),
);
}
}