This repository has been archived on 2025-11-26. You can view files and clone it, but cannot push or open issues or pull requests.
OpenContacts/lib/widgets/friends/user_list_tile.dart
2024-01-27 15:39:33 +01:00

94 lines
3.1 KiB
Dart

import 'package:provider/provider.dart';
import 'package:recon/auxiliary.dart';
import 'package:recon/clients/messaging_client.dart';
import 'package:recon/models/users/user.dart';
import 'package:recon/widgets/generic_avatar.dart';
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
class UserListTile extends StatefulWidget {
const UserListTile({
required this.user,
required this.isFriend,
required this.onChanged,
super.key,
});
final User user;
final bool isFriend;
final Function()? onChanged;
@override
State<UserListTile> createState() => _UserListTileState();
}
class _UserListTileState extends State<UserListTile> {
final DateFormat _regDateFormat = DateFormat.yMMMMd('en_US');
late bool _localAdded = widget.isFriend;
bool _loading = false;
@override
Widget build(BuildContext context) {
final colorScheme = Theme.of(context).colorScheme;
final style = _localAdded
? IconButton.styleFrom(
foregroundColor: colorScheme.onBackground,
side: BorderSide(color: colorScheme.error, width: 2),
)
: IconButton.styleFrom(
foregroundColor: colorScheme.onBackground,
side: BorderSide(color: colorScheme.primary, width: 2),
);
return ListTile(
leading: GenericAvatar(
imageUri: Aux.resdbToHttp(widget.user.userProfile?.iconUrl),
),
title: Text(widget.user.username),
subtitle: Text(_regDateFormat.format(widget.user.registrationDate)),
trailing: IconButton(
splashRadius: 24,
iconSize: 20,
icon: _localAdded ? const Icon(Icons.person_remove) : const Icon(Icons.person_add),
style: style,
onPressed: _loading
? null
: () async {
final mClient = Provider.of<MessagingClient>(context, listen: false);
setState(() {
_loading = true;
});
try {
if (_localAdded) {
mClient.removeUserAsFriend(widget.user);
} else {
mClient.addUserAsFriend(widget.user);
}
setState(() {
_loading = false;
_localAdded = !_localAdded;
});
widget.onChanged?.call();
} catch (e, s) {
FlutterError.reportError(FlutterErrorDetails(exception: e, stack: s));
if (context.mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
duration: const Duration(seconds: 5),
content: Text(
"Something went wrong: $e",
softWrap: true,
maxLines: null,
),
),
);
}
setState(() {
_loading = false;
});
return;
}
},
),
);
}
}