change: Implement contact list instead of status
This commit is contained in:
parent
cb0f2b0631
commit
237240407f
10 changed files with 216 additions and 288 deletions
|
|
@ -1,6 +1,7 @@
|
|||
import 'package:adaptive_dialog/adaptive_dialog.dart';
|
||||
import 'package:adaptive_page_layout/adaptive_page_layout.dart';
|
||||
import 'package:fluffychat/app_config.dart';
|
||||
import 'package:fluffychat/components/avatar.dart';
|
||||
import 'package:fluffychat/components/matrix.dart';
|
||||
import 'package:fluffychat/utils/fluffy_share.dart';
|
||||
import 'package:flushbar/flushbar_helper.dart';
|
||||
|
|
@ -238,6 +239,7 @@ class _ChatDetailsState extends State<ChatDetails> {
|
|||
.scaffoldBackgroundColor,
|
||||
foregroundColor: Colors.grey,
|
||||
child: Icon(Icons.edit_outlined),
|
||||
radius: Avatar.defaultSize / 2,
|
||||
)
|
||||
: null,
|
||||
title: Text('${L10n.of(context).groupDescription}:',
|
||||
|
|
|
|||
|
|
@ -12,13 +12,14 @@ import 'package:fluffychat/app_config.dart';
|
|||
import 'package:fluffychat/utils/platform_infos.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:future_loading_dialog/future_loading_dialog.dart';
|
||||
import 'package:receive_sharing_intent/receive_sharing_intent.dart';
|
||||
import '../components/matrix.dart';
|
||||
import '../utils/matrix_file_extension.dart';
|
||||
import '../utils/url_launcher.dart';
|
||||
import 'home_view_parts/chat_list.dart';
|
||||
import 'home_view_parts/settings.dart';
|
||||
import 'home_view_parts/status_list.dart';
|
||||
import 'home_view_parts/contact_list.dart';
|
||||
import 'package:flutter_gen/gen_l10n/l10n.dart';
|
||||
|
||||
enum SelectMode { normal, share, select }
|
||||
|
|
@ -143,11 +144,30 @@ class _HomeViewState extends State<HomeView> with TickerProviderStateMixin {
|
|||
});
|
||||
}
|
||||
|
||||
void _setStatus() async {
|
||||
final input = await showTextInputDialog(
|
||||
context: context,
|
||||
title: L10n.of(context).setStatus,
|
||||
textFields: [
|
||||
DialogTextField(
|
||||
hintText: L10n.of(context).statusExampleMessage,
|
||||
),
|
||||
]);
|
||||
if (input == null) return;
|
||||
await showFutureLoadingDialog(
|
||||
context: context,
|
||||
future: () => Matrix.of(context).client.sendPresence(
|
||||
Matrix.of(context).client.userID,
|
||||
PresenceType.online,
|
||||
statusMsg: input.single,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
void _onFabTab() {
|
||||
switch (currentIndex) {
|
||||
case 0:
|
||||
AdaptivePageLayout.of(context)
|
||||
.pushNamedAndRemoveUntilIsFirst('/newstatus');
|
||||
_setStatus();
|
||||
break;
|
||||
case 1:
|
||||
AdaptivePageLayout.of(context)
|
||||
|
|
@ -212,7 +232,7 @@ class _HomeViewState extends State<HomeView> with TickerProviderStateMixin {
|
|||
body: TabBarView(
|
||||
controller: _pageController,
|
||||
children: [
|
||||
StatusList(key: Key('StatusList')),
|
||||
ContactList(),
|
||||
ChatList(
|
||||
onCustomAppBar: (appBar) => setState(() => this.appBar = appBar),
|
||||
),
|
||||
|
|
@ -246,8 +266,8 @@ class _HomeViewState extends State<HomeView> with TickerProviderStateMixin {
|
|||
},
|
||||
items: [
|
||||
BottomNavigationBarItem(
|
||||
label: L10n.of(context).status,
|
||||
icon: Icon(Icons.home_outlined),
|
||||
label: L10n.of(context).contacts,
|
||||
icon: Icon(Icons.people_outlined),
|
||||
),
|
||||
BottomNavigationBarItem(
|
||||
label: L10n.of(context).messages,
|
||||
|
|
|
|||
72
lib/views/home_view_parts/contact_list.dart
Normal file
72
lib/views/home_view_parts/contact_list.dart
Normal 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]),
|
||||
);
|
||||
}),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
|
@ -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]),
|
||||
);
|
||||
}),
|
||||
]);
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue