New friendship

This commit is contained in:
LittleSheep 2024-04-25 23:32:03 +08:00
parent 5346224f1e
commit 47c10a180a
3 changed files with 87 additions and 0 deletions

View File

@ -36,6 +36,9 @@
"friendActive": "Active",
"friendBlocked": "Blocked",
"friendListHint": "Swipe left to decline, swipe right to approve",
"friendAdd": "Add friend",
"friendAddHint": "Use your their username to send a friend request to your best friend!",
"friendAddDone": "Friend request sent, go reach your friend!",
"reaction": "Reaction",
"reactVerb": "React",
"post": "Post",

View File

@ -36,6 +36,9 @@
"friendActive": "活跃的好友",
"friendBlocked": "封锁中",
"friendListHint": "左滑来拒绝,右滑来接受",
"friendAdd": "添加好友",
"friendAddHint": "使用用户名来给你的好朋友发一个好友请求吧!",
"friendAddDone": "好友请求已发送,快告诉你的朋友吧!",
"reaction": "反应",
"reactVerb": "作出反应",
"post": "帖子",

View File

@ -46,6 +46,30 @@ class _FriendScreenState extends State<FriendScreen> {
}
}
Future<void> createFriendship(String username) async {
setState(() => _isSubmitting = true);
final auth = context.read<AuthProvider>();
if (!await auth.isAuthorized()) {
setState(() => _isSubmitting = false);
return;
}
var res = await auth.client!.post(
getRequestUri('passport', '/api/users/me/friends?related=$username'),
);
if (res.statusCode == 200) {
await fetchFriendships();
} else {
var message = utf8.decode(res.bodyBytes);
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text("Something went wrong... $message")),
);
}
setState(() => _isSubmitting = false);
}
Future<void> updateFriendship(Friendship relation, int status) async {
setState(() => _isSubmitting = true);
@ -67,6 +91,9 @@ class _FriendScreenState extends State<FriendScreen> {
}),
);
if (res.statusCode == 200) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(AppLocalizations.of(context)!.friendAddDone)),
);
await fetchFriendships();
} else {
var message = utf8.decode(res.bodyBytes);
@ -78,6 +105,54 @@ class _FriendScreenState extends State<FriendScreen> {
setState(() => _isSubmitting = false);
}
void promptAddFriend() async {
final controller = TextEditingController();
final input = await showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: Text(AppLocalizations.of(context)!.friendAdd),
content: Column(
mainAxisSize: MainAxisSize.min,
children: [
Text(AppLocalizations.of(context)!.friendAddHint),
const SizedBox(height: 18),
TextField(
controller: controller,
decoration: InputDecoration(
isDense: true,
prefixIcon: const Icon(Icons.account_circle),
border: const OutlineInputBorder(),
labelText: AppLocalizations.of(context)!.username,
),
onTapOutside: (_) => FocusManager.instance.primaryFocus?.unfocus(),
),
],
),
actions: <Widget>[
TextButton(
style: TextButton.styleFrom(
foregroundColor: Theme.of(context).colorScheme.onSurface.withOpacity(0.8),
),
onPressed: () => Navigator.pop(context),
child: Text(AppLocalizations.of(context)!.cancel),
),
TextButton(
child: Text(AppLocalizations.of(context)!.next),
onPressed: () {
Navigator.pop(context, controller.text);
},
),
],
);
},
);
WidgetsBinding.instance.addPostFrameCallback((_) => controller.dispose());
await createFriendship(input);
}
List<Friendship> filterWithStatus(int status) {
return _friendships.where((x) => x.status == status).toList();
}
@ -153,6 +228,12 @@ class _FriendScreenState extends State<FriendScreen> {
return IndentWrapper(
title: AppLocalizations.of(context)!.friend,
appBarActions: [
IconButton(
icon: const Icon(Icons.add),
onPressed: () => promptAddFriend(),
),
],
child: RefreshIndicator(
onRefresh: () => fetchFriendships(),
child: CustomScrollView(