@@ -16,7 +16,10 @@ import com.getcode.model.chat.ChatMessage
1616import com.getcode.model.Cursor
1717import com.getcode.model.ID
1818import com.getcode.model.MessageStatus
19+ import com.getcode.model.chat.ChatMember
1920import com.getcode.model.chat.ChatType
21+ import com.getcode.model.chat.Identity
22+ import com.getcode.model.chat.Platform
2023import com.getcode.model.chat.Title
2124import com.getcode.model.chat.isConversation
2225import com.getcode.model.chat.selfId
@@ -43,6 +46,7 @@ import kotlinx.coroutines.flow.asStateFlow
4346import kotlinx.coroutines.flow.filterNotNull
4447import kotlinx.coroutines.flow.map
4548import kotlinx.coroutines.flow.update
49+ import kotlinx.coroutines.launch
4650import okhttp3.internal.toImmutableList
4751import timber.log.Timber
4852import java.util.Locale
@@ -54,6 +58,7 @@ import javax.inject.Singleton
5458class HistoryController @Inject constructor(
5559 private val client : Client ,
5660 private val resources : ResourceHelper ,
61+ private val tipController : TipController ,
5762 private val conversationMapper : ConversationMapper ,
5863 private val conversationMessageMapper : ConversationMessageMapper ,
5964) : CoroutineScope by CoroutineScope(Dispatchers .IO ) {
@@ -132,13 +137,15 @@ class HistoryController @Inject constructor(
132137 }
133138
134139 containers.onEach { chat ->
135- val result = fetchLatestMessageForChat(chat)
140+ val members = fetchMemberImages(chat)
141+ val updatedChat = chat.copy(members = members)
142+ val result = fetchLatestMessageForChat(updatedChat)
136143 result.onSuccess { message ->
137144 if (message != null ) {
138- updatedWithMessages.add(chat .copy(messages = listOf (message)))
145+ updatedWithMessages.add(updatedChat .copy(messages = listOf (message)))
139146 }
140147 }.onFailure {
141- updatedWithMessages.add(chat )
148+ updatedWithMessages.add(updatedChat )
142149 }
143150 }
144151
@@ -163,8 +170,8 @@ class HistoryController @Inject constructor(
163170 to = newestMessage.id,
164171 status = MessageStatus .Read
165172 ).onSuccess {
166- this [index] = chat.resetUnreadCount()
167- }
173+ this [index] = chat.resetUnreadCount()
174+ }
168175 }
169176 }
170177 }?.toList()
@@ -234,7 +241,13 @@ class HistoryController @Inject constructor(
234241 result.map { message -> conversationMessageMapper.map(chat.id to message) }
235242 val memberId = chat.selfId ? : return @onSuccess
236243 val latestRef = messages.maxBy { it.dateMillis }
237- client.advancePointer(owner, chat, latestRef.id, memberId, MessageStatus .Delivered )
244+ client.advancePointer(
245+ owner,
246+ chat,
247+ latestRef.id,
248+ memberId,
249+ MessageStatus .Delivered
250+ )
238251 }
239252
240253 }
@@ -251,11 +264,7 @@ class HistoryController @Inject constructor(
251264 // map revealed identity as title if known
252265 if (chat.isConversation) {
253266 val conversation = conversationMapper.map(chat)
254- if (conversation.user != null ) {
255- chat.copy(title = Title .Localized (conversation.user))
256- } else {
257- chat
258- }
267+ conversation.name?.let { chat.copy(title = Title .Localized (it)) } ? : chat
259268 } else {
260269 chat
261270 }
@@ -278,6 +287,26 @@ class HistoryController @Inject constructor(
278287 }
279288 return result.getOrNull().orEmpty()
280289 }
290+
291+ private suspend fun fetchMemberImages (chat : Chat ): List <ChatMember > {
292+ return chat.members
293+ .map { member ->
294+ if (member.isSelf) return @map member
295+ if (member.identity == null ) return @map member
296+ if (member.identity.imageUrl != null ) return @map member
297+ val metadata = runCatching {
298+ tipController.fetch(member.identity.username)
299+ }.getOrNull() ? : return @map member
300+
301+ member.copy(
302+ identity = Identity (
303+ platform = Platform .named(metadata.platform),
304+ username = metadata.username,
305+ imageUrl = metadata.imageUrl
306+ )
307+ )
308+ }
309+ }
281310}
282311
283312fun Title?.localized (resources : ResourceHelper ): String {
0 commit comments