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.

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