Skip to content

Commit a679186

Browse files
committed
DROID-3298 fixes
1 parent 87528f4 commit a679186

File tree

5 files changed

+57
-93
lines changed

5 files changed

+57
-93
lines changed

core-models/src/main/java/com/anytypeio/anytype/core_models/Command.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -650,7 +650,7 @@ sealed class Command {
650650
val beforeOrderId: Id? = null,
651651
val afterOrderId: Id? = null,
652652
val limit: Int,
653-
val includeBoundary: Boolean
653+
val includeBoundary: Boolean = false
654654
) : ChatCommand() {
655655
data class Response(
656656
val messages: List<Chat.Message>,

domain/src/main/java/com/anytypeio/anytype/domain/chats/ChatContainer.kt

+7-6
Original file line numberDiff line numberDiff line change
@@ -120,8 +120,8 @@ class ChatContainer @Inject constructor(
120120
var intent: Intent = Intent.None
121121

122122
val initial = buildList<Chat.Message> {
123-
if (false) {
124-
val aroundUnread = loadToMessageOrder(
123+
if (state.hasUnReadMessages && !state.olderMessageOrderId.isNullOrEmpty()) {
124+
val aroundUnread = loadAroundMessageOrder(
125125
chat = chat,
126126
order = state.olderMessageOrderId.orEmpty()
127127
).also {
@@ -167,7 +167,7 @@ class ChatContainer @Inject constructor(
167167
}
168168
is Transformation.Commands.LoadAround -> {
169169
val messages = try {
170-
loadToMessage(chat, transform.message)
170+
loadAroundMessage(chat, transform.message)
171171
} catch (e: Exception) {
172172
logger.logException(e, "DROID-2966 Error while loading reply context")
173173
state.messages
@@ -248,7 +248,7 @@ class ChatContainer @Inject constructor(
248248
}
249249

250250
@Throws
251-
private suspend fun loadToMessage(
251+
private suspend fun loadAroundMessage(
252252
chat: Id,
253253
msg: Id
254254
): List<Chat.Message> {
@@ -288,7 +288,7 @@ class ChatContainer @Inject constructor(
288288
}
289289

290290
@Throws
291-
private suspend fun loadToMessageOrder(
291+
private suspend fun loadAroundMessageOrder(
292292
chat: Id,
293293
order: Id
294294
): List<Chat.Message> {
@@ -304,7 +304,8 @@ class ChatContainer @Inject constructor(
304304
Command.ChatCommand.GetMessages(
305305
chat = chat,
306306
afterOrderId = order,
307-
limit = DEFAULT_CHAT_PAGING_SIZE
307+
limit = DEFAULT_CHAT_PAGING_SIZE,
308+
includeBoundary = true
308309
)
309310
).messages
310311

feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/presentation/ChatViewModel.kt

+3-2
Original file line numberDiff line numberDiff line change
@@ -137,8 +137,9 @@ class ChatViewModel @Inject constructor(
137137
chatContainer.fetchAttachments(vmParams.space).distinctUntilChanged(),
138138
chatContainer.fetchReplies(chat = chat).distinctUntilChanged()
139139
) { result, dependencies, replies ->
140-
Timber.d("DROID-2966 Chat counter state: ${result.state}")
141-
Timber.d("DROID-2966 Got chat results: ${result.messages.size}")
140+
Timber.d("DROID-2966 Chat counter state from container: ${result.state}")
141+
Timber.d("DROID-2966 Intent from container: ${result.intent}")
142+
Timber.d("DROID-2966 Message results size from container: ${result.messages.size}")
142143
var previousDate: ChatView.DateSection? = null
143144
val messageViews = buildList<ChatView> {
144145
result.messages.forEach { msg ->

feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/ui/ChatScreen.kt

+44-83
Original file line numberDiff line numberDiff line change
@@ -239,56 +239,6 @@ fun ChatScreenWrapper(
239239
}
240240
}
241241

242-
@Composable
243-
fun LazyListState.OnBottomReached(
244-
thresholdItems: Int = 0,
245-
onBottomReached: () -> Unit
246-
) {
247-
LaunchedEffect(this) {
248-
var prevIndex = firstVisibleItemIndex
249-
snapshotFlow { firstVisibleItemIndex }
250-
.distinctUntilChanged()
251-
.collect { index ->
252-
Timber.d("DROID-2966 OnBottomReached scroll index: $index")
253-
val isDragging = isScrollInProgress
254-
255-
// Are we scrolling *toward* the bottom edge?
256-
val scrollingDown = isDragging && prevIndex > index
257-
258-
// Have we crossed into the threshold zone?
259-
val atBottom = index <= thresholdItems
260-
261-
if (scrollingDown && atBottom) {
262-
onBottomReached()
263-
}
264-
prevIndex = index
265-
}
266-
}
267-
}
268-
269-
@Composable
270-
private fun LazyListState.OnTopReached(
271-
thresholdItems: Int = 0,
272-
onTopReached: () -> Unit
273-
) {
274-
val isReached = remember {
275-
derivedStateOf {
276-
val lastVisibleItem = layoutInfo.visibleItemsInfo.lastOrNull()
277-
if (lastVisibleItem != null) {
278-
lastVisibleItem.index >= layoutInfo.totalItemsCount - 1 - thresholdItems
279-
} else {
280-
false
281-
}
282-
}
283-
}
284-
285-
LaunchedEffect(isReached) {
286-
snapshotFlow { isReached.value }
287-
.distinctUntilChanged()
288-
.collect { if (it) onTopReached() }
289-
}
290-
}
291-
292242
@Composable
293243
private fun LazyListState.OnTopReachedSafely(
294244
thresholdItems: Int = 0,
@@ -303,7 +253,6 @@ private fun LazyListState.OnTopReachedSafely(
303253
if (lastVisibleItem != null) {
304254
val isTop = lastVisibleItem.index >= info.totalItemsCount - 1 - thresholdItems
305255
if (isTop) {
306-
Timber.d("DROID-2966 Safe onTopReached triggered")
307256
onTopReached()
308257
}
309258
}
@@ -325,7 +274,6 @@ private fun LazyListState.OnBottomReachedSafely(
325274
if (firstVisibleItem != null) {
326275
val isBottom = firstVisibleItem.index <= thresholdItems
327276
if (isBottom) {
328-
Timber.d("DROID-2966 Safe onBottomReached triggered")
329277
onBottomReached()
330278
}
331279
}
@@ -369,7 +317,7 @@ fun ChatScreen(
369317
onScrollToBottomClicked: () -> Unit
370318
) {
371319

372-
Timber.d("DROID-2966 Render called with state")
320+
Timber.d("DROID-2966 Render called with state, number of messages: ${uiMessageState.messages.size}")
373321

374322
var text by rememberSaveable(stateSaver = TextFieldValue.Saver) {
375323
mutableStateOf(TextFieldValue())
@@ -381,15 +329,20 @@ fun ChatScreen(
381329

382330
val scope = rememberCoroutineScope()
383331

332+
val latestMessages by rememberUpdatedState(uiMessageState.messages)
333+
334+
val isPerformingScrollIntent = remember { mutableStateOf(false) }
335+
384336
LaunchedEffect(uiMessageState.intent) {
385337
when (val intent = uiMessageState.intent) {
386338
is ChatContainer.Intent.ScrollToMessage -> {
339+
isPerformingScrollIntent.value = true
387340
val index = uiMessageState.messages.indexOfFirst {
388341
it is ChatView.Message && it.id == intent.id
389342
}
390343

391344
if (index >= 0) {
392-
Timber.d("DROID-2966 Waiting for layout to stabilize...")
345+
Timber.d("DROID-2966 Found the scrolling target at index: $index. Waiting for layout to stabilize...")
393346

394347
snapshotFlow { lazyListState.layoutInfo.totalItemsCount }
395348
.first { it > index }
@@ -409,20 +362,24 @@ fun ChatScreen(
409362

410363
val delta = itemCenterFromTop - viewportCenter
411364

412-
Timber.d("DROID-2966 Calculated delta for centering (reverseLayout-aware): $delta")
365+
Timber.d("DROID-2966 Found scroll-target item info and Calculated delta for centering (reverseLayout-aware): $delta")
413366

414367
// move negatively because reverseLayout flips
415-
lazyListState.animateScrollBy(delta.toFloat())
368+
// lazyListState.animateScrollBy(delta.toFloat())
416369

417370
Timber.d("DROID-2966 Scroll complete. Now clearing intent.")
418371

419-
onClearIntent()
420372
} else {
421373
Timber.w("DROID-2966 Target item not found after scroll!")
422374
}
375+
} else {
376+
Timber.d("DROID-2966 Could not found the scrolling target for the intent")
423377
}
378+
// onClearIntent()
379+
isPerformingScrollIntent.value = false
424380
}
425381
is ChatContainer.Intent.ScrollToBottom -> {
382+
Timber.d("DROID-2966 COMPOSE scroll to bottom")
426383
smoothScrollToBottom2(lazyListState)
427384
onClearIntent()
428385
}
@@ -433,32 +390,36 @@ fun ChatScreen(
433390
}
434391
}
435392

436-
val latestMessages by rememberUpdatedState(uiMessageState.messages)
437-
438393
// Scrolling to bottom when list size changes and we are at the bottom of the list
439-
LaunchedEffect(latestMessages) {
440-
if (lazyListState.firstVisibleItemScrollOffset == 0) {
441-
scope.launch {
442-
lazyListState.animateScrollToItem(0)
443-
}
444-
}
445-
}
446-
447-
lazyListState.OnBottomReachedSafely(
448-
thresholdItems = 3
449-
) {
450-
if (latestMessages.isNotEmpty()) {
451-
onChatScrolledToBottom()
452-
}
453-
}
454-
455-
lazyListState.OnTopReachedSafely(
456-
thresholdItems = 3
457-
) {
458-
if (latestMessages.isNotEmpty()) {
459-
onChatScrolledToTop()
460-
}
461-
}
394+
// LaunchedEffect(latestMessages) {
395+
// if (lazyListState.firstVisibleItemScrollOffset == 0) {
396+
// scope.launch {
397+
// lazyListState.animateScrollToItem(0)
398+
// }
399+
// }
400+
// }
401+
402+
// lazyListState.OnBottomReachedSafely(
403+
// thresholdItems = 3
404+
// ) {
405+
// if (!isPerformingScrollIntent.value && latestMessages.isNotEmpty()) {
406+
// Timber.d("DROID-2966 Safe onBottomReached dispatched from compose to VM")
407+
// onChatScrolledToBottom()
408+
// } else {
409+
// Timber.d("DROID-2966 Safe onBottomReached skipped")
410+
// }
411+
// }
412+
//
413+
// lazyListState.OnTopReachedSafely(
414+
// thresholdItems = 3
415+
// ) {
416+
// if (!isPerformingScrollIntent.value && latestMessages.isNotEmpty()) {
417+
// Timber.d("DROID-2966 Safe onTopReached dispatched from compose to VM")
418+
// onChatScrolledToTop()
419+
// } else {
420+
// Timber.d("DROID-2966 Safe onTopReached skipped")
421+
// }
422+
// }
462423

463424
Column(
464425
modifier = Modifier.fillMaxSize()
@@ -684,7 +645,7 @@ fun Messages(
684645
onMentionClicked: (Id) -> Unit,
685646
onScrollToReplyClicked: (Id) -> Unit,
686647
) {
687-
Timber.d("DROID-2966 Messages composition: ${messages.map { if (it is ChatView.Message) it.content.msg else it }}")
648+
// Timber.d("DROID-2966 Messages composition: ${messages.map { if (it is ChatView.Message) it.content.msg else it }}")
688649
val scope = rememberCoroutineScope()
689650
LazyColumn(
690651
modifier = modifier,

middleware/src/main/java/com/anytypeio/anytype/middleware/interactor/Middleware.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -2787,7 +2787,8 @@ class Middleware @Inject constructor(
27872787
chatObjectId = command.chat,
27882788
beforeOrderId = command.beforeOrderId.orEmpty(),
27892789
afterOrderId = command.afterOrderId.orEmpty(),
2790-
limit = command.limit
2790+
limit = command.limit,
2791+
includeBoundary = command.includeBoundary
27912792
)
27922793
logRequestIfDebug(request)
27932794
val (response, time) = measureTimedValue { service.chatGetMessages(request) }

0 commit comments

Comments
 (0)