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.

175 lines
5.2 KiB

  1. import 'dart:io';
  2. import 'package:Envelope/components/custom_title_bar.dart';
  3. import 'package:Envelope/components/flash_message.dart';
  4. import 'package:Envelope/database/repositories/conversations_repository.dart';
  5. import 'package:Envelope/database/repositories/friends_repository.dart';
  6. import 'package:Envelope/services/conversations_service.dart';
  7. import 'package:flutter/material.dart';
  8. import 'create_add_users.dart';
  9. import 'detail.dart';
  10. import '/database/models/friends.dart';
  11. import '/database/models/conversations.dart';
  12. import '/views/main/conversation/edit_details.dart';
  13. import '/views/main/conversation/list_item.dart';
  14. class ConversationList extends StatefulWidget {
  15. final List<Conversation> conversations;
  16. final List<Friend> friends;
  17. const ConversationList({
  18. Key? key,
  19. required this.conversations,
  20. required this.friends,
  21. }) : super(key: key);
  22. @override
  23. State<ConversationList> createState() => _ConversationListState();
  24. }
  25. class _ConversationListState extends State<ConversationList> {
  26. List<Conversation> conversations = [];
  27. List<Friend> friends = [];
  28. @override
  29. Widget build(BuildContext context) {
  30. return Scaffold(
  31. appBar: const CustomTitleBar(
  32. title: Text(
  33. 'Conversations',
  34. style: TextStyle(
  35. fontSize: 32,
  36. fontWeight: FontWeight.bold
  37. )
  38. ),
  39. showBack: false,
  40. backgroundColor: Colors.transparent,
  41. ),
  42. body: Padding(
  43. padding: const EdgeInsets.only(top: 16,left: 16,right: 16),
  44. child: SingleChildScrollView(
  45. child: Column(
  46. children: <Widget>[
  47. TextField(
  48. decoration: const InputDecoration(
  49. hintText: 'Search...',
  50. prefixIcon: Icon(
  51. Icons.search,
  52. size: 20
  53. ),
  54. ),
  55. onChanged: (value) => filterSearchResults(value.toLowerCase())
  56. ),
  57. list(),
  58. ],
  59. ),
  60. ),
  61. ),
  62. floatingActionButton: Padding(
  63. padding: const EdgeInsets.only(right: 10, bottom: 10),
  64. child: FloatingActionButton(
  65. onPressed: () {
  66. Navigator.of(context).push(
  67. MaterialPageRoute(builder: (context) => ConversationEditDetails(
  68. saveCallback: (String conversationName, File? file) {
  69. Navigator.of(context).push(
  70. MaterialPageRoute(builder: (context) => ConversationAddFriendsList(
  71. friends: friends,
  72. saveCallback: (List<Friend> friendsSelected) async {
  73. Conversation conversation = await ConversationsRepository.createConversation(
  74. conversationName,
  75. friendsSelected,
  76. false,
  77. );
  78. ConversationsService.uploadConversation(conversation)
  79. .catchError((dynamic) {
  80. showMessage('Failed to create conversation', context);
  81. });
  82. if (!mounted) {
  83. return;
  84. }
  85. Navigator.of(context).popUntil((route) => route.isFirst);
  86. Navigator.push(context, MaterialPageRoute(builder: (context) {
  87. return ConversationDetail(
  88. conversation: conversation,
  89. );
  90. }));
  91. },
  92. ))
  93. );
  94. },
  95. )),
  96. ).then(onGoBack);
  97. },
  98. backgroundColor: Theme.of(context).colorScheme.primary,
  99. child: Icon(
  100. Icons.add,
  101. size: 30,
  102. color: Theme.of(context).colorScheme.onPrimary,
  103. ),
  104. ),
  105. ),
  106. );
  107. }
  108. void filterSearchResults(String query) {
  109. List<Conversation> dummySearchList = [];
  110. dummySearchList.addAll(widget.conversations);
  111. if(query.isNotEmpty) {
  112. List<Conversation> dummyListData = [];
  113. for (Conversation item in dummySearchList) {
  114. if (item.name.toLowerCase().contains(query)) {
  115. dummyListData.add(item);
  116. }
  117. }
  118. setState(() {
  119. conversations.clear();
  120. conversations.addAll(dummyListData);
  121. });
  122. return;
  123. }
  124. setState(() {
  125. conversations.clear();
  126. conversations.addAll(widget.conversations);
  127. });
  128. }
  129. @override
  130. void initState() {
  131. super.initState();
  132. conversations.addAll(widget.conversations);
  133. friends.addAll(widget.friends);
  134. setState(() {});
  135. }
  136. Widget list() {
  137. if (conversations.isEmpty) {
  138. return const Center(
  139. child: Text('No Conversations'),
  140. );
  141. }
  142. return ListView.builder(
  143. itemCount: conversations.length,
  144. shrinkWrap: true,
  145. padding: const EdgeInsets.only(top: 16),
  146. physics: const NeverScrollableScrollPhysics(),
  147. itemBuilder: (context, i) {
  148. return ConversationListItem(
  149. conversation: conversations[i],
  150. );
  151. },
  152. );
  153. }
  154. onGoBack(dynamic value) async {
  155. conversations = await ConversationsRepository.getConversations();
  156. friends = await FriendsRepository.getFriends();
  157. setState(() {});
  158. }
  159. }