Merge pull request #628 from GetStream/hotfix/timestampReverseMessageList
fix(ui): date divider in not reverse message list
This commit is contained in:
@@ -45,6 +45,7 @@ breakdown:
|
|||||||
🐞 Fixed
|
🐞 Fixed
|
||||||
|
|
||||||
- Fixed `MessageInput` textField case where `input` is not enabled if the file picked from the camera is null.
|
- Fixed `MessageInput` textField case where `input` is not enabled if the file picked from the camera is null.
|
||||||
|
- Fixed date dividers position/alignment in non reversed `MessageListView`.
|
||||||
|
|
||||||
## 2.1.2
|
## 2.1.2
|
||||||
|
|
||||||
|
|||||||
@@ -505,8 +505,14 @@ class _MessageListViewState extends State<MessageListView> {
|
|||||||
|
|
||||||
if (i == 1 || i == itemCount - 4) return const Offstage();
|
if (i == 1 || i == itemCount - 4) return const Offstage();
|
||||||
|
|
||||||
final message = messages[i - 1];
|
late final Message message, nextMessage;
|
||||||
final nextMessage = messages[i - 2];
|
if (widget.reverse) {
|
||||||
|
message = messages[i - 1];
|
||||||
|
nextMessage = messages[i - 2];
|
||||||
|
} else {
|
||||||
|
message = messages[i - 2];
|
||||||
|
nextMessage = messages[i - 1];
|
||||||
|
}
|
||||||
if (!Jiffy(message.createdAt.toLocal()).isSame(
|
if (!Jiffy(message.createdAt.toLocal()).isSame(
|
||||||
nextMessage.createdAt.toLocal(),
|
nextMessage.createdAt.toLocal(),
|
||||||
Units.DAY,
|
Units.DAY,
|
||||||
@@ -636,8 +642,7 @@ class _MessageListViewState extends State<MessageListView> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Positioned _buildFloatingDateDivider(int itemCount) => Positioned(
|
Positioned _buildFloatingDateDivider(int itemCount) => Positioned(
|
||||||
top: widget.reverse ? 20 : null,
|
top: 20,
|
||||||
bottom: widget.reverse ? null : 20,
|
|
||||||
left: 0,
|
left: 0,
|
||||||
right: 0,
|
right: 0,
|
||||||
child: BetterStreamBuilder<Iterable<ItemPosition>>(
|
child: BetterStreamBuilder<Iterable<ItemPosition>>(
|
||||||
@@ -647,19 +652,36 @@ class _MessageListViewState extends State<MessageListView> {
|
|||||||
if (a == null || b == null) {
|
if (a == null || b == null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
final aTop = _getTopElementIndex(a);
|
if (widget.reverse) {
|
||||||
final bTop = _getTopElementIndex(b);
|
final aTop = _getTopElementIndex(a);
|
||||||
return aTop == bTop;
|
final bTop = _getTopElementIndex(b);
|
||||||
|
return aTop == bTop;
|
||||||
|
} else {
|
||||||
|
final aBottom = _getBottomElementIndex(a);
|
||||||
|
final bBottom = _getBottomElementIndex(b);
|
||||||
|
return aBottom == bBottom;
|
||||||
|
}
|
||||||
},
|
},
|
||||||
builder: (context, values) {
|
builder: (context, values) {
|
||||||
if (values.isEmpty || messages.isEmpty) {
|
if (values.isEmpty || messages.isEmpty) {
|
||||||
return const Offstage();
|
return const Offstage();
|
||||||
}
|
}
|
||||||
|
|
||||||
final index = _getTopElementIndex(values);
|
int? index;
|
||||||
|
if (widget.reverse) {
|
||||||
|
index = _getTopElementIndex(values);
|
||||||
|
} else {
|
||||||
|
index = _getBottomElementIndex(values);
|
||||||
|
}
|
||||||
|
|
||||||
if (index == null || index <= 2 || index >= itemCount - 3) {
|
if (index == null) return const Offstage();
|
||||||
return const Offstage();
|
|
||||||
|
if (index <= 2 || index >= itemCount - 3) {
|
||||||
|
if (widget.reverse) {
|
||||||
|
index = itemCount - 4;
|
||||||
|
} else {
|
||||||
|
index = 2;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final message = messages[index - 2];
|
final message = messages[index - 2];
|
||||||
@@ -685,6 +707,15 @@ class _MessageListViewState extends State<MessageListView> {
|
|||||||
.index;
|
.index;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int? _getBottomElementIndex(Iterable<ItemPosition> values) {
|
||||||
|
final inView = values.where((position) => position.itemLeadingEdge < 1);
|
||||||
|
if (inView.isEmpty) return null;
|
||||||
|
return inView
|
||||||
|
.reduce((min, position) =>
|
||||||
|
position.itemLeadingEdge < min.itemLeadingEdge ? position : min)
|
||||||
|
.index;
|
||||||
|
}
|
||||||
|
|
||||||
Widget _buildScrollToBottom() => StreamBuilder<Tuple2<bool, int>>(
|
Widget _buildScrollToBottom() => StreamBuilder<Tuple2<bool, int>>(
|
||||||
stream: Rx.combineLatest2(
|
stream: Rx.combineLatest2(
|
||||||
streamChannel!.channel.state!.isUpToDateStream.distinct(),
|
streamChannel!.channel.state!.isUpToDateStream.distinct(),
|
||||||
|
|||||||
Reference in New Issue
Block a user