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
+2 -1
View File
@@ -61,4 +61,5 @@ doc/api/
fvm
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]
}
},
sortOptions: [
SortOption(
'created_at',
direction: SortOption.ASC,
),
],
paginationParams: PaginationParams(limit: 20),
onItemTap: (message) {},
)
+1 -1
View File
@@ -78,7 +78,7 @@ class SearchTextField extends StatelessWidget {
Future.microtask(
() => [
controller.clear(),
onChanged(''),
if (onChanged != null) onChanged(''),
],
);
}
+1 -1
View File
@@ -1,6 +1,6 @@
name: example
description: A new Flutter project.
version: 1.0.78+80
version: 1.0.80+82
environment:
sdk: ">=2.2.2 <3.0.0"
+6 -3
View File
@@ -30,10 +30,13 @@ class ChannelBottomSheet extends StatelessWidget {
vertical: 2.0,
),
child: Center(
child: ChannelName(
child: StreamChannel(
showLoading: false,
channel: channel,
textStyle:
StreamChatTheme.of(context).channelPreviewTheme.title,
child: ChannelName(
textStyle:
StreamChatTheme.of(context).channelPreviewTheme.title,
),
),
),
),
+46 -41
View File
@@ -12,60 +12,65 @@ class ChannelName extends StatelessWidget {
/// Instantiate a new ChannelName
const ChannelName({
Key key,
this.channel,
this.textStyle,
}) : super(key: key);
/// The channel to show the name of
final Channel channel;
/// The style of the text displayed
final TextStyle textStyle;
@override
Widget build(BuildContext 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(
builder: (context, constraints) {
return StreamBuilder<Map<String, dynamic>>(
stream: channel.extraDataStream,
initialData: channel.extraData,
builder: (context, snapshot) {
String title;
if (snapshot.data['name'] == null) {
final otherMembers = channel.state.members
.where((member) => member.userId != client.user.id);
if (otherMembers.isNotEmpty) {
final maxWidth = constraints.maxWidth;
final maxChars = maxWidth / textStyle.fontSize;
int currentChars = 0;
final currentMembers = <Member>[];
otherMembers.forEach((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;
String title;
if (extraData['name'] == null) {
final otherMembers =
members.where((member) => member.userId != client.user.id);
if (otherMembers.isNotEmpty) {
final maxWidth = constraints.maxWidth;
final maxChars = maxWidth / textStyle.fontSize;
var currentChars = 0;
final currentMembers = <Member>[];
otherMembers.forEach((element) {
final newLength = currentChars + element.user.name.length;
if (newLength < maxChars) {
currentChars = newLength;
currentMembers.add(element);
}
} else {
title = snapshot.data['name'];
}
});
return Text(
title,
style: textStyle,
overflow: TextOverflow.ellipsis,
);
},
final exceedingMembers =
otherMembers.length - currentMembers.length;
title =
'${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>
with AutomaticKeepAliveClientMixin {
/// The current messages list
List<Message> get messages => _messagesController.value;
List<GetMessageResponse> get messageResponses => _messageResponses.value;
/// 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 =
BehaviorSubject.seeded(false);
@@ -69,7 +71,7 @@ class MessageSearchBlocState extends State<MessageSearchBloc>
pagination.offset == null ||
pagination.offset == 0;
final oldMessages = List<Message>.from(messages ?? []);
final oldMessages = List<GetMessageResponse>.from(messageResponses ?? []);
final messageResponse = await client.search(
filter,
@@ -79,10 +81,10 @@ class MessageSearchBlocState extends State<MessageSearchBloc>
);
if (clear) {
_messagesController.add(messageResponse.results);
_messageResponses.add(messageResponse.results);
} else {
final temp = oldMessages + messageResponse.results;
_messagesController.add(temp);
_messageResponses.add(temp);
}
_queryMessagesLoadingController.add(false);
@@ -99,7 +101,7 @@ class MessageSearchBlocState extends State<MessageSearchBloc>
@override
void dispose() {
_messagesController.close();
_messageResponses.close();
_queryMessagesLoadingController.close();
super.dispose();
}
+32 -10
View File
@@ -13,13 +13,13 @@ class MessageSearchItem extends StatelessWidget {
/// Instantiate a new MessageSearchItem
const MessageSearchItem({
Key key,
@required this.message,
@required this.getMessageResponse,
this.onTap,
this.showOnlineStatus = true,
}) : super(key: key);
/// [Message] displayed
final Message message;
final GetMessageResponse getMessageResponse;
/// Function called when tapping this widget
final VoidCallback onTap;
@@ -29,9 +29,12 @@ class MessageSearchItem extends StatelessWidget {
@override
Widget build(BuildContext context) {
final data = Message.fromJson(message.extraData['message']);
final user = data.user;
debugPrint(message.toJson().toString());
final message = getMessageResponse.message;
final channel = getMessageResponse.channel;
final channelName = channel.extraData['name'];
print('channel.extraData: ${channel.extraData}');
print('channelName: ${channelName}');
final user = message.user;
return ListTile(
onTap: onTap,
leading: UserAvatar(
@@ -42,15 +45,34 @@ class MessageSearchItem extends StatelessWidget {
width: 40,
),
),
title: Text(
user.name,
style: StreamChatTheme.of(context).channelPreviewTheme.title,
title: Row(
children: [
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(
children: [
Expanded(child: _buildSubtitle(context, data)),
Expanded(child: _buildSubtitle(context, message)),
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';
/// 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]
typedef MessageSearchItemBuilder = Widget Function(BuildContext, Message);
typedef MessageSearchItemBuilder = Widget Function(
BuildContext, GetMessageResponse);
///
/// 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) {
return widget.itemBuilder(context, message);
return widget.itemBuilder(context, getMessageResponse);
}
return MessageSearchItem(
message: message,
onTap: () => widget.onItemTap(message),
getMessageResponse: getMessageResponse,
onTap: () => widget.onItemTap(getMessageResponse),
);
}
@@ -165,7 +167,7 @@ class _MessageSearchListViewState extends State<MessageSearchListView> {
}
Widget _buildListView(MessageSearchBlocState messageSearchBloc) {
return StreamBuilder<List<Message>>(
return StreamBuilder<List<GetMessageResponse>>(
stream: messageSearchBloc.messagesStream,
builder: (context, snapshot) {
if (snapshot.hasError) {
@@ -276,7 +278,7 @@ class _MessageSearchListViewState extends State<MessageSearchListView> {
filter: widget.filters,
sort: widget.sortOptions,
pagination: widget.paginationParams.copyWith(
offset: messageSearchBloc.messages?.length ?? 0,
offset: messageSearchBloc.messageResponses?.length ?? 0,
),
query: widget.messageQuery,
),
+1 -1
View File
@@ -28,7 +28,7 @@ dependencies:
file_picker: ^2.0.12
image_picker: ^0.6.7+2
flutter_keyboard_visibility: ^3.3.0
stream_chat: ^0.2.13+1
stream_chat: ^0.2.14
mime: ^0.9.6+3
video_compress: ^2.1.1
visibility_detector: ^0.1.5