loris/lib/dialogues/followreqs.dart

147 lines
4.6 KiB
Dart

import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:localization/localization.dart';
import 'package:loris/business_logic/account/account.dart';
import 'package:loris/business_logic/follow_request/followrequest.dart';
import 'package:loris/global.dart' as global;
import 'package:loris/partials/post.dart';
import 'package:loris/themes/themes.dart' as themes;
class FollowReqScreen extends StatefulWidget {
const FollowReqScreen({super.key});
@override
State<FollowReqScreen> createState() => _FollowReqScreenState();
}
class _FollowReqScreenState extends State<FollowReqScreen> {
List<AccountModel> requests = [];
bool loading = true;
Future<void> fetchRequests() async {
final results = await getFollowRequests();
if (mounted) {
setState(() {
requests = results;
loading = false;
});
}
}
@override
void initState() {
fetchRequests();
super.initState();
}
void handleFailure(RelationshipModel? model) {}
void updateList(AccountModel model) {
if (mounted) {
setState(() {
requests.remove(model);
});
}
}
@override
Widget build(BuildContext context) {
return BackdropFilter(
filter:
ImageFilter.blur(sigmaX: 10, sigmaY: 10, tileMode: TileMode.mirror),
child: SimpleDialog(
titlePadding: EdgeInsets.fromLTRB(0, themes.defaultRadius.x, 0, 0),
title: loading ? const LinearProgressIndicator() : null,
contentPadding: const EdgeInsets.all(0),
children: [
Container(
width: global.getWidth(context),
height: MediaQuery.of(context).size.height * 2 / 3,
constraints: global.getConstraints(context),
child: ListView.separated(
itemBuilder: (context, index) {
final account = requests[index];
return FollowRequestDisplay(
account: account,
accept: () async {
if (mounted) {
setState(() {
loading = true;
});
}
final result = await handleFollowRequest(account);
handleFailure(result);
if (result != null) {
updateList(account);
}
if (mounted) {
setState(() {
loading = false;
});
}
},
deny: (() async {
if (mounted) {
setState(() {
loading = true;
});
}
final result =
await handleFollowRequest(account, deny: true);
handleFailure(result);
if (result != null) {
updateList(account);
}
if (mounted) {
setState(() {
loading = false;
});
}
}),
);
},
separatorBuilder: (context, index) =>
Divider(color: Theme.of(context).hintColor),
itemCount: requests.length),
)
],
));
}
}
class FollowRequestDisplay extends StatelessWidget {
const FollowRequestDisplay(
{super.key,
required this.deny,
required this.accept,
required this.account});
final void Function()? deny;
final void Function()? accept;
final AccountModel account;
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(8.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
DisplayName(account: account),
SelectableText("${"requested-to-follow".i18n()} ${account.identity}"),
Wrap(alignment: WrapAlignment.spaceBetween, children: [
TextButton.icon(
onPressed: deny,
icon: const Icon(Icons.do_not_disturb_alt_outlined),
label: Text("deny".i18n())),
TextButton.icon(
onPressed: accept,
icon: const Icon(Icons.check),
label: Text("accept".i18n()))
]),
],
),
);
}
}