diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/RelaySetupInfo.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/RelaySetupInfo.kt index e7310cdbf..6f9094c54 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/RelaySetupInfo.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/RelaySetupInfo.kt @@ -22,16 +22,11 @@ package com.vitorpamplona.amethyst.model import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.service.relays.FeedType -import com.vitorpamplona.amethyst.service.relays.RelayStat @Immutable data class RelaySetupInfo( val url: String, val read: Boolean, val write: Boolean, - val relayStat: RelayStat = RelayStat(), val feedTypes: Set, - val paidRelay: Boolean = false, -) { - val briefInfo: RelayBriefInfoCache.RelayBriefInfo = RelayBriefInfoCache.RelayBriefInfo(url) -} +) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/relays/AllRelayListView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/relays/AllRelayListView.kt index f19d7896c..0dbf3bc8f 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/relays/AllRelayListView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/relays/AllRelayListView.kt @@ -237,7 +237,7 @@ fun ResetKind3Relays(postViewModel: Kind3RelayListViewModel) { OutlinedButton( onClick = { postViewModel.deleteAll() - Constants.defaultRelays.forEach { postViewModel.addRelay(it) } + postViewModel.addAll(Constants.defaultRelays) postViewModel.loadRelayDocuments() }, ) { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/relays/BasicRelaySetupInfo.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/relays/BasicRelaySetupInfo.kt index 7ae0cbc9e..be695f995 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/relays/BasicRelaySetupInfo.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/relays/BasicRelaySetupInfo.kt @@ -22,6 +22,7 @@ package com.vitorpamplona.amethyst.ui.actions.relays import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.RelayBriefInfoCache +import com.vitorpamplona.amethyst.service.relays.FeedType import com.vitorpamplona.amethyst.service.relays.RelayStat @Immutable @@ -32,3 +33,15 @@ data class BasicRelaySetupInfo( ) { val briefInfo: RelayBriefInfoCache.RelayBriefInfo = RelayBriefInfoCache.RelayBriefInfo(url) } + +@Immutable +data class Kind3BasicRelaySetupInfo( + val url: String, + val read: Boolean, + val write: Boolean, + val feedTypes: Set, + val relayStat: RelayStat, + val paidRelay: Boolean = false, +) { + val briefInfo: RelayBriefInfoCache.RelayBriefInfo = RelayBriefInfoCache.RelayBriefInfo(url) +} diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/relays/Kind3RelayListView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/relays/Kind3RelayListView.kt index 1aa78cbc7..d90d287af 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/relays/Kind3RelayListView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/relays/Kind3RelayListView.kt @@ -68,7 +68,6 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.model.RelayBriefInfoCache -import com.vitorpamplona.amethyst.model.RelaySetupInfo import com.vitorpamplona.amethyst.service.Nip11CachedRetriever import com.vitorpamplona.amethyst.service.Nip11Retriever import com.vitorpamplona.amethyst.service.relays.Constants @@ -96,7 +95,7 @@ import kotlinx.coroutines.launch @Composable fun Kind3RelayListView( - feedState: List, + feedState: List, postViewModel: Kind3RelayListViewModel, accountViewModel: AccountViewModel, onClose: () -> Unit, @@ -111,7 +110,7 @@ fun Kind3RelayListView( } fun LazyListScope.renderKind3Items( - feedState: List, + feedState: List, postViewModel: Kind3RelayListViewModel, accountViewModel: AccountViewModel, onClose: () -> Unit, @@ -148,7 +147,7 @@ fun ServerConfigPreview() { ClickableRelayItem( loadProfilePicture = true, item = - RelaySetupInfo( + Kind3BasicRelaySetupInfo( url = "nostr.mom", read = true, write = true, @@ -176,15 +175,15 @@ fun ServerConfigPreview() { @Composable fun LoadRelayInfo( - item: RelaySetupInfo, - onToggleDownload: (RelaySetupInfo) -> Unit, - onToggleUpload: (RelaySetupInfo) -> Unit, - onToggleFollows: (RelaySetupInfo) -> Unit, - onTogglePrivateDMs: (RelaySetupInfo) -> Unit, - onTogglePublicChats: (RelaySetupInfo) -> Unit, - onToggleGlobal: (RelaySetupInfo) -> Unit, - onToggleSearch: (RelaySetupInfo) -> Unit, - onDelete: (RelaySetupInfo) -> Unit, + item: Kind3BasicRelaySetupInfo, + onToggleDownload: (Kind3BasicRelaySetupInfo) -> Unit, + onToggleUpload: (Kind3BasicRelaySetupInfo) -> Unit, + onToggleFollows: (Kind3BasicRelaySetupInfo) -> Unit, + onTogglePrivateDMs: (Kind3BasicRelaySetupInfo) -> Unit, + onTogglePublicChats: (Kind3BasicRelaySetupInfo) -> Unit, + onToggleGlobal: (Kind3BasicRelaySetupInfo) -> Unit, + onToggleSearch: (Kind3BasicRelaySetupInfo) -> Unit, + onDelete: (Kind3BasicRelaySetupInfo) -> Unit, accountViewModel: AccountViewModel, nav: (String) -> Unit, ) { @@ -267,16 +266,16 @@ fun LoadRelayInfo( @Composable fun ClickableRelayItem( - item: RelaySetupInfo, + item: Kind3BasicRelaySetupInfo, loadProfilePicture: Boolean, - onToggleDownload: (RelaySetupInfo) -> Unit, - onToggleUpload: (RelaySetupInfo) -> Unit, - onToggleFollows: (RelaySetupInfo) -> Unit, - onTogglePrivateDMs: (RelaySetupInfo) -> Unit, - onTogglePublicChats: (RelaySetupInfo) -> Unit, - onToggleGlobal: (RelaySetupInfo) -> Unit, - onToggleSearch: (RelaySetupInfo) -> Unit, - onDelete: (RelaySetupInfo) -> Unit, + onToggleDownload: (Kind3BasicRelaySetupInfo) -> Unit, + onToggleUpload: (Kind3BasicRelaySetupInfo) -> Unit, + onToggleFollows: (Kind3BasicRelaySetupInfo) -> Unit, + onTogglePrivateDMs: (Kind3BasicRelaySetupInfo) -> Unit, + onTogglePublicChats: (Kind3BasicRelaySetupInfo) -> Unit, + onToggleGlobal: (Kind3BasicRelaySetupInfo) -> Unit, + onToggleSearch: (Kind3BasicRelaySetupInfo) -> Unit, + onDelete: (Kind3BasicRelaySetupInfo) -> Unit, onClick: () -> Unit, ) { Column(Modifier.fillMaxWidth()) { @@ -337,9 +336,9 @@ fun ClickableRelayItem( @Composable @OptIn(ExperimentalFoundationApi::class) private fun StatusRow( - item: RelaySetupInfo, - onToggleDownload: (RelaySetupInfo) -> Unit, - onToggleUpload: (RelaySetupInfo) -> Unit, + item: Kind3BasicRelaySetupInfo, + onToggleDownload: (Kind3BasicRelaySetupInfo) -> Unit, + onToggleUpload: (Kind3BasicRelaySetupInfo) -> Unit, modifier: Modifier, ) { val scope = rememberCoroutineScope() @@ -489,11 +488,11 @@ private fun StatusRow( @Composable @OptIn(ExperimentalFoundationApi::class) private fun ActiveToggles( - item: RelaySetupInfo, - onToggleFollows: (RelaySetupInfo) -> Unit, - onTogglePrivateDMs: (RelaySetupInfo) -> Unit, - onTogglePublicChats: (RelaySetupInfo) -> Unit, - onToggleGlobal: (RelaySetupInfo) -> Unit, + item: Kind3BasicRelaySetupInfo, + onToggleFollows: (Kind3BasicRelaySetupInfo) -> Unit, + onTogglePrivateDMs: (Kind3BasicRelaySetupInfo) -> Unit, + onTogglePublicChats: (Kind3BasicRelaySetupInfo) -> Unit, + onToggleGlobal: (Kind3BasicRelaySetupInfo) -> Unit, ) { val scope = rememberCoroutineScope() val context = LocalContext.current @@ -643,9 +642,9 @@ private fun ActiveToggles( @Composable private fun FirstLine( - item: RelaySetupInfo, + item: Kind3BasicRelaySetupInfo, onClick: () -> Unit, - onDelete: (RelaySetupInfo) -> Unit, + onDelete: (Kind3BasicRelaySetupInfo) -> Unit, modifier: Modifier, ) { Row(verticalAlignment = Alignment.CenterVertically, modifier = modifier) { @@ -684,7 +683,7 @@ private fun FirstLine( @Composable fun Kind3RelayEditBox( relayToAdd: String, - onNewRelay: (RelaySetupInfo) -> Unit, + onNewRelay: (Kind3BasicRelaySetupInfo) -> Unit, ) { var url by remember { mutableStateOf(relayToAdd) } var read by remember { mutableStateOf(true) } @@ -739,11 +738,12 @@ fun Kind3RelayEditBox( if (url.isNotBlank() && url != "/") { val addedWSS = RelayUrlFormatter.normalize(url) onNewRelay( - RelaySetupInfo( - addedWSS, - read, - write, + Kind3BasicRelaySetupInfo( + url = addedWSS, + read = read, + write = write, feedTypes = FeedType.entries.toSet(), + relayStat = RelayStat(), ), ) url = "" diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/relays/Kind3RelayListViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/relays/Kind3RelayListViewModel.kt index 4d09dbb35..18ac9e0b4 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/relays/Kind3RelayListViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/relays/Kind3RelayListViewModel.kt @@ -38,7 +38,7 @@ import kotlinx.coroutines.launch class Kind3RelayListViewModel : ViewModel() { private lateinit var account: Account - private val _relays = MutableStateFlow>(emptyList()) + private val _relays = MutableStateFlow>(emptyList()) val relays = _relays.asStateFlow() var hasModified = false @@ -52,7 +52,16 @@ class Kind3RelayListViewModel : ViewModel() { fun create() { if (hasModified) { viewModelScope.launch(Dispatchers.IO) { - account.saveKind3RelayList(relays.value) + account.saveKind3RelayList( + relays.value.map { + RelaySetupInfo( + it.url, + it.read, + it.write, + it.feedTypes, + ) + }, + ) clear() } } @@ -91,12 +100,12 @@ class Kind3RelayListViewModel : ViewModel() { ?.feedTypes ?: FeedType.values().toSet().toImmutableSet() - RelaySetupInfo( - it.key, - it.value.read, - it.value.write, - RelayStats.get(it.key), - localInfoFeedTypes, + Kind3BasicRelaySetupInfo( + url = it.key, + read = it.value.read, + write = it.value.write, + feedTypes = localInfoFeedTypes, + relayStat = RelayStats.get(it.key), ) } .distinctBy { it.url } @@ -105,12 +114,12 @@ class Kind3RelayListViewModel : ViewModel() { } else { account.localRelays .map { - RelaySetupInfo( - it.url, - it.read, - it.write, - RelayStats.get(it.url), - it.feedTypes, + Kind3BasicRelaySetupInfo( + url = it.url, + read = it.read, + write = it.write, + feedTypes = it.feedTypes, + relayStat = RelayStats.get(it.url), ) } .distinctBy { it.url } @@ -120,7 +129,26 @@ class Kind3RelayListViewModel : ViewModel() { } } - fun addRelay(relay: RelaySetupInfo) { + fun addAll(defaultRelays: Array) { + hasModified = true + + _relays.update { + defaultRelays.map { + Kind3BasicRelaySetupInfo( + url = it.url, + read = it.read, + write = it.write, + feedTypes = it.feedTypes, + relayStat = RelayStats.get(it.url), + ) + } + .distinctBy { it.url } + .sortedBy { it.relayStat.receivedBytes } + .reversed() + } + } + + fun addRelay(relay: Kind3BasicRelaySetupInfo) { if (relays.value.any { it.url == relay.url }) return _relays.update { it.plus(relay) } @@ -128,7 +156,7 @@ class Kind3RelayListViewModel : ViewModel() { hasModified = true } - fun deleteRelay(relay: RelaySetupInfo) { + fun deleteRelay(relay: Kind3BasicRelaySetupInfo) { _relays.update { it.minus(relay) } hasModified = true } @@ -138,48 +166,48 @@ class Kind3RelayListViewModel : ViewModel() { hasModified = true } - fun toggleDownload(relay: RelaySetupInfo) { + fun toggleDownload(relay: Kind3BasicRelaySetupInfo) { _relays.update { it.updated(relay, relay.copy(read = !relay.read)) } hasModified = true } - fun toggleUpload(relay: RelaySetupInfo) { + fun toggleUpload(relay: Kind3BasicRelaySetupInfo) { _relays.update { it.updated(relay, relay.copy(write = !relay.write)) } hasModified = true } - fun toggleFollows(relay: RelaySetupInfo) { + fun toggleFollows(relay: Kind3BasicRelaySetupInfo) { val newTypes = togglePresenceInSet(relay.feedTypes, FeedType.FOLLOWS) _relays.update { it.updated(relay, relay.copy(feedTypes = newTypes)) } hasModified = true } - fun toggleMessages(relay: RelaySetupInfo) { + fun toggleMessages(relay: Kind3BasicRelaySetupInfo) { val newTypes = togglePresenceInSet(relay.feedTypes, FeedType.PRIVATE_DMS) _relays.update { it.updated(relay, relay.copy(feedTypes = newTypes)) } hasModified = true } - fun togglePublicChats(relay: RelaySetupInfo) { + fun togglePublicChats(relay: Kind3BasicRelaySetupInfo) { val newTypes = togglePresenceInSet(relay.feedTypes, FeedType.PUBLIC_CHATS) _relays.update { it.updated(relay, relay.copy(feedTypes = newTypes)) } hasModified = true } - fun toggleGlobal(relay: RelaySetupInfo) { + fun toggleGlobal(relay: Kind3BasicRelaySetupInfo) { val newTypes = togglePresenceInSet(relay.feedTypes, FeedType.GLOBAL) _relays.update { it.updated(relay, relay.copy(feedTypes = newTypes)) } hasModified = true } - fun toggleSearch(relay: RelaySetupInfo) { + fun toggleSearch(relay: Kind3BasicRelaySetupInfo) { val newTypes = togglePresenceInSet(relay.feedTypes, FeedType.SEARCH) _relays.update { it.updated(relay, relay.copy(feedTypes = newTypes)) } hasModified = true } fun togglePaidRelay( - relay: RelaySetupInfo, + relay: Kind3BasicRelaySetupInfo, paid: Boolean, ) { _relays.update { it.updated(relay, relay.copy(paidRelay = paid)) }