change: Implement contact list instead of status

This commit is contained in:
Christian Pauly 2021-02-05 08:43:44 +01:00
commit 237240407f
10 changed files with 216 additions and 288 deletions

View file

@ -0,0 +1,72 @@
import 'package:adaptive_page_layout/adaptive_page_layout.dart';
import 'package:fluffychat/components/avatar.dart';
import 'package:fluffychat/components/default_app_bar_search_field.dart';
import 'package:fluffychat/components/list_items/contact_list_tile.dart';
import 'package:fluffychat/components/matrix.dart';
import 'package:flutter/material.dart';
import '../../utils/client_presence_extension.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
class ContactList extends StatefulWidget {
@override
_ContactListState createState() => _ContactListState();
}
class _ContactListState extends State<ContactList> {
String _searchQuery = '';
@override
Widget build(BuildContext context) {
return ListView(children: [
Padding(
padding: EdgeInsets.all(12),
child: DefaultAppBarSearchField(
hintText: L10n.of(context).search,
prefixIcon: Icon(Icons.search_outlined),
onChanged: (t) => setState(() => _searchQuery = t),
padding: EdgeInsets.zero,
),
),
ListTile(
leading: CircleAvatar(
backgroundColor: Theme.of(context).primaryColor,
foregroundColor: Colors.white,
child: Icon(Icons.add_outlined),
radius: Avatar.defaultSize / 2,
),
title: Text('Add new contact'),
onTap: () =>
AdaptivePageLayout.of(context).pushNamed('/newprivatechat'),
),
Divider(height: 1),
StreamBuilder<Object>(
stream: Matrix.of(context).client.onSync.stream,
builder: (context, snapshot) {
final contactList = Matrix.of(context)
.client
.contactList
.where((p) => p.senderId
.toLowerCase()
.contains(_searchQuery.toLowerCase()))
.toList();
if (contactList.isEmpty) {
return Container(
padding: EdgeInsets.all(16),
alignment: Alignment.center,
child: Text(
'No contacts found...',
textAlign: TextAlign.center,
),
);
}
return ListView.builder(
physics: NeverScrollableScrollPhysics(),
shrinkWrap: true,
padding: EdgeInsets.only(bottom: 24),
itemCount: contactList.length,
itemBuilder: (context, i) =>
ContactListTile(contact: contactList[i]),
);
}),
]);
}
}

View file

@ -1,78 +0,0 @@
import 'package:fluffychat/components/list_items/status_list_tile.dart';
import 'package:fluffychat/components/matrix.dart';
import 'package:fluffychat/utils/status.dart';
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
class StatusList extends StatefulWidget {
const StatusList({Key key}) : super(key: key);
@override
_StatusListState createState() => _StatusListState();
}
class _StatusListState extends State<StatusList> {
bool _onlyContacts = false;
@override
Widget build(BuildContext context) {
return ListView(children: [
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
RaisedButton(
elevation: _onlyContacts ? 7 : null,
color: !_onlyContacts ? null : Theme.of(context).primaryColor,
child: Text(
L10n.of(context).contacts,
style: TextStyle(color: _onlyContacts ? Colors.white : null),
),
onPressed: () => setState(() => _onlyContacts = true),
),
RaisedButton(
elevation: !_onlyContacts ? 7 : null,
color: _onlyContacts ? null : Theme.of(context).primaryColor,
child: Text(
L10n.of(context).all,
style: TextStyle(color: !_onlyContacts ? Colors.white : null),
),
onPressed: () => setState(() => _onlyContacts = false),
),
],
),
Divider(height: 1),
StreamBuilder<Object>(
stream: Matrix.of(context)
.client
.onAccountData
.stream
.where((a) => a.type == Status.namespace),
builder: (context, snapshot) {
final statuses = Matrix.of(context).statuses.values.toList()
..sort((a, b) => b.dateTime.compareTo(a.dateTime));
if (_onlyContacts) {
final client = Matrix.of(context).client;
statuses.removeWhere(
(p) => client.getDirectChatFromUserId(p.senderId) == null);
}
if (statuses.isEmpty) {
return Container(
padding: EdgeInsets.all(16),
alignment: Alignment.center,
child: Text(
L10n.of(context).noStatusesFound,
textAlign: TextAlign.center,
),
);
}
return ListView.separated(
physics: NeverScrollableScrollPhysics(),
shrinkWrap: true,
padding: EdgeInsets.only(bottom: 24),
separatorBuilder: (_, __) => Divider(height: 1),
itemCount: statuses.length,
itemBuilder: (context, i) => StatusListTile(status: statuses[i]),
);
}),
]);
}
}