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