use correct response model

This commit is contained in:
Salvatore Giordano
2020-11-27 12:49:17 +01:00
parent d896e45eab
commit 78be96eab0
10 changed files with 114 additions and 73 deletions
+1
View File
@@ -62,3 +62,4 @@ doc/api/
fvm fvm
google-services.json google-services.json
example/ios/dist example/ios/dist
.vscode/
+6
View File
@@ -139,6 +139,12 @@ class _ChannelListPageState extends State<ChannelListPage> {
r'$in': [user.id] r'$in': [user.id]
} }
}, },
sortOptions: [
SortOption(
'created_at',
direction: SortOption.ASC,
),
],
paginationParams: PaginationParams(limit: 20), paginationParams: PaginationParams(limit: 20),
onItemTap: (message) {}, onItemTap: (message) {},
) )
+1 -1
View File
@@ -78,7 +78,7 @@ class SearchTextField extends StatelessWidget {
Future.microtask( Future.microtask(
() => [ () => [
controller.clear(), controller.clear(),
onChanged(''), if (onChanged != null) onChanged(''),
], ],
); );
} }
+1 -1
View File
@@ -1,6 +1,6 @@
name: example name: example
description: A new Flutter project. description: A new Flutter project.
version: 1.0.78+80 version: 1.0.80+82
environment: environment:
sdk: ">=2.2.2 <3.0.0" sdk: ">=2.2.2 <3.0.0"
+6 -3
View File
@@ -30,10 +30,13 @@ class ChannelBottomSheet extends StatelessWidget {
vertical: 2.0, vertical: 2.0,
), ),
child: Center( child: Center(
child: ChannelName( child: StreamChannel(
showLoading: false,
channel: channel, channel: channel,
textStyle: child: ChannelName(
StreamChatTheme.of(context).channelPreviewTheme.title, textStyle:
StreamChatTheme.of(context).channelPreviewTheme.title,
),
), ),
), ),
), ),
+46 -41
View File
@@ -12,60 +12,65 @@ class ChannelName extends StatelessWidget {
/// Instantiate a new ChannelName /// Instantiate a new ChannelName
const ChannelName({ const ChannelName({
Key key, Key key,
this.channel,
this.textStyle, this.textStyle,
}) : super(key: key); }) : super(key: key);
/// The channel to show the name of
final Channel channel;
/// The style of the text displayed /// The style of the text displayed
final TextStyle textStyle; final TextStyle textStyle;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final client = StreamChat.of(context); final client = StreamChat.of(context);
final channel = this.channel ?? StreamChannel.of(context).channel; final channel = StreamChannel.of(context).channel;
return StreamBuilder<Map<String, dynamic>>(
stream: channel.extraDataStream,
initialData: channel.extraData,
builder: (context, snapshot) {
return _buildName(snapshot.data, channel.state.members, client);
},
);
}
Widget _buildName(
Map<String, dynamic> extraData,
List<Member> members,
StreamChatState client,
) {
return LayoutBuilder( return LayoutBuilder(
builder: (context, constraints) { builder: (context, constraints) {
return StreamBuilder<Map<String, dynamic>>( String title;
stream: channel.extraDataStream, if (extraData['name'] == null) {
initialData: channel.extraData, final otherMembers =
builder: (context, snapshot) { members.where((member) => member.userId != client.user.id);
String title; if (otherMembers.isNotEmpty) {
if (snapshot.data['name'] == null) { final maxWidth = constraints.maxWidth;
final otherMembers = channel.state.members final maxChars = maxWidth / textStyle.fontSize;
.where((member) => member.userId != client.user.id); var currentChars = 0;
if (otherMembers.isNotEmpty) { final currentMembers = <Member>[];
final maxWidth = constraints.maxWidth; otherMembers.forEach((element) {
final maxChars = maxWidth / textStyle.fontSize; final newLength = currentChars + element.user.name.length;
int currentChars = 0; if (newLength < maxChars) {
final currentMembers = <Member>[]; currentChars = newLength;
otherMembers.forEach((element) { currentMembers.add(element);
final newLength = currentChars + element.user.name.length;
if (newLength < maxChars) {
currentChars = newLength;
currentMembers.add(element);
}
});
final exceedingMembers =
otherMembers.length - currentMembers.length;
title =
'${currentMembers.map((e) => e.user.name).join(', ')} ${exceedingMembers > 0 ? '+ $exceedingMembers' : ''}';
} else {
title = channel.id;
} }
} else { });
title = snapshot.data['name'];
}
return Text( final exceedingMembers =
title, otherMembers.length - currentMembers.length;
style: textStyle, title =
overflow: TextOverflow.ellipsis, '${currentMembers.map((e) => e.user.name).join(', ')} ${exceedingMembers > 0 ? '+ $exceedingMembers' : ''}';
); } else {
}, title = 'No title';
}
} else {
title = extraData['name'];
}
return Text(
title,
style: textStyle,
overflow: TextOverflow.ellipsis,
); );
}, },
); );
+9 -7
View File
@@ -36,12 +36,14 @@ class MessageSearchBloc extends StatefulWidget {
class MessageSearchBlocState extends State<MessageSearchBloc> class MessageSearchBlocState extends State<MessageSearchBloc>
with AutomaticKeepAliveClientMixin { with AutomaticKeepAliveClientMixin {
/// The current messages list /// The current messages list
List<Message> get messages => _messagesController.value; List<GetMessageResponse> get messageResponses => _messageResponses.value;
/// The current messages list as a stream /// The current messages list as a stream
Stream<List<Message>> get messagesStream => _messagesController.stream; Stream<List<GetMessageResponse>> get messagesStream =>
_messageResponses.stream;
final BehaviorSubject<List<Message>> _messagesController = BehaviorSubject(); final BehaviorSubject<List<GetMessageResponse>> _messageResponses =
BehaviorSubject();
final BehaviorSubject<bool> _queryMessagesLoadingController = final BehaviorSubject<bool> _queryMessagesLoadingController =
BehaviorSubject.seeded(false); BehaviorSubject.seeded(false);
@@ -69,7 +71,7 @@ class MessageSearchBlocState extends State<MessageSearchBloc>
pagination.offset == null || pagination.offset == null ||
pagination.offset == 0; pagination.offset == 0;
final oldMessages = List<Message>.from(messages ?? []); final oldMessages = List<GetMessageResponse>.from(messageResponses ?? []);
final messageResponse = await client.search( final messageResponse = await client.search(
filter, filter,
@@ -79,10 +81,10 @@ class MessageSearchBlocState extends State<MessageSearchBloc>
); );
if (clear) { if (clear) {
_messagesController.add(messageResponse.results); _messageResponses.add(messageResponse.results);
} else { } else {
final temp = oldMessages + messageResponse.results; final temp = oldMessages + messageResponse.results;
_messagesController.add(temp); _messageResponses.add(temp);
} }
_queryMessagesLoadingController.add(false); _queryMessagesLoadingController.add(false);
@@ -99,7 +101,7 @@ class MessageSearchBlocState extends State<MessageSearchBloc>
@override @override
void dispose() { void dispose() {
_messagesController.close(); _messageResponses.close();
_queryMessagesLoadingController.close(); _queryMessagesLoadingController.close();
super.dispose(); super.dispose();
} }
+32 -10
View File
@@ -13,13 +13,13 @@ class MessageSearchItem extends StatelessWidget {
/// Instantiate a new MessageSearchItem /// Instantiate a new MessageSearchItem
const MessageSearchItem({ const MessageSearchItem({
Key key, Key key,
@required this.message, @required this.getMessageResponse,
this.onTap, this.onTap,
this.showOnlineStatus = true, this.showOnlineStatus = true,
}) : super(key: key); }) : super(key: key);
/// [Message] displayed /// [Message] displayed
final Message message; final GetMessageResponse getMessageResponse;
/// Function called when tapping this widget /// Function called when tapping this widget
final VoidCallback onTap; final VoidCallback onTap;
@@ -29,9 +29,12 @@ class MessageSearchItem extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final data = Message.fromJson(message.extraData['message']); final message = getMessageResponse.message;
final user = data.user; final channel = getMessageResponse.channel;
debugPrint(message.toJson().toString()); final channelName = channel.extraData['name'];
print('channel.extraData: ${channel.extraData}');
print('channelName: ${channelName}');
final user = message.user;
return ListTile( return ListTile(
onTap: onTap, onTap: onTap,
leading: UserAvatar( leading: UserAvatar(
@@ -42,15 +45,34 @@ class MessageSearchItem extends StatelessWidget {
width: 40, width: 40,
), ),
), ),
title: Text( title: Row(
user.name, children: [
style: StreamChatTheme.of(context).channelPreviewTheme.title, Text(
user.name,
style: StreamChatTheme.of(context).channelPreviewTheme.title,
),
if (channelName != null)
Text(
' in ',
style: StreamChatTheme.of(context)
.channelPreviewTheme
.title
.copyWith(
fontWeight: FontWeight.normal,
),
),
if (channelName != null)
Text(
channelName,
style: StreamChatTheme.of(context).channelPreviewTheme.title,
),
],
), ),
subtitle: Row( subtitle: Row(
children: [ children: [
Expanded(child: _buildSubtitle(context, data)), Expanded(child: _buildSubtitle(context, message)),
SizedBox(width: 16), SizedBox(width: 16),
_buildDate(context, data), _buildDate(context, message),
], ],
), ),
); );
+10 -8
View File
@@ -8,10 +8,11 @@ import 'lazy_load_scroll_view.dart';
import 'message_search_bloc.dart'; import 'message_search_bloc.dart';
/// Callback called when tapping on a user /// Callback called when tapping on a user
typedef MessageSearchItemTapCallback = void Function(Message); typedef MessageSearchItemTapCallback = void Function(GetMessageResponse);
/// Builder used to create a custom [ListUserItem] from a [User] /// Builder used to create a custom [ListUserItem] from a [User]
typedef MessageSearchItemBuilder = Widget Function(BuildContext, Message); typedef MessageSearchItemBuilder = Widget Function(
BuildContext, GetMessageResponse);
/// ///
/// It shows the list of searched messages. /// It shows the list of searched messages.
@@ -127,13 +128,14 @@ class _MessageSearchListViewState extends State<MessageSearchListView> {
); );
} }
Widget _listItemBuilder(BuildContext context, Message message) { Widget _listItemBuilder(
BuildContext context, GetMessageResponse getMessageResponse) {
if (widget.itemBuilder != null) { if (widget.itemBuilder != null) {
return widget.itemBuilder(context, message); return widget.itemBuilder(context, getMessageResponse);
} }
return MessageSearchItem( return MessageSearchItem(
message: message, getMessageResponse: getMessageResponse,
onTap: () => widget.onItemTap(message), onTap: () => widget.onItemTap(getMessageResponse),
); );
} }
@@ -165,7 +167,7 @@ class _MessageSearchListViewState extends State<MessageSearchListView> {
} }
Widget _buildListView(MessageSearchBlocState messageSearchBloc) { Widget _buildListView(MessageSearchBlocState messageSearchBloc) {
return StreamBuilder<List<Message>>( return StreamBuilder<List<GetMessageResponse>>(
stream: messageSearchBloc.messagesStream, stream: messageSearchBloc.messagesStream,
builder: (context, snapshot) { builder: (context, snapshot) {
if (snapshot.hasError) { if (snapshot.hasError) {
@@ -276,7 +278,7 @@ class _MessageSearchListViewState extends State<MessageSearchListView> {
filter: widget.filters, filter: widget.filters,
sort: widget.sortOptions, sort: widget.sortOptions,
pagination: widget.paginationParams.copyWith( pagination: widget.paginationParams.copyWith(
offset: messageSearchBloc.messages?.length ?? 0, offset: messageSearchBloc.messageResponses?.length ?? 0,
), ),
query: widget.messageQuery, query: widget.messageQuery,
), ),
+1 -1
View File
@@ -28,7 +28,7 @@ dependencies:
file_picker: ^2.0.12 file_picker: ^2.0.12
image_picker: ^0.6.7+2 image_picker: ^0.6.7+2
flutter_keyboard_visibility: ^3.3.0 flutter_keyboard_visibility: ^3.3.0
stream_chat: ^0.2.13+1 stream_chat: ^0.2.14
mime: ^0.9.6+3 mime: ^0.9.6+3
video_compress: ^2.1.1 video_compress: ^2.1.1
visibility_detector: ^0.1.5 visibility_detector: ^0.1.5