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.

168 lines
5.7 KiB

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