diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/MessageSetCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/MessageSetCompose.kt index 86a23914a..0bd1f1103 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/MessageSetCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/MessageSetCompose.kt @@ -39,9 +39,6 @@ import kotlinx.coroutines.launch fun MessageSetCompose(messageSetCard: MessageSetCard, routeForLastRead: String, accountViewModel: AccountViewModel, nav: (String) -> Unit) { val baseNote = remember { messageSetCard.note } - val noteState by baseNote.live().metadata.observeAsState() - val note = remember(noteState) { noteState?.note } - val accountState by accountViewModel.accountLiveData.observeAsState() val loggedIn = remember(accountState) { accountState?.account?.userProfile() } ?: return @@ -49,71 +46,69 @@ fun MessageSetCompose(messageSetCard: MessageSetCard, routeForLastRead: String, val scope = rememberCoroutineScope() - if (note == null) { - BlankNote(Modifier) - } else { - var isNew by remember { mutableStateOf(false) } + var isNew by remember { mutableStateOf(false) } - LaunchedEffect(key1 = messageSetCard.createdAt()) { - scope.launch(Dispatchers.IO) { - val newIsNew = - messageSetCard.createdAt() > NotificationCache.load(routeForLastRead) + LaunchedEffect(key1 = messageSetCard.createdAt()) { + launch(Dispatchers.IO) { + val newIsNew = + messageSetCard.createdAt() > NotificationCache.load(routeForLastRead) - NotificationCache.markAsRead(routeForLastRead, messageSetCard.createdAt()) + NotificationCache.markAsRead(routeForLastRead, messageSetCard.createdAt()) - if (newIsNew != isNew) { - isNew = newIsNew - } + if (newIsNew != isNew) { + isNew = newIsNew } } + } - val backgroundColor = if (isNew) { - MaterialTheme.colors.newItemBackgroundColor.compositeOver(MaterialTheme.colors.background) - } else { - MaterialTheme.colors.background - } + val backgroundColor = if (isNew) { + MaterialTheme.colors.newItemBackgroundColor.compositeOver(MaterialTheme.colors.background) + } else { + MaterialTheme.colors.background + } - val columnModifier = remember(isNew) { - Modifier - .background(backgroundColor) - .padding( - start = 12.dp, - end = 12.dp, - top = 10.dp - ) - .combinedClickable( - onClick = { - scope.launch { - routeFor( - baseNote, - loggedIn - )?.let { nav(it) } - } - }, - onLongClick = { popupExpanded = true } - ) - .fillMaxWidth() - } + val columnModifier = remember(isNew) { + Modifier + .background(backgroundColor) + .padding( + start = 12.dp, + end = 12.dp, + top = 10.dp + ) + .combinedClickable( + onClick = { + scope.launch { + routeFor( + baseNote, + loggedIn + )?.let { nav(it) } + } + }, + onLongClick = { popupExpanded = true } + ) + .fillMaxWidth() + } - Column(columnModifier) { - Row(Modifier.fillMaxWidth()) { - MessageIcon() + Column(columnModifier) { + Row(Modifier.fillMaxWidth()) { + MessageIcon() - Column(modifier = remember { Modifier.padding(start = 10.dp) }) { - val routeForLastRead = "Room/${(baseNote.event as? PrivateDmEvent)?.talkingWith(loggedIn.pubkeyHex)}" - - NoteCompose( - baseNote = baseNote, - routeForLastRead = routeForLastRead, - isBoostedNote = true, - addMarginTop = false, - parentBackgroundColor = null, - accountViewModel = accountViewModel, - nav = nav - ) - - NoteDropDownMenu(note, popupExpanded, { popupExpanded = false }, accountViewModel) + Column(modifier = remember { Modifier.padding(start = 10.dp) }) { + val routeForLastRead = remember(baseNote) { + "Room/${(baseNote.event as? PrivateDmEvent)?.talkingWith(loggedIn.pubkeyHex)}" } + + NoteCompose( + baseNote = baseNote, + routeForLastRead = routeForLastRead, + isBoostedNote = true, + addMarginTop = false, + parentBackgroundColor = null, + accountViewModel = accountViewModel, + nav = nav + ) + + NoteDropDownMenu(baseNote, popupExpanded, { popupExpanded = false }, accountViewModel) } } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt index 9010900ca..10daf8188 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt @@ -138,6 +138,8 @@ import com.vitorpamplona.amethyst.ui.screen.loggedIn.ReportNoteDialog import com.vitorpamplona.amethyst.ui.theme.BitcoinOrange import com.vitorpamplona.amethyst.ui.theme.Following import com.vitorpamplona.amethyst.ui.theme.newItemBackgroundColor +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -1528,7 +1530,7 @@ fun TimeAgo(time: Long) { var timeStr by remember { mutableStateOf("") } LaunchedEffect(key1 = time) { - withContext(Dispatchers.IO) { + launch(Dispatchers.IO) { val newTimeStr = timeAgo(time, context = context) if (newTimeStr != timeStr) { timeStr = newTimeStr @@ -2279,31 +2281,22 @@ private fun CreateImageHeader( @Composable private fun RelayBadges(baseNote: Note) { - val noteRelaysState by baseNote.live().relays.observeAsState() - val noteRelays = remember(noteRelaysState) { noteRelaysState?.note } ?: return - var expanded by remember { mutableStateOf(false) } var showShowMore by remember { mutableStateOf(false) } var lazyRelayList by remember { mutableStateOf(emptyList()) } - LaunchedEffect(key1 = noteRelaysState, key2 = expanded) { - launch(Dispatchers.IO) { - val relayList = noteRelays.relays.map { - it.removePrefix("wss://").removePrefix("ws://") - } + WatchRelayLists(baseNote) { relayList -> + val relaysToDisplay = if (expanded) relayList else relayList.take(3) + val shouldListChange = lazyRelayList.size < 3 || lazyRelayList.size != relayList.size - val relaysToDisplay = if (expanded) relayList else relayList.take(3) - val shouldListChange = lazyRelayList.size < 3 || lazyRelayList.size != relayList.size + if (shouldListChange) { + lazyRelayList = relaysToDisplay + } - if (shouldListChange) { - lazyRelayList = relaysToDisplay - } - - val nextShowMore = relayList.size > 3 && !expanded - if (nextShowMore != showShowMore) { - // only triggers recomposition when actually different - showShowMore = nextShowMore - } + val nextShowMore = relayList.size > 3 && !expanded + if (nextShowMore != showShowMore) { + // only triggers recomposition when actually different + showShowMore = nextShowMore } } @@ -2318,6 +2311,21 @@ private fun RelayBadges(baseNote: Note) { } } +@Composable +private fun WatchRelayLists(baseNote: Note, onListChanges: (ImmutableList) -> Unit) { + val noteRelaysState by baseNote.live().relays.observeAsState() + + LaunchedEffect(key1 = noteRelaysState) { + launch(Dispatchers.IO) { + val relayList = noteRelaysState?.note?.relays?.map { + it.removePrefix("wss://").removePrefix("ws://") + } ?: emptyList() + + onListChanges(relayList.toImmutableList()) + } + } +} + @OptIn(ExperimentalLayoutApi::class) @Composable @Stable @@ -2467,7 +2475,6 @@ fun UserPicture( } } -@OptIn(ExperimentalTime::class) @Composable fun UserPicture( userHex: String,