-
Notifications
You must be signed in to change notification settings - Fork 15
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix chats does not sorting by local messages (#701) #765
base: main
Are you sure you want to change the base?
Changes from 3 commits
e31f96e
4ca2302
3667b48
b68a180
4692421
1fda154
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -142,6 +142,9 @@ class HiveRxChat extends RxChat { | |
/// [Timer] unmuting the muted [chat] when its [MuteDuration.until] expires. | ||
Timer? _muteTimer; | ||
|
||
/// [ChatItemHiveProvider.boxEvents] subscription. | ||
StreamIterator<BoxEvent>? _localSubscription; | ||
|
||
/// [ChatRepository.chatEvents] subscription. | ||
/// | ||
/// May be uninitialized since connection establishment may fail. | ||
|
@@ -245,19 +248,6 @@ class HiveRxChat extends RxChat { | |
return null; | ||
} | ||
|
||
@override | ||
ChatItem? get lastItem { | ||
ChatItem? item = chat.value.lastItem; | ||
if (messages.isNotEmpty) { | ||
final ChatItem last = messages.last.value; | ||
if (item?.at.isBefore(last.at) == true) { | ||
item = last; | ||
} | ||
} | ||
|
||
return item; | ||
} | ||
|
||
@override | ||
Stream<void> get updates => _controller.stream; | ||
|
||
|
@@ -380,6 +370,8 @@ class HiveRxChat extends RxChat { | |
|
||
await _local.init(userId: me); | ||
|
||
_initLocalSubscription(); | ||
|
||
HiveChatItem? item; | ||
if (chat.value.lastReadItem != null) { | ||
item = await get(chat.value.lastReadItem!); | ||
|
@@ -402,6 +394,7 @@ class HiveRxChat extends RxChat { | |
_aroundToken.cancel(); | ||
_muteTimer?.cancel(); | ||
_readTimer?.cancel(); | ||
_localSubscription?.cancel(); | ||
_remoteSubscription?.close(immediate: true); | ||
_remoteSubscription = null; | ||
_paginationSubscription?.cancel(); | ||
|
@@ -1063,6 +1056,46 @@ class HiveRxChat extends RxChat { | |
} | ||
} | ||
|
||
/// Initializes [ChatItemHiveProvider.boxEvents] subscription. | ||
Future<void> _initLocalSubscription() async { | ||
_localSubscription = StreamIterator(_local.boxEvents); | ||
while (await _localSubscription!.moveNext()) { | ||
final BoxEvent event = _localSubscription!.current; | ||
final ChatItemKey key = ChatItemKey.fromString(event.key); | ||
|
||
Comment on lines
+1077
to
+1083
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Во всём этом меня смущает только одна вещь - если тут механизм забарахлит и по какой-то причине не будет добавлено сообщение, которое по факту будет последним, то мы банально заблокируем чат в старом состоянии без возможности это сообщение где-нибудь увидеть - счётчик снизу на "чаты" будет "1", по факту сообщение было добавлено, но не рисуется. Эта проблема, #691, иногда воспроизводится - висит последнее сообщение какое-либо, но в списке сообщений оно не рисуется. Помогает несколько рефрешей страницы и прокрутка вверх/вниз, напрягает - это уже неправильное поведение. Боюсь, с заменой Кстати, есть мысли, что и это, и #691 связаны с #777 - вероятно, события в чат могут прилетать, но игнорироваться, т.к. страница пагинации уже версию обновила на свежую? Предлагаю решить эти два issue сначала, а потом merge'ить этот PR, с ним всё остальное LGTM. |
||
if (event.deleted) { | ||
if (chat.value.lastItem?.key == key) { | ||
final HiveChat? chatEntity = await _chatLocal.get(id); | ||
|
||
if (chatEntity != null) { | ||
if (_local.keys.isNotEmpty) { | ||
final HiveChatItem? item = await _local.get(_local.keys.last); | ||
if (item != null) { | ||
chatEntity.value.lastItem = item.value; | ||
chatEntity.value.updatedAt = item.value.at; | ||
} | ||
} else { | ||
chatEntity.value.lastItem = null; | ||
} | ||
|
||
await _chatRepository.put(chatEntity, ignoreVersion: true); | ||
} | ||
} | ||
} else { | ||
final HiveChatItem item = event.value; | ||
if (item.value.at.isAfter(chat.value.updatedAt)) { | ||
final HiveChat? chatEntity = await _chatLocal.get(id); | ||
|
||
if (chatEntity != null) { | ||
chatEntity.value.updatedAt = item.value.at; | ||
chatEntity.value.lastItem = item.value; | ||
await _chatRepository.put(chatEntity, ignoreVersion: true); | ||
} | ||
} | ||
} | ||
} | ||
} | ||
|
||
/// Initializes [ChatRepository.chatEvents] subscription. | ||
Future<void> _initRemoteSubscription() async { | ||
if (_disposed) { | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -447,6 +447,8 @@ class ChatController extends GetxController { | |
|
||
if (!PlatformUtils.isMobile) { | ||
Future.delayed(Duration.zero, send.field.focus.requestFocus); | ||
} else { | ||
send.field.focus.requestFocus(); | ||
Comment on lines
+441
to
+442
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @SleepySquash Тут каждый раз при отправке сообщения на телефоне терялся фокус и скрывалась клавитура. Мне кажется что намного удобней чтобы фокус оставался. |
||
} | ||
} | ||
} | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@SleepySquash Нешел небольшой баг, если в чате много непрочитаных cообщений, то локальные сообщения не будут добавляться в пагинацию либо в хайв. Пока что не придумал как можно это пофиксить, но когда реализуется наша идея с хайвом с пробелами, эта проблема уйдет.
Видео
2023-12-26.12-30-50.mp4