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.

190 lines
4.8 KiB

  1. import 'package:Envelope/components/custom_title_bar.dart';
  2. import 'package:Envelope/views/main/friend/add_search.dart';
  3. import 'package:Envelope/views/main/friend/request_list_item.dart';
  4. import 'package:flutter/material.dart';
  5. import '/models/friends.dart';
  6. import '/components/custom_expandable_fab.dart';
  7. import '/views/main/friend/list_item.dart';
  8. class FriendList extends StatefulWidget {
  9. final List<Friend> friends;
  10. final List<Friend> friendRequests;
  11. final Function callback;
  12. const FriendList({
  13. Key? key,
  14. required this.friends,
  15. required this.friendRequests,
  16. required this.callback,
  17. }) : super(key: key);
  18. @override
  19. State<FriendList> createState() => _FriendListState();
  20. }
  21. class _FriendListState extends State<FriendList> {
  22. List<Friend> friends = [];
  23. List<Friend> friendRequests = [];
  24. List<Friend> friendsDuplicate = [];
  25. List<Friend> friendRequestsDuplicate = [];
  26. @override
  27. Widget build(BuildContext context) {
  28. return Scaffold(
  29. appBar: const CustomTitleBar(
  30. title: Text(
  31. 'Friends',
  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. headingOrNull('Friend Requests'),
  56. friendRequestList(),
  57. headingOrNull('Friends'),
  58. friendList(),
  59. ],
  60. ),
  61. ),
  62. ),
  63. floatingActionButton: Padding(
  64. padding: const EdgeInsets.only(right: 10, bottom: 10),
  65. child: ExpandableFab(
  66. icon: const Icon(Icons.add, size: 30),
  67. distance: 90.0,
  68. children: [
  69. ActionButton(
  70. onPressed: () {},
  71. icon: const Icon(Icons.qr_code_2, size: 25),
  72. ),
  73. ActionButton(
  74. onPressed: () {
  75. Navigator.of(context).push(
  76. MaterialPageRoute(builder: (context) => const FriendAddSearch())
  77. );//.then(onGoBack); // TODO
  78. },
  79. icon: const Icon(Icons.search, size: 25),
  80. ),
  81. ],
  82. )
  83. )
  84. );
  85. }
  86. void filterSearchResults(String query) {
  87. List<Friend> dummySearchList = [];
  88. dummySearchList.addAll(friends);
  89. if(query.isNotEmpty) {
  90. List<Friend> dummyListData = [];
  91. for (Friend item in dummySearchList) {
  92. if(item.username.toLowerCase().contains(query)) {
  93. dummyListData.add(item);
  94. }
  95. }
  96. setState(() {
  97. friends.clear();
  98. friends.addAll(dummyListData);
  99. });
  100. return;
  101. }
  102. setState(() {
  103. friends.clear();
  104. friends.addAll(friends);
  105. });
  106. }
  107. @override
  108. void initState() {
  109. super.initState();
  110. friends.addAll(widget.friends);
  111. friendRequests.addAll(widget.friendRequests);
  112. }
  113. Future<void> initFriends() async {
  114. friends = await getFriends(accepted: true);
  115. friendRequests = await getFriends(accepted: false);
  116. setState(() {});
  117. widget.callback();
  118. }
  119. Widget headingOrNull(String heading) {
  120. if (friends.isEmpty || friendRequests.isEmpty) {
  121. return const SizedBox.shrink();
  122. }
  123. return Padding(
  124. padding: const EdgeInsets.only(top: 16),
  125. child: Align(
  126. alignment: Alignment.centerLeft,
  127. child: Text(
  128. heading,
  129. style: TextStyle(
  130. fontSize: 16,
  131. color: Theme.of(context).colorScheme.tertiary,
  132. ),
  133. ),
  134. )
  135. );
  136. }
  137. Widget friendRequestList() {
  138. if (friendRequests.isEmpty) {
  139. return const SizedBox.shrink();
  140. }
  141. return ListView.builder(
  142. itemCount: friendRequests.length,
  143. shrinkWrap: true,
  144. padding: const EdgeInsets.only(top: 16),
  145. physics: const NeverScrollableScrollPhysics(),
  146. itemBuilder: (context, i) {
  147. return FriendRequestListItem(
  148. friend: friendRequests[i],
  149. callback: initFriends,
  150. );
  151. },
  152. );
  153. }
  154. Widget friendList() {
  155. if (friends.isEmpty) {
  156. return const Center(
  157. child: Text('No Friends'),
  158. );
  159. }
  160. return ListView.builder(
  161. itemCount: friends.length,
  162. shrinkWrap: true,
  163. padding: const EdgeInsets.only(top: 16),
  164. physics: const NeverScrollableScrollPhysics(),
  165. itemBuilder: (context, i) {
  166. return FriendListItem(
  167. friend: friends[i],
  168. );
  169. },
  170. );
  171. }
  172. }