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.

164 lines
4.5 KiB

  1. import 'package:flutter/material.dart';
  2. import '/database/models/friends.dart';
  3. import '/views/main/conversation/create_add_users_list.dart';
  4. class ConversationAddFriendsList extends StatefulWidget {
  5. final List<Friend> friends;
  6. final Function(List<Friend> friendsSelected) saveCallback;
  7. const ConversationAddFriendsList({
  8. Key? key,
  9. required this.friends,
  10. required this.saveCallback,
  11. }) : super(key: key);
  12. @override
  13. State<ConversationAddFriendsList> createState() => _ConversationAddFriendsListState();
  14. }
  15. class _ConversationAddFriendsListState extends State<ConversationAddFriendsList> {
  16. List<Friend> friends = [];
  17. List<Friend> friendsSelected = [];
  18. @override
  19. Widget build(BuildContext context) {
  20. return Scaffold(
  21. appBar: AppBar(
  22. elevation: 0,
  23. automaticallyImplyLeading: false,
  24. flexibleSpace: SafeArea(
  25. child: Container(
  26. padding: const EdgeInsets.only(right: 16),
  27. child: Row(
  28. children: <Widget>[
  29. IconButton(
  30. onPressed: (){
  31. Navigator.pop(context);
  32. },
  33. icon: const Icon(Icons.arrow_back),
  34. ),
  35. const SizedBox(width: 2,),
  36. Expanded(
  37. child: Column(
  38. crossAxisAlignment: CrossAxisAlignment.start,
  39. mainAxisAlignment: MainAxisAlignment.center,
  40. children: <Widget>[
  41. Text(
  42. friendsSelected.isEmpty ?
  43. 'Select Friends' :
  44. '${friendsSelected.length} Friends Selected',
  45. style: const TextStyle(
  46. fontSize: 16,
  47. fontWeight: FontWeight.w600
  48. ),
  49. ),
  50. ],
  51. ),
  52. ),
  53. ],
  54. ),
  55. ),
  56. ),
  57. ),
  58. body: Column(
  59. crossAxisAlignment: CrossAxisAlignment.start,
  60. children: <Widget>[
  61. Padding(
  62. padding: const EdgeInsets.only(top: 20,left: 16,right: 16),
  63. child: TextField(
  64. decoration: const InputDecoration(
  65. hintText: "Search...",
  66. prefixIcon: Icon(
  67. Icons.search,
  68. size: 20
  69. ),
  70. ),
  71. onChanged: (value) => filterSearchResults(value.toLowerCase())
  72. ),
  73. ),
  74. Padding(
  75. padding: const EdgeInsets.only(top: 0,left: 16,right: 16),
  76. child: list(),
  77. ),
  78. ],
  79. ),
  80. floatingActionButton: Padding(
  81. padding: const EdgeInsets.only(right: 10, bottom: 10),
  82. child: FloatingActionButton(
  83. onPressed: () {
  84. widget.saveCallback(friendsSelected);
  85. setState(() {
  86. friendsSelected = [];
  87. });
  88. },
  89. backgroundColor: Theme.of(context).colorScheme.primary,
  90. child: friendsSelected.isEmpty ?
  91. const Text('Skip') :
  92. const Icon(Icons.add, size: 30),
  93. ),
  94. ),
  95. );
  96. }
  97. void filterSearchResults(String query) {
  98. List<Friend> dummySearchList = [];
  99. dummySearchList.addAll(widget.friends);
  100. if(query.isNotEmpty) {
  101. List<Friend> dummyListData = [];
  102. for (Friend friend in dummySearchList) {
  103. if (friend.username.toLowerCase().contains(query)) {
  104. dummyListData.add(friend);
  105. }
  106. }
  107. setState(() {
  108. friends.clear();
  109. friends.addAll(dummyListData);
  110. });
  111. return;
  112. }
  113. setState(() {
  114. friends.clear();
  115. friends.addAll(widget.friends);
  116. });
  117. }
  118. @override
  119. void initState() {
  120. super.initState();
  121. friends.addAll(widget.friends);
  122. setState(() {});
  123. }
  124. Widget list() {
  125. if (friends.isEmpty) {
  126. return const Center(
  127. child: Text('No Friends'),
  128. );
  129. }
  130. return ListView.builder(
  131. itemCount: friends.length,
  132. shrinkWrap: true,
  133. padding: const EdgeInsets.only(top: 16),
  134. physics: const BouncingScrollPhysics(),
  135. itemBuilder: (context, i) {
  136. return ConversationAddFriendItem(
  137. friend: friends[i],
  138. isSelected: (bool value) {
  139. setState(() {
  140. widget.friends[i].selected = value;
  141. if (value) {
  142. friendsSelected.add(friends[i]);
  143. return;
  144. }
  145. friendsSelected.remove(friends[i]);
  146. });
  147. }
  148. );
  149. },
  150. );
  151. }
  152. }