Encrypted messaging app
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

90 lines
2.6 KiB

  1. import 'package:Envelope/database/repositories/conversations_repository.dart';
  2. import 'package:flutter/material.dart';
  3. import '/components/custom_circle_avatar.dart';
  4. import '/components/flash_message.dart';
  5. import '/database/models/conversations.dart';
  6. import '/database/models/friends.dart';
  7. import '/services/conversations_service.dart';
  8. import '/utils/strings.dart';
  9. import '/views/main/conversation/detail.dart';
  10. class FriendListItem extends StatefulWidget{
  11. final Friend friend;
  12. const FriendListItem({
  13. Key? key,
  14. required this.friend,
  15. }) : super(key: key);
  16. @override
  17. _FriendListItemState createState() => _FriendListItemState();
  18. }
  19. class _FriendListItemState extends State<FriendListItem> {
  20. @override
  21. Widget build(BuildContext context) {
  22. return GestureDetector(
  23. behavior: HitTestBehavior.opaque,
  24. onTap: () {
  25. findOrCreateConversation(context);
  26. },
  27. child: Container(
  28. padding: const EdgeInsets.only(left: 16,right: 16,top: 0,bottom: 20),
  29. child: Row(
  30. children: <Widget>[
  31. Expanded(
  32. child: Row(
  33. children: <Widget>[
  34. CustomCircleAvatar(
  35. initials: widget.friend.username[0].toUpperCase(),
  36. ),
  37. const SizedBox(width: 16),
  38. Expanded(
  39. child: Align(
  40. alignment: Alignment.centerLeft,
  41. child: Container(
  42. color: Colors.transparent,
  43. child: Column(
  44. crossAxisAlignment: CrossAxisAlignment.start,
  45. children: <Widget>[
  46. Text(widget.friend.username, style: const TextStyle(fontSize: 16)),
  47. ],
  48. ),
  49. ),
  50. ),
  51. ),
  52. ],
  53. ),
  54. ),
  55. ],
  56. ),
  57. ),
  58. );
  59. }
  60. Future<void> findOrCreateConversation(BuildContext context) async {
  61. Conversation? conversation = await ConversationsRepository.getTwoUserConversation(widget.friend.friendId);
  62. conversation ??= await ConversationsRepository.createConversation(
  63. generateRandomString(32),
  64. [ widget.friend ],
  65. true,
  66. );
  67. ConversationsService.uploadConversation(conversation)
  68. .catchError((dynamic d) async {
  69. showMessage('Failed to create conversation', context);
  70. });
  71. if (!mounted) {
  72. return;
  73. }
  74. Navigator.push(context, MaterialPageRoute(builder: (context){
  75. return ConversationDetail(
  76. conversation: conversation!,
  77. );
  78. }));
  79. }
  80. }