From 056d00b73b51b9cc467e3f06e15b6260d3b3ea32 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Sun, 28 May 2023 15:16:50 -0400 Subject: [PATCH] Performance Improvements when rendering a channel creation note --- .../amethyst/ui/note/NoteCompose.kt | 17 +++++---- .../ui/screen/loggedIn/ChannelScreen.kt | 37 +++++++++++++++++-- 2 files changed, 42 insertions(+), 12 deletions(-) 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 86ce4ff2b..cb26011cd 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 @@ -162,7 +162,7 @@ fun NoteCompose( val noteForReports = remember(noteReportsState) { noteReportsState?.note } ?: return val noteEvent = remember(noteState) { note.event } - val baseChannel = remember(noteState) { note.channel() } + val channelHex = remember(noteState) { note.channelHex() } val isSensitive = remember(noteState) { note.event?.isSensitive() ?: false } var popupExpanded by remember { mutableStateOf(false) } @@ -212,8 +212,8 @@ fun NoteCompose( nav, onClick = { showHiddenNote = true } ) - } else if ((noteEvent is ChannelCreateEvent || noteEvent is ChannelMetadataEvent) && baseChannel != null) { - ChannelHeader(baseChannel = baseChannel, account = account, nav = nav) + } else if ((noteEvent is ChannelCreateEvent || noteEvent is ChannelMetadataEvent) && channelHex != null) { + ChannelHeader(channelHex = channelHex, account = account, nav = nav) } else if (noteEvent is BadgeDefinitionEvent) { BadgeDisplay(baseNote = note) } else if (noteEvent is FileHeaderEvent) { @@ -581,14 +581,15 @@ private fun RenderPrivateMessage( val noteEvent = note.event as? PrivateDmEvent ?: return val withMe = remember { noteEvent.with(accountViewModel.userProfile().pubkeyHex) } - val tags = remember(note.event?.id()) { note.event?.tags() } - val hashtags = remember(note.event?.id()) { note.event?.hashtags() ?: emptyList() } - val modifier = remember(note.event?.id()) { Modifier.fillMaxWidth() } - val isAuthorTheLoggedUser = remember(note.event?.id()) { accountViewModel.isLoggedUser(note.author) } if (withMe) { val eventContent = remember { accountViewModel.decrypt(note) } + val hashtags = remember(note.event?.id()) { note.event?.hashtags() ?: emptyList() } + val modifier = remember(note.event?.id()) { Modifier.fillMaxWidth() } + val isAuthorTheLoggedUser = remember(note.event?.id()) { accountViewModel.isLoggedUser(note.author) } + val tags = remember(note.event?.id()) { note.event?.tags() } + if (eventContent != null) { if (makeItShort && isAuthorTheLoggedUser) { Text( @@ -628,7 +629,7 @@ private fun RenderPrivateMessage( ), canPreview = !makeItShort, Modifier.fillMaxWidth(), - noteEvent.tags(), + emptyList(), backgroundColor, accountViewModel, nav diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChannelScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChannelScreen.kt index 52f082482..78dbf4223 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChannelScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChannelScreen.kt @@ -40,6 +40,7 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -63,6 +64,7 @@ import androidx.lifecycle.viewmodel.compose.viewModel import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.model.Channel +import com.vitorpamplona.amethyst.model.LocalCache import com.vitorpamplona.amethyst.model.Note import com.vitorpamplona.amethyst.service.NostrChannelDataSource import com.vitorpamplona.amethyst.ui.actions.NewChannelView @@ -77,6 +79,8 @@ import com.vitorpamplona.amethyst.ui.navigation.Route import com.vitorpamplona.amethyst.ui.note.ChatroomMessageCompose import com.vitorpamplona.amethyst.ui.screen.ChatroomFeedView import com.vitorpamplona.amethyst.ui.screen.NostrChannelFeedViewModel +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch @Composable fun ChannelScreen( @@ -158,7 +162,12 @@ fun ChannelScreen( Spacer(modifier = Modifier.height(10.dp)) - Row(Modifier.padding(horizontal = 10.dp).animateContentSize(), verticalAlignment = Alignment.CenterVertically) { + Row( + Modifier + .padding(horizontal = 10.dp) + .animateContentSize(), + verticalAlignment = Alignment.CenterVertically + ) { val replyingNote = replyTo.value if (replyingNote != null) { Column(Modifier.weight(1f)) { @@ -182,7 +191,9 @@ fun ChannelScreen( Icon( imageVector = Icons.Default.Cancel, null, - modifier = Modifier.padding(end = 5.dp).size(30.dp), + modifier = Modifier + .padding(end = 5.dp) + .size(30.dp), tint = MaterialTheme.colors.onSurface.copy(alpha = 0.32f) ) } @@ -192,7 +203,9 @@ fun ChannelScreen( // LAST ROW Row( - modifier = Modifier.padding(start = 10.dp, end = 10.dp, bottom = 10.dp, top = 5.dp).fillMaxWidth(), + modifier = Modifier + .padding(start = 10.dp, end = 10.dp, bottom = 10.dp, top = 5.dp) + .fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically ) { @@ -246,10 +259,26 @@ fun ChannelScreen( } } +@Composable +fun ChannelHeader(channelHex: String, account: Account, nav: (String) -> Unit) { + var baseChannel by remember { mutableStateOf(null) } + val scope = rememberCoroutineScope() + + LaunchedEffect(key1 = channelHex) { + scope.launch(Dispatchers.IO) { + baseChannel = LocalCache.checkGetOrCreateChannel(channelHex) + } + } + + baseChannel?.let { + ChannelHeader(it, account, nav) + } +} + @Composable fun ChannelHeader(baseChannel: Channel, account: Account, nav: (String) -> Unit) { val channelState by baseChannel.live.observeAsState() - val channel = channelState?.channel ?: return + val channel = remember(channelState) { channelState?.channel } ?: return val context = LocalContext.current.applicationContext