relatica/lib/screens/contacts_screen.dart

93 wiersze
2.9 KiB
Dart

import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:provider/provider.dart';
import '../controls/app_bottom_nav_bar.dart';
import '../models/connection.dart';
import '../routes.dart';
import '../services/connections_manager.dart';
class ContactsScreen extends StatefulWidget {
@override
State<ContactsScreen> createState() => _ContactsScreenState();
}
class _ContactsScreenState extends State<ContactsScreen> {
var filterText = '';
@override
Widget build(BuildContext context) {
final manager = context.watch<ConnectionsManager>();
final contacts = manager
.getMyContacts()
.where((c) =>
filterText.isEmpty || c.name.toLowerCase().contains(filterText))
.toList();
contacts.sort((c1, c2) => c1.name.compareTo(c2.name));
late Widget body;
if (contacts.isEmpty) {
body = const SingleChildScrollView(
physics: AlwaysScrollableScrollPhysics(),
child: Text('No Contacts'),
);
} else {
body = ListView.separated(
physics: const AlwaysScrollableScrollPhysics(),
itemBuilder: (context, index) {
final contact = contacts[index];
return ListTile(
onTap: () {
context.pushNamed(ScreenPaths.userProfile,
params: {'id': contact.id});
},
title: Text(contact.name),
trailing: Text(contact.status.label()),
);
},
separatorBuilder: (context, index) => const Divider(),
itemCount: contacts.length);
}
return Scaffold(
body: SafeArea(
child: RefreshIndicator(
onRefresh: () async {
await manager.updateAllContacts();
},
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: TextField(
onChanged: (value) {
setState(() {
filterText = value.toLowerCase();
});
},
decoration: InputDecoration(
labelText: 'Filter By Name',
alignLabelWithHint: true,
border: OutlineInputBorder(
borderSide: BorderSide(
color: Theme.of(context).backgroundColor,
),
borderRadius: BorderRadius.circular(5.0),
),
),
),
),
Expanded(
child: body,
),
],
),
),
),
bottomNavigationBar: AppBottomNavBar(
currentButton: NavBarButtons.contacts,
),
);
}
}