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.

161 lines
4.6 KiB

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