use correct response model
This commit is contained in:
+2
-1
@@ -61,4 +61,5 @@ doc/api/
|
||||
|
||||
fvm
|
||||
google-services.json
|
||||
example/ios/dist
|
||||
example/ios/dist
|
||||
.vscode/
|
||||
@@ -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) {},
|
||||
)
|
||||
|
||||
@@ -78,7 +78,7 @@ class SearchTextField extends StatelessWidget {
|
||||
Future.microtask(
|
||||
() => [
|
||||
controller.clear(),
|
||||
onChanged(''),
|
||||
if (onChanged != null) onChanged(''),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
@@ -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,
|
||||
);
|
||||
},
|
||||
);
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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),
|
||||
],
|
||||
),
|
||||
);
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user