mirror of
https://gitlab.com/famedly/fluffychat.git
synced 2024-11-27 23:09:35 +01:00
change: Place backup hint banner in chat list
This commit is contained in:
parent
3993984a2b
commit
3b7144d805
@ -1238,6 +1238,11 @@
|
|||||||
"type": "text",
|
"type": "text",
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
},
|
},
|
||||||
|
"enableChatBackup": "Enable the chat backup to never lose access to your chats.",
|
||||||
|
"@enableChatBackup": {
|
||||||
|
"type": "text",
|
||||||
|
"placeholders": {}
|
||||||
|
},
|
||||||
"pleaseChoose": "Please choose",
|
"pleaseChoose": "Please choose",
|
||||||
"@pleaseChoose": {
|
"@pleaseChoose": {
|
||||||
"type": "text",
|
"type": "text",
|
||||||
|
@ -21,6 +21,8 @@ import '../utils/matrix_sdk_extensions.dart/matrix_file_extension.dart';
|
|||||||
import '../utils/url_launcher.dart';
|
import '../utils/url_launcher.dart';
|
||||||
import 'package:flutter_gen/gen_l10n/l10n.dart';
|
import 'package:flutter_gen/gen_l10n/l10n.dart';
|
||||||
|
|
||||||
|
import 'bootstrap_dialog.dart';
|
||||||
|
|
||||||
enum SelectMode { normal, share, select }
|
enum SelectMode { normal, share, select }
|
||||||
enum PopupMenuAction { settings, invite, newGroup, setStatus, archive }
|
enum PopupMenuAction { settings, invite, newGroup, setStatus, archive }
|
||||||
|
|
||||||
@ -39,6 +41,20 @@ class ChatListController extends State<ChatList> {
|
|||||||
StreamSubscription _intentUriStreamSubscription;
|
StreamSubscription _intentUriStreamSubscription;
|
||||||
|
|
||||||
final selectedRoomIds = <String>{};
|
final selectedRoomIds = <String>{};
|
||||||
|
Future<bool> crossSigningCachedFuture;
|
||||||
|
bool crossSigningCached;
|
||||||
|
bool hideChatBackupBanner = false;
|
||||||
|
|
||||||
|
void hideChatBackupBannerAction() =>
|
||||||
|
setState(() => hideChatBackupBanner = true);
|
||||||
|
|
||||||
|
void firstRunBootstrapAction() async {
|
||||||
|
hideChatBackupBannerAction();
|
||||||
|
await BootstrapDialog(
|
||||||
|
client: Matrix.of(context).client,
|
||||||
|
).show(context);
|
||||||
|
VRouter.of(context).push('/rooms');
|
||||||
|
}
|
||||||
|
|
||||||
String get activeChat => VRouter.of(context).pathParameters['roomid'];
|
String get activeChat => VRouter.of(context).pathParameters['roomid'];
|
||||||
|
|
||||||
@ -250,6 +266,15 @@ class ChatListController extends State<ChatList> {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
Matrix.of(context).navigatorContext = context;
|
Matrix.of(context).navigatorContext = context;
|
||||||
|
crossSigningCachedFuture ??= Matrix.of(context)
|
||||||
|
.client
|
||||||
|
.encryption
|
||||||
|
?.crossSigning
|
||||||
|
?.isCached()
|
||||||
|
?.then((c) {
|
||||||
|
if (mounted) setState(() => crossSigningCached = c);
|
||||||
|
return c;
|
||||||
|
});
|
||||||
return ChatListView(this);
|
return ChatListView(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,7 +13,6 @@ import 'package:flutter_app_lock/flutter_app_lock.dart';
|
|||||||
import 'package:flutter_gen/gen_l10n/l10n.dart';
|
import 'package:flutter_gen/gen_l10n/l10n.dart';
|
||||||
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
|
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
|
||||||
import 'package:image_picker/image_picker.dart';
|
import 'package:image_picker/image_picker.dart';
|
||||||
import 'package:vrouter/vrouter.dart';
|
|
||||||
|
|
||||||
import 'views/settings_view.dart';
|
import 'views/settings_view.dart';
|
||||||
import 'package:future_loading_dialog/future_loading_dialog.dart';
|
import 'package:future_loading_dialog/future_loading_dialog.dart';
|
||||||
@ -377,13 +376,6 @@ class SettingsController extends State<Settings> {
|
|||||||
).show(context);
|
).show(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
void firstRunBootstrapAction() async {
|
|
||||||
await BootstrapDialog(
|
|
||||||
client: Matrix.of(context).client,
|
|
||||||
).show(context);
|
|
||||||
VRouter.of(context).push('/rooms');
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final client = Matrix.of(context).client;
|
final client = Matrix.of(context).client;
|
||||||
|
@ -194,23 +194,73 @@ class ChatListView extends StatelessWidget {
|
|||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
final totalCount = rooms.length;
|
final totalCount = rooms.length + 1;
|
||||||
return ListView.builder(
|
return ListView.builder(
|
||||||
itemCount: totalCount,
|
itemCount: totalCount,
|
||||||
itemBuilder: (BuildContext context, int i) =>
|
itemBuilder: (BuildContext context, int i) {
|
||||||
ChatListItem(
|
if (i == 0) {
|
||||||
rooms[i],
|
return FutureBuilder(
|
||||||
selected: controller.selectedRoomIds
|
future: controller
|
||||||
.contains(rooms[i].id),
|
.crossSigningCachedFuture,
|
||||||
onTap: selectMode == SelectMode.select
|
builder: (context, snapshot) {
|
||||||
? () => controller
|
final needsBootstrap =
|
||||||
.toggleSelection(rooms[i].id)
|
Matrix.of(context)
|
||||||
: null,
|
.client
|
||||||
onLongPress: () =>
|
.encryption
|
||||||
controller.toggleSelection(rooms[i].id),
|
?.crossSigning
|
||||||
activeChat:
|
?.enabled ==
|
||||||
controller.activeChat == rooms[i].id,
|
false ||
|
||||||
),
|
snapshot.data == false;
|
||||||
|
final isUnknownSession =
|
||||||
|
Matrix.of(context)
|
||||||
|
.client
|
||||||
|
.isUnknownSession;
|
||||||
|
final displayHeader =
|
||||||
|
needsBootstrap ||
|
||||||
|
isUnknownSession;
|
||||||
|
if (!displayHeader ||
|
||||||
|
controller
|
||||||
|
.hideChatBackupBanner) {
|
||||||
|
return Container();
|
||||||
|
}
|
||||||
|
return Material(
|
||||||
|
color: Colors.orange,
|
||||||
|
child: ListTile(
|
||||||
|
leading: CircleAvatar(
|
||||||
|
backgroundColor: Colors.white,
|
||||||
|
foregroundColor: Colors.black,
|
||||||
|
child: Icon(Icons.cloud),
|
||||||
|
),
|
||||||
|
trailing: IconButton(
|
||||||
|
icon: Icon(Icons.close),
|
||||||
|
onPressed: controller
|
||||||
|
.hideChatBackupBannerAction,
|
||||||
|
),
|
||||||
|
title: Text(L10n.of(context)
|
||||||
|
.chatBackup),
|
||||||
|
subtitle: Text(L10n.of(context)
|
||||||
|
.enableChatBackup),
|
||||||
|
onTap: controller
|
||||||
|
.firstRunBootstrapAction,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
i--;
|
||||||
|
return ChatListItem(
|
||||||
|
rooms[i],
|
||||||
|
selected: controller.selectedRoomIds
|
||||||
|
.contains(rooms[i].id),
|
||||||
|
onTap: selectMode == SelectMode.select
|
||||||
|
? () => controller
|
||||||
|
.toggleSelection(rooms[i].id)
|
||||||
|
: null,
|
||||||
|
onLongPress: () => controller
|
||||||
|
.toggleSelection(rooms[i].id),
|
||||||
|
activeChat:
|
||||||
|
controller.activeChat == rooms[i].id,
|
||||||
|
);
|
||||||
|
},
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
return Center(
|
return Center(
|
||||||
|
@ -36,31 +36,6 @@ class SettingsView extends StatelessWidget {
|
|||||||
floating: true,
|
floating: true,
|
||||||
pinned: true,
|
pinned: true,
|
||||||
title: Text(L10n.of(context).settings),
|
title: Text(L10n.of(context).settings),
|
||||||
actions: [
|
|
||||||
FutureBuilder(
|
|
||||||
future: controller.crossSigningCachedFuture,
|
|
||||||
builder: (context, snapshot) {
|
|
||||||
final needsBootstrap = Matrix.of(context)
|
|
||||||
.client
|
|
||||||
.encryption
|
|
||||||
?.crossSigning
|
|
||||||
?.enabled ==
|
|
||||||
false ||
|
|
||||||
snapshot.data == false;
|
|
||||||
final isUnknownSession =
|
|
||||||
Matrix.of(context).client.isUnknownSession;
|
|
||||||
final displayHeader = needsBootstrap || isUnknownSession;
|
|
||||||
if (!displayHeader) return Container();
|
|
||||||
return TextButton.icon(
|
|
||||||
icon: Icon(Icons.cloud, color: Colors.red),
|
|
||||||
label: Text(
|
|
||||||
L10n.of(context).chatBackup,
|
|
||||||
style: TextStyle(color: Colors.red),
|
|
||||||
),
|
|
||||||
onPressed: controller.firstRunBootstrapAction,
|
|
||||||
);
|
|
||||||
}),
|
|
||||||
],
|
|
||||||
backgroundColor: Theme.of(context).appBarTheme.color,
|
backgroundColor: Theme.of(context).appBarTheme.color,
|
||||||
flexibleSpace: FlexibleSpaceBar(
|
flexibleSpace: FlexibleSpaceBar(
|
||||||
background: ContentBanner(
|
background: ContentBanner(
|
||||||
|
Loading…
Reference in New Issue
Block a user