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.

159 lines
4.8 KiB

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