import 'package:Capsule/components/custom_title_bar.dart'; import 'package:Capsule/components/qr_reader.dart'; import 'package:Capsule/views/main/friend/add_search.dart'; import 'package:Capsule/views/main/friend/request_list_item.dart'; import 'package:flutter/material.dart'; import '/models/friends.dart'; import '/components/custom_expandable_fab.dart'; import '/views/main/friend/list_item.dart'; class FriendList extends StatefulWidget { final List friends; final List friendRequests; final Function callback; const FriendList({ Key? key, required this.friends, required this.friendRequests, required this.callback, }) : super(key: key); @override State createState() => _FriendListState(); } class _FriendListState extends State { List friends = []; List friendRequests = []; List friendsDuplicate = []; List friendRequestsDuplicate = []; @override Widget build(BuildContext context) { return Scaffold( appBar: const CustomTitleBar( title: Text( 'Friends', style: TextStyle( fontSize: 32, fontWeight: FontWeight.bold ) ), showBack: false, backgroundColor: Colors.transparent, ), body: Padding( padding: const EdgeInsets.only(top: 16,left: 16,right: 16), child: SingleChildScrollView( child: Column( children: [ TextField( decoration: const InputDecoration( hintText: 'Search...', prefixIcon: Icon( Icons.search, size: 20 ), ), onChanged: (value) => filterSearchResults(value.toLowerCase()) ), headingOrNull('Friend Requests'), friendRequestList(), headingOrNull('Friends'), friendList(), ], ), ), ), floatingActionButton: Padding( padding: const EdgeInsets.only(right: 10, bottom: 10), child: ExpandableFab( icon: const Icon(Icons.add, size: 30), distance: 90.0, children: [ ActionButton( onPressed: () { Navigator.of(context).push( MaterialPageRoute(builder: (context) => const QrReader()) );//.then(onGoBack); // TODO }, icon: const Icon(Icons.qr_code_2, size: 25), ), ActionButton( onPressed: () { Navigator.of(context).push( MaterialPageRoute(builder: (context) => const FriendAddSearch()) );//.then(onGoBack); // TODO }, icon: const Icon(Icons.search, size: 25), ), ], ) ) ); } void filterSearchResults(String query) { List dummySearchList = []; dummySearchList.addAll(friends); if(query.isNotEmpty) { List dummyListData = []; for (Friend item in dummySearchList) { if(item.username.toLowerCase().contains(query)) { dummyListData.add(item); } } setState(() { friends.clear(); friends.addAll(dummyListData); }); return; } setState(() { friends.clear(); friends.addAll(friends); }); } @override void initState() { super.initState(); friends.addAll(widget.friends); friendRequests.addAll(widget.friendRequests); } Future initFriends() async { friends = await getFriends(accepted: true); friendRequests = await getFriends(accepted: false); setState(() {}); widget.callback(); } Widget headingOrNull(String heading) { if (friends.isEmpty || friendRequests.isEmpty) { return const SizedBox.shrink(); } return Padding( padding: const EdgeInsets.only(top: 16), child: Align( alignment: Alignment.centerLeft, child: Text( heading, style: TextStyle( fontSize: 16, color: Theme.of(context).colorScheme.tertiary, ), ), ) ); } Widget friendRequestList() { if (friendRequests.isEmpty) { return const SizedBox.shrink(); } return ListView.builder( itemCount: friendRequests.length, shrinkWrap: true, padding: const EdgeInsets.only(top: 16), physics: const NeverScrollableScrollPhysics(), itemBuilder: (context, i) { return FriendRequestListItem( friend: friendRequests[i], callback: initFriends, ); }, ); } Widget friendList() { if (friends.isEmpty) { return const Center( child: Text('No Friends'), ); } return ListView.builder( itemCount: friends.length, shrinkWrap: true, padding: const EdgeInsets.only(top: 16), physics: const NeverScrollableScrollPhysics(), itemBuilder: (context, i) { return FriendListItem( friend: friends[i], ); }, ); } }