147 lines
4.6 KiB
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()))
|
|
]),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
}
|