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 createState() => _FollowReqScreenState(); } class _FollowReqScreenState extends State { List requests = []; bool loading = true; Future 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())) ]), ], ), ); } }