created loggedInWithAmber in accountViewModel, changed some events to use keypair
This commit is contained in:
@@ -169,8 +169,7 @@ class Account(
|
||||
val event = ContactListEvent.updateRelayList(
|
||||
earlierVersion = contactList,
|
||||
relayUse = relays,
|
||||
pubKey = keyPair.pubKey.toHexKey(),
|
||||
privateKey = keyPair.privKey
|
||||
keyPair = keyPair
|
||||
)
|
||||
|
||||
if (!signEvent) {
|
||||
@@ -188,8 +187,7 @@ class Account(
|
||||
followCommunities = listOf(),
|
||||
followEvents = DefaultChannels.toList(),
|
||||
relayUse = relays,
|
||||
privateKey = keyPair.privKey!!,
|
||||
publicKey = if (!signEvent) keyPair.pubKey else null
|
||||
keyPair = keyPair
|
||||
)
|
||||
|
||||
if (!signEvent) {
|
||||
@@ -511,11 +509,7 @@ class Account(
|
||||
if (followingCommunities.isNotEmpty()) {
|
||||
followingCommunities.forEach {
|
||||
ATag.parse(it, null)?.let {
|
||||
returningContactList = if (keyPair.privKey == null) {
|
||||
ContactListEvent.followAddressableEvent(returningContactList, it, keyPair.pubKey.toHexKey())
|
||||
} else {
|
||||
ContactListEvent.followAddressableEvent(returningContactList, it, keyPair.pubKey.toHexKey(), keyPair.privKey)
|
||||
}
|
||||
returningContactList = ContactListEvent.followAddressableEvent(returningContactList, it, keyPair)
|
||||
}
|
||||
}
|
||||
followingCommunities = emptySet()
|
||||
@@ -523,11 +517,7 @@ class Account(
|
||||
|
||||
if (followingChannels.isNotEmpty()) {
|
||||
followingChannels.forEach {
|
||||
returningContactList = if (keyPair.privKey == null) {
|
||||
ContactListEvent.followEvent(returningContactList, it, keyPair.pubKey.toHexKey())
|
||||
} else {
|
||||
ContactListEvent.followEvent(returningContactList, it, keyPair.pubKey.toHexKey(), keyPair.privKey)
|
||||
}
|
||||
returningContactList = ContactListEvent.followEvent(returningContactList, it, keyPair)
|
||||
}
|
||||
followingChannels = emptySet()
|
||||
}
|
||||
@@ -541,11 +531,7 @@ class Account(
|
||||
val contactList = migrateCommunitiesAndChannelsIfNeeded(userProfile().latestContactList)
|
||||
|
||||
val event = if (contactList != null) {
|
||||
if (signEvent) {
|
||||
ContactListEvent.followUser(contactList, user.pubkeyHex, keyPair.privKey!!)
|
||||
} else {
|
||||
ContactListEvent.followUser(contactList, user.pubkeyHex, keyPair.pubKey.toHexKey())
|
||||
}
|
||||
ContactListEvent.followUser(contactList, user.pubkeyHex, keyPair)
|
||||
} else {
|
||||
ContactListEvent.createFromScratch(
|
||||
followUsers = listOf(Contact(user.pubkeyHex, null)),
|
||||
@@ -554,8 +540,7 @@ class Account(
|
||||
followCommunities = emptyList(),
|
||||
followEvents = DefaultChannels.toList(),
|
||||
relayUse = Constants.defaultRelays.associate { it.url to ContactListEvent.ReadWrite(it.read, it.write) },
|
||||
privateKey = keyPair.privKey,
|
||||
publicKey = if (signEvent) null else keyPair.pubKey
|
||||
keyPair = keyPair
|
||||
)
|
||||
}
|
||||
|
||||
@@ -574,7 +559,7 @@ class Account(
|
||||
val contactList = migrateCommunitiesAndChannelsIfNeeded(userProfile().latestContactList)
|
||||
|
||||
val event = if (contactList != null) {
|
||||
ContactListEvent.followEvent(contactList, channel.idHex, keyPair.pubKey.toHexKey(), keyPair.privKey)
|
||||
ContactListEvent.followEvent(contactList, channel.idHex, keyPair)
|
||||
} else {
|
||||
ContactListEvent.createFromScratch(
|
||||
followUsers = emptyList(),
|
||||
@@ -583,8 +568,7 @@ class Account(
|
||||
followCommunities = emptyList(),
|
||||
followEvents = DefaultChannels.toList().plus(channel.idHex),
|
||||
relayUse = Constants.defaultRelays.associate { it.url to ContactListEvent.ReadWrite(it.read, it.write) },
|
||||
publicKey = if (!signEvent) keyPair.pubKey else null,
|
||||
privateKey = keyPair.privKey
|
||||
keyPair = keyPair
|
||||
)
|
||||
}
|
||||
|
||||
@@ -603,7 +587,7 @@ class Account(
|
||||
val contactList = migrateCommunitiesAndChannelsIfNeeded(userProfile().latestContactList)
|
||||
|
||||
val event = if (contactList != null) {
|
||||
ContactListEvent.followAddressableEvent(contactList, community.address, keyPair.pubKey.toHexKey(), keyPair.privKey)
|
||||
ContactListEvent.followAddressableEvent(contactList, community.address, keyPair)
|
||||
} else {
|
||||
val relays = Constants.defaultRelays.associate { it.url to ContactListEvent.ReadWrite(it.read, it.write) }
|
||||
ContactListEvent.createFromScratch(
|
||||
@@ -613,8 +597,7 @@ class Account(
|
||||
followCommunities = listOf(community.address),
|
||||
followEvents = DefaultChannels.toList(),
|
||||
relayUse = relays,
|
||||
publicKey = if (!signEvent) keyPair.pubKey else null,
|
||||
privateKey = keyPair.privKey
|
||||
keyPair = keyPair
|
||||
)
|
||||
}
|
||||
|
||||
@@ -633,19 +616,11 @@ class Account(
|
||||
val contactList = migrateCommunitiesAndChannelsIfNeeded(userProfile().latestContactList)
|
||||
|
||||
val event = if (contactList != null) {
|
||||
if (signEvent) {
|
||||
ContactListEvent.followHashtag(
|
||||
contactList,
|
||||
tag,
|
||||
keyPair.privKey!!
|
||||
)
|
||||
} else {
|
||||
ContactListEvent.followHashtag(
|
||||
contactList,
|
||||
tag,
|
||||
keyPair.pubKey.toHexKey()
|
||||
)
|
||||
}
|
||||
ContactListEvent.followHashtag(
|
||||
contactList,
|
||||
tag,
|
||||
keyPair
|
||||
)
|
||||
} else {
|
||||
ContactListEvent.createFromScratch(
|
||||
followUsers = emptyList(),
|
||||
@@ -654,8 +629,7 @@ class Account(
|
||||
followCommunities = emptyList(),
|
||||
followEvents = DefaultChannels.toList(),
|
||||
relayUse = Constants.defaultRelays.associate { it.url to ContactListEvent.ReadWrite(it.read, it.write) },
|
||||
privateKey = keyPair.privKey,
|
||||
publicKey = if (signEvent) null else keyPair.pubKey
|
||||
keyPair = keyPair
|
||||
)
|
||||
}
|
||||
|
||||
@@ -668,8 +642,8 @@ class Account(
|
||||
return null
|
||||
}
|
||||
|
||||
fun followGeohash(geohash: String) {
|
||||
if (!isWriteable()) return
|
||||
fun followGeohash(geohash: String, signEvent: Boolean): ContactListEvent? {
|
||||
if (!isWriteable() && signEvent) return null
|
||||
|
||||
val contactList = migrateCommunitiesAndChannelsIfNeeded(userProfile().latestContactList)
|
||||
|
||||
@@ -677,7 +651,7 @@ class Account(
|
||||
ContactListEvent.followGeohash(
|
||||
contactList,
|
||||
geohash,
|
||||
keyPair.privKey!!
|
||||
keyPair
|
||||
)
|
||||
} else {
|
||||
ContactListEvent.createFromScratch(
|
||||
@@ -687,12 +661,17 @@ class Account(
|
||||
followCommunities = emptyList(),
|
||||
followEvents = DefaultChannels.toList(),
|
||||
relayUse = Constants.defaultRelays.associate { it.url to ContactListEvent.ReadWrite(it.read, it.write) },
|
||||
privateKey = keyPair.privKey!!
|
||||
keyPair = keyPair
|
||||
)
|
||||
}
|
||||
|
||||
if (!signEvent) {
|
||||
return event
|
||||
}
|
||||
|
||||
Client.send(event)
|
||||
LocalCache.consume(event)
|
||||
return null
|
||||
}
|
||||
|
||||
fun unfollow(user: User, signEvent: Boolean = true): ContactListEvent? {
|
||||
@@ -701,20 +680,16 @@ class Account(
|
||||
val contactList = migrateCommunitiesAndChannelsIfNeeded(userProfile().latestContactList)
|
||||
|
||||
if (contactList != null && contactList.tags.isNotEmpty()) {
|
||||
if (!signEvent) {
|
||||
return ContactListEvent.unfollowUser(
|
||||
contactList,
|
||||
user.pubkeyHex,
|
||||
keyPair.pubKey.toHexKey()
|
||||
)
|
||||
}
|
||||
|
||||
val event = ContactListEvent.unfollowUser(
|
||||
contactList,
|
||||
user.pubkeyHex,
|
||||
keyPair.privKey!!
|
||||
keyPair
|
||||
)
|
||||
|
||||
if (!signEvent) {
|
||||
return event
|
||||
}
|
||||
|
||||
Client.send(event)
|
||||
LocalCache.consume(event)
|
||||
}
|
||||
@@ -728,20 +703,16 @@ class Account(
|
||||
val contactList = migrateCommunitiesAndChannelsIfNeeded(userProfile().latestContactList)
|
||||
|
||||
if (contactList != null && contactList.tags.isNotEmpty()) {
|
||||
if (!signEvent) {
|
||||
return ContactListEvent.unfollowHashtag(
|
||||
contactList,
|
||||
tag,
|
||||
keyPair.pubKey.toHexKey()
|
||||
)
|
||||
}
|
||||
|
||||
val event = ContactListEvent.unfollowHashtag(
|
||||
contactList,
|
||||
tag,
|
||||
keyPair.privKey!!
|
||||
keyPair
|
||||
)
|
||||
|
||||
if (!signEvent) {
|
||||
return event
|
||||
}
|
||||
|
||||
Client.send(event)
|
||||
LocalCache.consume(event)
|
||||
|
||||
@@ -751,8 +722,8 @@ class Account(
|
||||
return null
|
||||
}
|
||||
|
||||
fun unfollowGeohash(geohash: String) {
|
||||
if (!isWriteable()) return
|
||||
fun unfollowGeohash(geohash: String, signEvent: Boolean): ContactListEvent? {
|
||||
if (!isWriteable() && signEvent) return null
|
||||
|
||||
val contactList = migrateCommunitiesAndChannelsIfNeeded(userProfile().latestContactList)
|
||||
|
||||
@@ -760,12 +731,18 @@ class Account(
|
||||
val event = ContactListEvent.unfollowGeohash(
|
||||
contactList,
|
||||
geohash,
|
||||
keyPair.privKey!!
|
||||
keyPair
|
||||
)
|
||||
|
||||
if (!signEvent) {
|
||||
return event
|
||||
}
|
||||
|
||||
Client.send(event)
|
||||
LocalCache.consume(event)
|
||||
return null
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
fun unfollow(channel: Channel, signEvent: Boolean): ContactListEvent? {
|
||||
@@ -777,8 +754,7 @@ class Account(
|
||||
val event = ContactListEvent.unfollowEvent(
|
||||
contactList,
|
||||
channel.idHex,
|
||||
keyPair.pubKey.toHexKey(),
|
||||
keyPair.privKey
|
||||
keyPair
|
||||
)
|
||||
|
||||
if (!signEvent) {
|
||||
@@ -800,8 +776,7 @@ class Account(
|
||||
val event = ContactListEvent.unfollowAddressableEvent(
|
||||
contactList,
|
||||
community.address,
|
||||
keyPair.pubKey.toHexKey(),
|
||||
keyPair.privKey
|
||||
keyPair
|
||||
)
|
||||
|
||||
if (!signEvent) {
|
||||
|
||||
@@ -59,7 +59,6 @@ import com.vitorpamplona.amethyst.R
|
||||
import com.vitorpamplona.amethyst.model.LocalCache
|
||||
import com.vitorpamplona.amethyst.model.RelayInformation
|
||||
import com.vitorpamplona.amethyst.model.RelaySetupInfo
|
||||
import com.vitorpamplona.amethyst.service.PackageUtils
|
||||
import com.vitorpamplona.amethyst.service.relays.Client
|
||||
import com.vitorpamplona.amethyst.service.relays.Constants.defaultRelays
|
||||
import com.vitorpamplona.amethyst.service.relays.FeedType
|
||||
@@ -145,7 +144,7 @@ fun NewRelayListView(onClose: () -> Unit, accountViewModel: AccountViewModel, re
|
||||
|
||||
PostButton(
|
||||
onPost = {
|
||||
if (PackageUtils.isAmberInstalled(context)) {
|
||||
if (accountViewModel.loggedInWithAmber()) {
|
||||
event = postViewModel.create(false)
|
||||
} else {
|
||||
postViewModel.create(true)
|
||||
|
||||
@@ -29,7 +29,6 @@ import com.vitorpamplona.amethyst.R
|
||||
import com.vitorpamplona.amethyst.model.LocalCache
|
||||
import com.vitorpamplona.amethyst.model.Note
|
||||
import com.vitorpamplona.amethyst.model.User
|
||||
import com.vitorpamplona.amethyst.service.PackageUtils
|
||||
import com.vitorpamplona.amethyst.service.relays.Client
|
||||
import com.vitorpamplona.amethyst.ui.actions.SignerDialog
|
||||
import com.vitorpamplona.amethyst.ui.screen.ZapReqResponse
|
||||
@@ -233,7 +232,7 @@ fun ShowFollowingOrUnfollowingButton(
|
||||
if (isFollowing) {
|
||||
UnfollowButton {
|
||||
if (!accountViewModel.isWriteable()) {
|
||||
if (PackageUtils.isAmberInstalled(context)) {
|
||||
if (accountViewModel.loggedInWithAmber()) {
|
||||
event = accountViewModel.account.unfollow(baseAuthor, false)
|
||||
} else {
|
||||
scope.launch {
|
||||
@@ -255,7 +254,7 @@ fun ShowFollowingOrUnfollowingButton(
|
||||
} else {
|
||||
FollowButton {
|
||||
if (!accountViewModel.isWriteable()) {
|
||||
if (PackageUtils.isAmberInstalled(context)) {
|
||||
if (accountViewModel.loggedInWithAmber()) {
|
||||
event = accountViewModel.account.follow(baseAuthor, false)
|
||||
} else {
|
||||
scope.launch {
|
||||
|
||||
@@ -84,6 +84,10 @@ class AccountViewModel(val account: Account) : ViewModel() {
|
||||
return account.isWriteable()
|
||||
}
|
||||
|
||||
fun loggedInWithAmber(): Boolean {
|
||||
return account.loginWithAmber
|
||||
}
|
||||
|
||||
fun userProfile(): User {
|
||||
return account.userProfile()
|
||||
}
|
||||
|
||||
@@ -86,7 +86,6 @@ import com.vitorpamplona.amethyst.model.PublicChatChannel
|
||||
import com.vitorpamplona.amethyst.model.ServersAvailable
|
||||
import com.vitorpamplona.amethyst.model.User
|
||||
import com.vitorpamplona.amethyst.service.NostrChannelDataSource
|
||||
import com.vitorpamplona.amethyst.service.PackageUtils
|
||||
import com.vitorpamplona.amethyst.service.relays.Client
|
||||
import com.vitorpamplona.amethyst.ui.actions.NewChannelView
|
||||
import com.vitorpamplona.amethyst.ui.actions.NewMessageTagger
|
||||
@@ -1131,7 +1130,7 @@ fun JoinChatButton(accountViewModel: AccountViewModel, channel: Channel, nav: (S
|
||||
modifier = Modifier.padding(horizontal = 3.dp),
|
||||
onClick = {
|
||||
scope.launch(Dispatchers.IO) {
|
||||
event = accountViewModel.account.follow(channel, !PackageUtils.isAmberInstalled(context))
|
||||
event = accountViewModel.account.follow(channel, !accountViewModel.loggedInWithAmber())
|
||||
}
|
||||
},
|
||||
shape = ButtonBorder,
|
||||
@@ -1171,7 +1170,7 @@ fun LeaveChatButton(accountViewModel: AccountViewModel, channel: Channel, nav: (
|
||||
modifier = Modifier.padding(horizontal = 3.dp),
|
||||
onClick = {
|
||||
scope.launch(Dispatchers.IO) {
|
||||
event = accountViewModel.account.unfollow(channel, !PackageUtils.isAmberInstalled(context))
|
||||
event = accountViewModel.account.unfollow(channel, !accountViewModel.loggedInWithAmber())
|
||||
}
|
||||
},
|
||||
shape = ButtonBorder,
|
||||
@@ -1211,7 +1210,7 @@ fun JoinCommunityButton(accountViewModel: AccountViewModel, note: AddressableNot
|
||||
modifier = Modifier.padding(horizontal = 3.dp),
|
||||
onClick = {
|
||||
scope.launch(Dispatchers.IO) {
|
||||
event = accountViewModel.account.follow(note, !PackageUtils.isAmberInstalled(context))
|
||||
event = accountViewModel.account.follow(note, !accountViewModel.loggedInWithAmber())
|
||||
}
|
||||
},
|
||||
shape = ButtonBorder,
|
||||
@@ -1251,7 +1250,7 @@ fun LeaveCommunityButton(accountViewModel: AccountViewModel, note: AddressableNo
|
||||
modifier = Modifier.padding(horizontal = 3.dp),
|
||||
onClick = {
|
||||
scope.launch(Dispatchers.IO) {
|
||||
event = accountViewModel.account.unfollow(note, !PackageUtils.isAmberInstalled(context))
|
||||
event = accountViewModel.account.unfollow(note, !accountViewModel.loggedInWithAmber())
|
||||
}
|
||||
},
|
||||
shape = ButtonBorder,
|
||||
|
||||
@@ -31,11 +31,15 @@ import androidx.lifecycle.LifecycleEventObserver
|
||||
import androidx.lifecycle.viewmodel.compose.viewModel
|
||||
import com.fonfon.kgeohash.toGeoHash
|
||||
import com.vitorpamplona.amethyst.R
|
||||
import com.vitorpamplona.amethyst.model.LocalCache
|
||||
import com.vitorpamplona.amethyst.service.NostrGeohashDataSource
|
||||
import com.vitorpamplona.amethyst.service.ReverseGeoLocationUtil
|
||||
import com.vitorpamplona.amethyst.service.relays.Client
|
||||
import com.vitorpamplona.amethyst.ui.actions.SignerDialog
|
||||
import com.vitorpamplona.amethyst.ui.screen.NostrGeoHashFeedViewModel
|
||||
import com.vitorpamplona.amethyst.ui.screen.RefresheableFeedView
|
||||
import com.vitorpamplona.amethyst.ui.theme.StdPadding
|
||||
import com.vitorpamplona.quartz.events.Event
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
@@ -167,40 +171,65 @@ fun GeoHashActionOptions(
|
||||
userState?.user?.isFollowingGeohashCached(tag) ?: false
|
||||
}
|
||||
}
|
||||
var event by remember { mutableStateOf<Event?>(null) }
|
||||
if (event != null) {
|
||||
SignerDialog(
|
||||
onClose = {
|
||||
event = null
|
||||
},
|
||||
onPost = {
|
||||
scope.launch(Dispatchers.IO) {
|
||||
val signedEvent = Event.fromJson(it)
|
||||
Client.send(signedEvent)
|
||||
LocalCache.verifyAndConsume(signedEvent, null)
|
||||
event = null
|
||||
}
|
||||
},
|
||||
data = event!!.toJson()
|
||||
)
|
||||
}
|
||||
|
||||
if (isFollowingTag) {
|
||||
UnfollowButton {
|
||||
if (!accountViewModel.isWriteable()) {
|
||||
scope.launch {
|
||||
Toast
|
||||
.makeText(
|
||||
context,
|
||||
context.getString(R.string.login_with_a_private_key_to_be_able_to_unfollow),
|
||||
Toast.LENGTH_SHORT
|
||||
)
|
||||
.show()
|
||||
if (accountViewModel.loggedInWithAmber()) {
|
||||
event = accountViewModel.account.unfollowGeohash(tag, false)
|
||||
} else {
|
||||
scope.launch {
|
||||
Toast
|
||||
.makeText(
|
||||
context,
|
||||
context.getString(R.string.login_with_a_private_key_to_be_able_to_unfollow),
|
||||
Toast.LENGTH_SHORT
|
||||
)
|
||||
.show()
|
||||
}
|
||||
}
|
||||
} else {
|
||||
scope.launch(Dispatchers.IO) {
|
||||
accountViewModel.account.unfollowGeohash(tag)
|
||||
accountViewModel.account.unfollowGeohash(tag, true)
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
FollowButton {
|
||||
if (!accountViewModel.isWriteable()) {
|
||||
scope.launch {
|
||||
Toast
|
||||
.makeText(
|
||||
context,
|
||||
context.getString(R.string.login_with_a_private_key_to_be_able_to_follow),
|
||||
Toast.LENGTH_SHORT
|
||||
)
|
||||
.show()
|
||||
if (accountViewModel.loggedInWithAmber()) {
|
||||
event = accountViewModel.account.followGeohash(tag, false)
|
||||
} else {
|
||||
scope.launch {
|
||||
Toast
|
||||
.makeText(
|
||||
context,
|
||||
context.getString(R.string.login_with_a_private_key_to_be_able_to_follow),
|
||||
Toast.LENGTH_SHORT
|
||||
)
|
||||
.show()
|
||||
}
|
||||
}
|
||||
} else {
|
||||
scope.launch(Dispatchers.IO) {
|
||||
accountViewModel.account.followGeohash(tag)
|
||||
accountViewModel.account.followGeohash(tag, true)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,7 +32,6 @@ import androidx.lifecycle.viewmodel.compose.viewModel
|
||||
import com.vitorpamplona.amethyst.R
|
||||
import com.vitorpamplona.amethyst.model.LocalCache
|
||||
import com.vitorpamplona.amethyst.service.NostrHashtagDataSource
|
||||
import com.vitorpamplona.amethyst.service.PackageUtils
|
||||
import com.vitorpamplona.amethyst.service.relays.Client
|
||||
import com.vitorpamplona.amethyst.ui.actions.SignerDialog
|
||||
import com.vitorpamplona.amethyst.ui.screen.NostrHashtagFeedViewModel
|
||||
@@ -172,7 +171,7 @@ fun HashtagActionOptions(
|
||||
if (isFollowingTag) {
|
||||
UnfollowButton {
|
||||
if (!accountViewModel.isWriteable()) {
|
||||
if (PackageUtils.isAmberInstalled(context)) {
|
||||
if (accountViewModel.loggedInWithAmber()) {
|
||||
event = accountViewModel.account.unfollowHashtag(tag, false)
|
||||
} else {
|
||||
scope.launch {
|
||||
@@ -194,7 +193,7 @@ fun HashtagActionOptions(
|
||||
} else {
|
||||
FollowButton {
|
||||
if (!accountViewModel.isWriteable()) {
|
||||
if (PackageUtils.isAmberInstalled(context)) {
|
||||
if (accountViewModel.loggedInWithAmber()) {
|
||||
event = accountViewModel.account.followHashtag(tag, false)
|
||||
} else {
|
||||
scope.launch {
|
||||
|
||||
@@ -791,7 +791,7 @@ private fun DisplayFollowUnfollowButton(
|
||||
if (isUserFollowingLoggedIn) {
|
||||
FollowButton(R.string.follow_back) {
|
||||
if (!accountViewModel.isWriteable()) {
|
||||
if (PackageUtils.isAmberInstalled(context)) {
|
||||
if (accountViewModel.loggedInWithAmber()) {
|
||||
event = accountViewModel.account.follow(baseUser, false)
|
||||
} else {
|
||||
scope.launch {
|
||||
@@ -813,7 +813,7 @@ private fun DisplayFollowUnfollowButton(
|
||||
} else {
|
||||
FollowButton(R.string.follow) {
|
||||
if (!accountViewModel.isWriteable()) {
|
||||
if (PackageUtils.isAmberInstalled(context)) {
|
||||
if (accountViewModel.loggedInWithAmber()) {
|
||||
event = accountViewModel.account.follow(baseUser, false)
|
||||
} else {
|
||||
scope.launch {
|
||||
|
||||
Reference in New Issue
Block a user