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()))
|
||
|
]),
|
||
|
],
|
||
|
),
|
||
|
);
|
||
|
}
|
||
|
}
|