feat: Settings for stories
parent
3fbd13686c
commit
1c62c26f30
@ -0,0 +1,97 @@
|
||||
//@dart=2.12
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:future_loading_dialog/future_loading_dialog.dart';
|
||||
import 'package:matrix/matrix.dart';
|
||||
|
||||
import 'package:fluffychat/pages/settings_stories/settings_stories_view.dart';
|
||||
import 'package:fluffychat/widgets/matrix.dart';
|
||||
import '../../utils/matrix_sdk_extensions.dart/client_stories_extension.dart';
|
||||
|
||||
class SettingsStories extends StatefulWidget {
|
||||
const SettingsStories({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
SettingsStoriesController createState() => SettingsStoriesController();
|
||||
}
|
||||
|
||||
class SettingsStoriesController extends State<SettingsStories> {
|
||||
final Map<User, bool> users = {};
|
||||
|
||||
Room? _storiesRoom;
|
||||
|
||||
Future<void>? loadUsers;
|
||||
|
||||
bool noStoriesRoom = false;
|
||||
|
||||
Future<void> toggleUser(User user) async {
|
||||
final room = _storiesRoom;
|
||||
if (room == null) return;
|
||||
|
||||
if (users[user] ?? false) {
|
||||
// Kick user from stories room and add to block list
|
||||
final blockList = room.client.storiesBlockList;
|
||||
blockList.add(user.id);
|
||||
await showFutureLoadingDialog(
|
||||
context: context,
|
||||
future: () async {
|
||||
await user.kick();
|
||||
await room.client.setStoriesBlockList(blockList.toSet().toList());
|
||||
setState(() {
|
||||
users[user] = false;
|
||||
});
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
// Invite user to stories room and remove from block list
|
||||
final blockList = room.client.storiesBlockList;
|
||||
blockList.remove(user.id);
|
||||
await showFutureLoadingDialog(
|
||||
context: context,
|
||||
future: () async {
|
||||
await room.client.setStoriesBlockList(blockList);
|
||||
await room.invite(user.id);
|
||||
setState(() {
|
||||
users[user] = true;
|
||||
});
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
Future<void> _loadUsers() async {
|
||||
final room =
|
||||
_storiesRoom = await Matrix.of(context).client.getStoriesRoom(context);
|
||||
if (room == null) {
|
||||
noStoriesRoom = true;
|
||||
return;
|
||||
}
|
||||
final users = await room.requestParticipants();
|
||||
users.removeWhere((u) => u.id == room.client.userID);
|
||||
final contacts = Matrix.of(context)
|
||||
.client
|
||||
.contacts
|
||||
.where((contact) => !users.any((u) => u.id == contact.id));
|
||||
for (final user in contacts) {
|
||||
this.users[user] = false;
|
||||
}
|
||||
for (final user in users) {
|
||||
this.users[user] = true;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
WidgetsBinding.instance?.addPostFrameCallback((_) {
|
||||
setState(() {
|
||||
loadUsers = _loadUsers();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) => SettingsStoriesView(this);
|
||||
}
|
@ -0,0 +1,49 @@
|
||||
//@dart=2.12
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:fluffychat/pages/settings_stories/settings_stories.dart';
|
||||
import 'package:fluffychat/utils/localized_exception_extension.dart';
|
||||
import 'package:fluffychat/widgets/avatar.dart';
|
||||
|
||||
class SettingsStoriesView extends StatelessWidget {
|
||||
final SettingsStoriesController controller;
|
||||
const SettingsStoriesView(this.controller, {Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(),
|
||||
body: FutureBuilder(
|
||||
future: controller.loadUsers,
|
||||
builder: (context, snapshot) {
|
||||
final error = snapshot.error;
|
||||
if (error != null) {
|
||||
return Center(child: Text(error.toLocalizedString(context)));
|
||||
}
|
||||
if (snapshot.connectionState != ConnectionState.done) {
|
||||
return const Center(
|
||||
child: CircularProgressIndicator.adaptive(
|
||||
strokeWidth: 2,
|
||||
));
|
||||
}
|
||||
return ListView.builder(
|
||||
itemCount: controller.users.length,
|
||||
itemBuilder: (context, i) {
|
||||
final user = controller.users.keys.toList()[i];
|
||||
return SwitchListTile.adaptive(
|
||||
value: controller.users[user] ?? false,
|
||||
onChanged: (_) => controller.toggleUser(user),
|
||||
secondary: Avatar(
|
||||
mxContent: user.avatarUrl,
|
||||
name: user.calcDisplayname(),
|
||||
),
|
||||
title: Text(user.calcDisplayname()),
|
||||
);
|
||||
},
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue