mirror of
https://github.com/vitorpamplona/amethyst.git
synced 2024-09-29 16:30:49 +00:00
add cache to decrypted dms
This commit is contained in:
parent
59cde5699e
commit
a64c941f36
@ -11,6 +11,7 @@ import com.vitorpamplona.quartz.events.EventInterface
|
|||||||
object AmberUtils {
|
object AmberUtils {
|
||||||
var content: String = ""
|
var content: String = ""
|
||||||
var isActivityRunning: Boolean = false
|
var isActivityRunning: Boolean = false
|
||||||
|
val cachedDecryptedContent = mutableMapOf<HexKey, String>()
|
||||||
|
|
||||||
fun openAmber(
|
fun openAmber(
|
||||||
data: String,
|
data: String,
|
||||||
|
@ -1,5 +1,9 @@
|
|||||||
package com.vitorpamplona.amethyst.ui.note
|
package com.vitorpamplona.amethyst.ui.note
|
||||||
|
|
||||||
|
import android.app.Activity
|
||||||
|
import android.widget.Toast
|
||||||
|
import androidx.activity.compose.rememberLauncherForActivityResult
|
||||||
|
import androidx.activity.result.contract.ActivityResultContracts
|
||||||
import androidx.compose.animation.Crossfade
|
import androidx.compose.animation.Crossfade
|
||||||
import androidx.compose.foundation.background
|
import androidx.compose.foundation.background
|
||||||
import androidx.compose.foundation.clickable
|
import androidx.compose.foundation.clickable
|
||||||
@ -21,11 +25,13 @@ import androidx.compose.material.Text
|
|||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.LaunchedEffect
|
import androidx.compose.runtime.LaunchedEffect
|
||||||
import androidx.compose.runtime.MutableState
|
import androidx.compose.runtime.MutableState
|
||||||
|
import androidx.compose.runtime.SideEffect
|
||||||
import androidx.compose.runtime.derivedStateOf
|
import androidx.compose.runtime.derivedStateOf
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
import androidx.compose.runtime.livedata.observeAsState
|
import androidx.compose.runtime.livedata.observeAsState
|
||||||
import androidx.compose.runtime.mutableStateOf
|
import androidx.compose.runtime.mutableStateOf
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
|
import androidx.compose.runtime.rememberCoroutineScope
|
||||||
import androidx.compose.runtime.setValue
|
import androidx.compose.runtime.setValue
|
||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
@ -45,11 +51,14 @@ import androidx.compose.ui.unit.sp
|
|||||||
import androidx.lifecycle.distinctUntilChanged
|
import androidx.lifecycle.distinctUntilChanged
|
||||||
import androidx.lifecycle.map
|
import androidx.lifecycle.map
|
||||||
import com.patrykandpatrick.vico.core.extension.forEachIndexedExtended
|
import com.patrykandpatrick.vico.core.extension.forEachIndexedExtended
|
||||||
|
import com.vitorpamplona.amethyst.Amethyst
|
||||||
import com.vitorpamplona.amethyst.R
|
import com.vitorpamplona.amethyst.R
|
||||||
import com.vitorpamplona.amethyst.model.Channel
|
import com.vitorpamplona.amethyst.model.Channel
|
||||||
import com.vitorpamplona.amethyst.model.LocalCache
|
import com.vitorpamplona.amethyst.model.LocalCache
|
||||||
import com.vitorpamplona.amethyst.model.Note
|
import com.vitorpamplona.amethyst.model.Note
|
||||||
import com.vitorpamplona.amethyst.model.User
|
import com.vitorpamplona.amethyst.model.User
|
||||||
|
import com.vitorpamplona.amethyst.service.AmberUtils
|
||||||
|
import com.vitorpamplona.amethyst.ui.actions.SignerType
|
||||||
import com.vitorpamplona.amethyst.ui.components.CreateTextWithEmoji
|
import com.vitorpamplona.amethyst.ui.components.CreateTextWithEmoji
|
||||||
import com.vitorpamplona.amethyst.ui.components.RobohashAsyncImageProxy
|
import com.vitorpamplona.amethyst.ui.components.RobohashAsyncImageProxy
|
||||||
import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
|
import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
|
||||||
@ -68,6 +77,7 @@ import com.vitorpamplona.quartz.events.ChannelCreateEvent
|
|||||||
import com.vitorpamplona.quartz.events.ChannelMetadataEvent
|
import com.vitorpamplona.quartz.events.ChannelMetadataEvent
|
||||||
import com.vitorpamplona.quartz.events.ChatroomKey
|
import com.vitorpamplona.quartz.events.ChatroomKey
|
||||||
import com.vitorpamplona.quartz.events.ChatroomKeyable
|
import com.vitorpamplona.quartz.events.ChatroomKeyable
|
||||||
|
import com.vitorpamplona.quartz.events.PrivateDmEvent
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
|
||||||
@ -245,6 +255,7 @@ private fun UserRoomCompose(
|
|||||||
accountViewModel: AccountViewModel,
|
accountViewModel: AccountViewModel,
|
||||||
nav: (String) -> Unit
|
nav: (String) -> Unit
|
||||||
) {
|
) {
|
||||||
|
val scope = rememberCoroutineScope()
|
||||||
val hasNewMessages = remember { mutableStateOf<Boolean>(false) }
|
val hasNewMessages = remember { mutableStateOf<Boolean>(false) }
|
||||||
|
|
||||||
val route = remember(room) {
|
val route = remember(room) {
|
||||||
@ -256,10 +267,42 @@ private fun UserRoomCompose(
|
|||||||
note.createdAt()
|
note.createdAt()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
val decryptedContent = remember(note) { if (note.event == null) null else AmberUtils.cachedDecryptedContent[note.event!!.id()] }
|
||||||
|
var content by remember(note) {
|
||||||
|
mutableStateOf(
|
||||||
|
decryptedContent ?: accountViewModel.decrypt(note)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
val content by remember(note) {
|
val activityLauncher = rememberLauncherForActivityResult(
|
||||||
derivedStateOf {
|
contract = ActivityResultContracts.StartActivityForResult(),
|
||||||
accountViewModel.decrypt(note)
|
onResult = {
|
||||||
|
if (it.resultCode != Activity.RESULT_OK) {
|
||||||
|
scope.launch(Dispatchers.Main) {
|
||||||
|
Toast.makeText(
|
||||||
|
Amethyst.instance,
|
||||||
|
"Sign request rejected",
|
||||||
|
Toast.LENGTH_SHORT
|
||||||
|
).show()
|
||||||
|
}
|
||||||
|
return@rememberLauncherForActivityResult
|
||||||
|
}
|
||||||
|
val event = note.event
|
||||||
|
|
||||||
|
AmberUtils.cachedDecryptedContent[event!!.id()] = it.data?.getStringExtra("signature") ?: ""
|
||||||
|
content = AmberUtils.cachedDecryptedContent[event.id()]
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
if (accountViewModel.loggedInWithAmber() && decryptedContent == null && note.event is PrivateDmEvent) {
|
||||||
|
val event = note.event
|
||||||
|
SideEffect {
|
||||||
|
AmberUtils.openAmber(
|
||||||
|
event?.content() ?: "",
|
||||||
|
SignerType.NIP04_DECRYPT,
|
||||||
|
activityLauncher,
|
||||||
|
(event as PrivateDmEvent).talkingWith(accountViewModel.userProfile().pubkeyHex)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,9 @@
|
|||||||
package com.vitorpamplona.amethyst.ui.note
|
package com.vitorpamplona.amethyst.ui.note
|
||||||
|
|
||||||
|
import android.app.Activity
|
||||||
|
import android.widget.Toast
|
||||||
|
import androidx.activity.compose.rememberLauncherForActivityResult
|
||||||
|
import androidx.activity.result.contract.ActivityResultContracts
|
||||||
import androidx.compose.animation.Crossfade
|
import androidx.compose.animation.Crossfade
|
||||||
import androidx.compose.foundation.ExperimentalFoundationApi
|
import androidx.compose.foundation.ExperimentalFoundationApi
|
||||||
import androidx.compose.foundation.clickable
|
import androidx.compose.foundation.clickable
|
||||||
@ -22,11 +26,13 @@ import androidx.compose.material.Text
|
|||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.LaunchedEffect
|
import androidx.compose.runtime.LaunchedEffect
|
||||||
import androidx.compose.runtime.MutableState
|
import androidx.compose.runtime.MutableState
|
||||||
|
import androidx.compose.runtime.SideEffect
|
||||||
import androidx.compose.runtime.derivedStateOf
|
import androidx.compose.runtime.derivedStateOf
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
import androidx.compose.runtime.livedata.observeAsState
|
import androidx.compose.runtime.livedata.observeAsState
|
||||||
import androidx.compose.runtime.mutableStateOf
|
import androidx.compose.runtime.mutableStateOf
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
|
import androidx.compose.runtime.rememberCoroutineScope
|
||||||
import androidx.compose.runtime.setValue
|
import androidx.compose.runtime.setValue
|
||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
@ -41,10 +47,11 @@ import androidx.compose.ui.res.stringResource
|
|||||||
import androidx.compose.ui.text.font.FontWeight
|
import androidx.compose.ui.text.font.FontWeight
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.lifecycle.map
|
import androidx.lifecycle.map
|
||||||
|
import com.vitorpamplona.amethyst.Amethyst
|
||||||
import com.vitorpamplona.amethyst.R
|
import com.vitorpamplona.amethyst.R
|
||||||
import com.vitorpamplona.amethyst.model.Note
|
import com.vitorpamplona.amethyst.model.Note
|
||||||
import com.vitorpamplona.amethyst.model.User
|
import com.vitorpamplona.amethyst.model.User
|
||||||
import com.vitorpamplona.amethyst.ui.actions.SignerDialog
|
import com.vitorpamplona.amethyst.service.AmberUtils
|
||||||
import com.vitorpamplona.amethyst.ui.actions.SignerType
|
import com.vitorpamplona.amethyst.ui.actions.SignerType
|
||||||
import com.vitorpamplona.amethyst.ui.components.CreateClickableTextWithEmoji
|
import com.vitorpamplona.amethyst.ui.components.CreateClickableTextWithEmoji
|
||||||
import com.vitorpamplona.amethyst.ui.components.CreateTextWithEmoji
|
import com.vitorpamplona.amethyst.ui.components.CreateTextWithEmoji
|
||||||
@ -65,7 +72,6 @@ import com.vitorpamplona.amethyst.ui.theme.StdVertSpacer
|
|||||||
import com.vitorpamplona.amethyst.ui.theme.mediumImportanceLink
|
import com.vitorpamplona.amethyst.ui.theme.mediumImportanceLink
|
||||||
import com.vitorpamplona.amethyst.ui.theme.placeholderText
|
import com.vitorpamplona.amethyst.ui.theme.placeholderText
|
||||||
import com.vitorpamplona.amethyst.ui.theme.subtleBorder
|
import com.vitorpamplona.amethyst.ui.theme.subtleBorder
|
||||||
import com.vitorpamplona.quartz.encoders.toHexKey
|
|
||||||
import com.vitorpamplona.quartz.events.ChannelCreateEvent
|
import com.vitorpamplona.quartz.events.ChannelCreateEvent
|
||||||
import com.vitorpamplona.quartz.events.ChannelMetadataEvent
|
import com.vitorpamplona.quartz.events.ChannelMetadataEvent
|
||||||
import com.vitorpamplona.quartz.events.ChatMessageEvent
|
import com.vitorpamplona.quartz.events.ChatMessageEvent
|
||||||
@ -630,24 +636,41 @@ private fun RenderRegularTextNote(
|
|||||||
nav: (String) -> Unit
|
nav: (String) -> Unit
|
||||||
) {
|
) {
|
||||||
val tags = remember(note.event) { note.event?.tags()?.toImmutableListOfLists() ?: ImmutableListOfLists() }
|
val tags = remember(note.event) { note.event?.tags()?.toImmutableListOfLists() ?: ImmutableListOfLists() }
|
||||||
var eventContent by remember { mutableStateOf(accountViewModel.decrypt(note)) }
|
val decryptedContent = remember(note.event) { if (note.event == null) null else AmberUtils.cachedDecryptedContent[note.event!!.id()] }
|
||||||
|
var eventContent by remember { mutableStateOf(decryptedContent ?: accountViewModel.decrypt(note)) }
|
||||||
val modifier = remember { Modifier.padding(top = 5.dp) }
|
val modifier = remember { Modifier.padding(top = 5.dp) }
|
||||||
val loggedInWithAmber = accountViewModel.loggedInWithAmber()
|
val scope = rememberCoroutineScope()
|
||||||
var triedToDecrypt by remember { mutableStateOf(false) }
|
|
||||||
if (loggedInWithAmber && !triedToDecrypt && note.event is PrivateDmEvent) {
|
val activityLauncher = rememberLauncherForActivityResult(
|
||||||
SignerDialog(
|
contract = ActivityResultContracts.StartActivityForResult(),
|
||||||
onClose = {
|
onResult = {
|
||||||
triedToDecrypt = true
|
if (it.resultCode != Activity.RESULT_OK) {
|
||||||
eventContent = accountViewModel.decrypt(note)
|
scope.launch(Dispatchers.Main) {
|
||||||
},
|
Toast.makeText(
|
||||||
onPost = {
|
Amethyst.instance,
|
||||||
eventContent = it
|
"Sign request rejected",
|
||||||
triedToDecrypt = true
|
Toast.LENGTH_SHORT
|
||||||
},
|
).show()
|
||||||
data = eventContent ?: "",
|
}
|
||||||
type = SignerType.NIP04_DECRYPT,
|
return@rememberLauncherForActivityResult
|
||||||
pubKey = (note.event as PrivateDmEvent).talkingWith(accountViewModel.account.keyPair.pubKey.toHexKey()) ?: ""
|
}
|
||||||
|
val event = note.event
|
||||||
|
|
||||||
|
AmberUtils.cachedDecryptedContent[event!!.id()] = it.data?.getStringExtra("signature") ?: ""
|
||||||
|
eventContent = AmberUtils.cachedDecryptedContent[event.id()]
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if (accountViewModel.loggedInWithAmber() && decryptedContent == null && note.event is PrivateDmEvent) {
|
||||||
|
val event = note.event
|
||||||
|
SideEffect {
|
||||||
|
AmberUtils.openAmber(
|
||||||
|
event?.content() ?: "",
|
||||||
|
SignerType.NIP04_DECRYPT,
|
||||||
|
activityLauncher,
|
||||||
|
(event as PrivateDmEvent).talkingWith(accountViewModel.userProfile().pubkeyHex)
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (eventContent != null) {
|
if (eventContent != null) {
|
||||||
|
@ -1570,7 +1570,8 @@ private fun RenderPrivateMessage(
|
|||||||
val scope = rememberCoroutineScope()
|
val scope = rememberCoroutineScope()
|
||||||
|
|
||||||
if (withMe) {
|
if (withMe) {
|
||||||
var eventContent by remember { mutableStateOf(accountViewModel.decrypt(note)) }
|
val decryptedContent = AmberUtils.cachedDecryptedContent[noteEvent.id]
|
||||||
|
var eventContent by remember { mutableStateOf(decryptedContent ?: accountViewModel.decrypt(note)) }
|
||||||
val activityLauncher = rememberLauncherForActivityResult(
|
val activityLauncher = rememberLauncherForActivityResult(
|
||||||
contract = ActivityResultContracts.StartActivityForResult(),
|
contract = ActivityResultContracts.StartActivityForResult(),
|
||||||
onResult = {
|
onResult = {
|
||||||
@ -1584,11 +1585,11 @@ private fun RenderPrivateMessage(
|
|||||||
}
|
}
|
||||||
return@rememberLauncherForActivityResult
|
return@rememberLauncherForActivityResult
|
||||||
}
|
}
|
||||||
|
AmberUtils.cachedDecryptedContent[noteEvent.id] = it.data?.getStringExtra("signature") ?: ""
|
||||||
eventContent = it.data?.getStringExtra("signature") ?: ""
|
eventContent = AmberUtils.cachedDecryptedContent[noteEvent.id]
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
if (accountViewModel.loggedInWithAmber()) {
|
if (accountViewModel.loggedInWithAmber() && decryptedContent == null) {
|
||||||
val event = note.event
|
val event = note.event
|
||||||
SideEffect {
|
SideEffect {
|
||||||
AmberUtils.openAmber(
|
AmberUtils.openAmber(
|
||||||
|
Loading…
Reference in New Issue
Block a user