desktop: use correct remote host when creating/connecting via links (#3409)

This commit is contained in:
Evgeny Poberezkin 2023-11-20 20:56:05 +00:00 committed by GitHub
parent 96d3c9988c
commit 7f5efd8927
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 43 additions and 39 deletions

View File

@ -9,10 +9,11 @@ import dev.icerock.moko.resources.compose.painterResource
import dev.icerock.moko.resources.compose.stringResource
import androidx.compose.ui.unit.sp
import chat.simplex.common.model.ChatModel
import chat.simplex.common.model.RemoteHostInfo
import chat.simplex.res.MR
@Composable
actual fun ConnectViaLinkView(m: ChatModel, rhId: Long?, close: () -> Unit) {
actual fun ConnectViaLinkView(m: ChatModel, rh: RemoteHostInfo?, close: () -> Unit) {
// TODO this should close if remote host changes in model
val selection = remember {
mutableStateOf(
@ -32,10 +33,10 @@ actual fun ConnectViaLinkView(m: ChatModel, rhId: Long?, close: () -> Unit) {
Column(Modifier.weight(1f)) {
when (selection.value) {
ConnectViaLinkTab.SCAN -> {
ScanToConnectView(m, rhId, close)
ScanToConnectView(m, rh, close)
}
ConnectViaLinkTab.PASTE -> {
PasteToConnectView(m, rhId, close)
PasteToConnectView(m, rh, close)
}
}
}

View File

@ -4,17 +4,18 @@ import android.Manifest
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import chat.simplex.common.model.ChatModel
import chat.simplex.common.model.RemoteHostInfo
import com.google.accompanist.permissions.rememberPermissionState
@Composable
actual fun ScanToConnectView(chatModel: ChatModel, rhId: Long?, close: () -> Unit) {
actual fun ScanToConnectView(chatModel: ChatModel, rh: RemoteHostInfo?, close: () -> Unit) {
val cameraPermissionState = rememberPermissionState(permission = Manifest.permission.CAMERA)
LaunchedEffect(Unit) {
cameraPermissionState.launchPermissionRequest()
}
ConnectContactLayout(
chatModel = chatModel,
rhId = rhId,
rh = rh,
incognitoPref = chatModel.controller.appPrefs.incognito,
close = close
)

View File

@ -118,7 +118,7 @@ fun ChatListView(chatModel: ChatModel, settingsState: SettingsViewState, setPerf
if (searchInList.isEmpty()) {
DesktopActiveCallOverlayLayout(newChatSheetState)
// TODO disable this button and sheet for the duration of the switch
NewChatSheet(chatModel, chatModel.remoteHostId, newChatSheetState, stopped, hideNewChatSheet)
NewChatSheet(chatModel, newChatSheetState, stopped, hideNewChatSheet)
}
if (appPlatform.isAndroid) {
UserPicker(chatModel, userPickerState, switchingUsersAndHosts) {

View File

@ -25,13 +25,13 @@ import chat.simplex.res.MR
@Composable
fun AddContactView(
chatModel: ChatModel,
rhId: Long?,
rh: RemoteHostInfo?,
connReqInvitation: String,
contactConnection: MutableState<PendingContactConnection?>
) {
val clipboard = LocalClipboardManager.current
AddContactLayout(
rhId = rhId,
rh = rh,
chatModel = chatModel,
incognitoPref = chatModel.controller.appPrefs.incognito,
connReq = connReqInvitation,
@ -54,7 +54,7 @@ fun AddContactView(
@Composable
fun AddContactLayout(
chatModel: ChatModel,
rhId: Long?,
rh: RemoteHostInfo?,
incognitoPref: SharedPreference<Boolean>,
connReq: String,
contactConnection: MutableState<PendingContactConnection?>,
@ -66,9 +66,9 @@ fun AddContactLayout(
withApi {
val contactConnVal = contactConnection.value
if (contactConnVal != null) {
chatModel.controller.apiSetConnectionIncognito(rhId, contactConnVal.pccConnId, incognito.value)?.let {
chatModel.controller.apiSetConnectionIncognito(rh?.remoteHostId, contactConnVal.pccConnId, incognito.value)?.let {
contactConnection.value = it
chatModel.updateContactConnection(rhId, it)
chatModel.updateContactConnection(rh?.remoteHostId, it)
}
}
}
@ -175,7 +175,7 @@ fun sharedProfileInfo(
fun PreviewAddContactView() {
SimpleXTheme {
AddContactLayout(
rhId = null,
rh = null,
chatModel = ChatModel,
incognitoPref = SharedPreference({ false }, {}),
connReq = "https://simplex.chat/contact#/?v=1&smp=smp%3A%2F%2FPQUV2eL0t7OStZOoAsPEV2QYWt4-xilbakvGUGOItUo%3D%40smp6.simplex.im%2FK1rslx-m5bpXVIdMZg9NLUZ_8JBm8xTt%23MCowBQYDK2VuAyEALDeVe-sG8mRY22LsXlPgiwTNs9dbiLrNuA7f3ZMAJ2w%3D",

View File

@ -32,7 +32,8 @@ import kotlinx.coroutines.launch
import java.net.URI
@Composable
fun AddGroupView(chatModel: ChatModel, rhId: Long?, close: () -> Unit) {
fun AddGroupView(chatModel: ChatModel, rh: RemoteHostInfo?, close: () -> Unit) {
val rhId = rh?.remoteHostId
AddGroupLayout(
createGroup = { incognito, groupProfile ->
withApi {

View File

@ -2,10 +2,11 @@ package chat.simplex.common.views.newchat
import androidx.compose.runtime.*
import chat.simplex.common.model.ChatModel
import chat.simplex.common.model.RemoteHostInfo
enum class ConnectViaLinkTab {
SCAN, PASTE
}
@Composable
expect fun ConnectViaLinkView(m: ChatModel, rhId: Long?, close: () -> Unit)
expect fun ConnectViaLinkView(m: ChatModel, rh: RemoteHostInfo?, close: () -> Unit)

View File

@ -9,8 +9,7 @@ import androidx.compose.ui.graphics.Color
import dev.icerock.moko.resources.compose.painterResource
import dev.icerock.moko.resources.compose.stringResource
import androidx.compose.ui.unit.sp
import chat.simplex.common.model.ChatModel
import chat.simplex.common.model.PendingContactConnection
import chat.simplex.common.model.*
import chat.simplex.common.views.helpers.*
import chat.simplex.common.views.usersettings.UserAddressView
import chat.simplex.res.MR
@ -20,7 +19,7 @@ enum class CreateLinkTab {
}
@Composable
fun CreateLinkView(m: ChatModel, rhId: Long?, initialSelection: CreateLinkTab) {
fun CreateLinkView(m: ChatModel, rh: RemoteHostInfo?, initialSelection: CreateLinkTab) {
val selection = remember { mutableStateOf(initialSelection) }
val connReqInvitation = rememberSaveable { m.connReqInv }
val contactConnection: MutableState<PendingContactConnection?> = rememberSaveable(stateSaver = serializableSaver()) { mutableStateOf(null) }
@ -32,7 +31,7 @@ fun CreateLinkView(m: ChatModel, rhId: Long?, initialSelection: CreateLinkTab) {
&& contactConnection.value == null
&& !creatingConnReq.value
) {
createInvitation(m, rhId, creatingConnReq, connReqInvitation, contactConnection)
createInvitation(m, rh?.remoteHostId, creatingConnReq, connReqInvitation, contactConnection)
}
}
/** When [AddContactView] is open, we don't need to drop [chatModel.connReqInv].
@ -65,10 +64,10 @@ fun CreateLinkView(m: ChatModel, rhId: Long?, initialSelection: CreateLinkTab) {
Column(Modifier.weight(1f)) {
when (selection.value) {
CreateLinkTab.ONE_TIME -> {
AddContactView(m, rhId,connReqInvitation.value ?: "", contactConnection)
AddContactView(m, rh,connReqInvitation.value ?: "", contactConnection)
}
CreateLinkTab.LONG_TERM -> {
UserAddressView(m, rhId, viaCreateLinkView = true, close = {})
UserAddressView(m, rh?.remoteHostId, viaCreateLinkView = true, close = {})
}
}
}

View File

@ -33,7 +33,7 @@ import kotlinx.coroutines.launch
import kotlin.math.roundToInt
@Composable
fun NewChatSheet(chatModel: ChatModel, rhId: Long?, newChatSheetState: StateFlow<AnimatedViewState>, stopped: Boolean, closeNewChatSheet: (animated: Boolean) -> Unit) {
fun NewChatSheet(chatModel: ChatModel, newChatSheetState: StateFlow<AnimatedViewState>, stopped: Boolean, closeNewChatSheet: (animated: Boolean) -> Unit) {
// TODO close new chat if remote host changes in model
if (newChatSheetState.collectAsState().value.isVisible()) BackHandler { closeNewChatSheet(true) }
NewChatSheetLayout(
@ -42,17 +42,17 @@ fun NewChatSheet(chatModel: ChatModel, rhId: Long?, newChatSheetState: StateFlow
addContact = {
closeNewChatSheet(false)
ModalManager.center.closeModals()
ModalManager.center.showModal { CreateLinkView(chatModel, rhId, CreateLinkTab.ONE_TIME) }
ModalManager.center.showModal { CreateLinkView(chatModel, chatModel.currentRemoteHost.value, CreateLinkTab.ONE_TIME) }
},
connectViaLink = {
closeNewChatSheet(false)
ModalManager.center.closeModals()
ModalManager.center.showModalCloseable { close -> ConnectViaLinkView(chatModel, rhId, close) }
ModalManager.center.showModalCloseable { close -> ConnectViaLinkView(chatModel, chatModel.currentRemoteHost.value, close) }
},
createGroup = {
closeNewChatSheet(false)
ModalManager.center.closeModals()
ModalManager.center.showCustomModal { close -> AddGroupView(chatModel, rhId, close) }
ModalManager.center.showCustomModal { close -> AddGroupView(chatModel, chatModel.currentRemoteHost.value, close) }
},
closeNewChatSheet,
)

View File

@ -14,8 +14,7 @@ import dev.icerock.moko.resources.compose.stringResource
import androidx.compose.ui.platform.LocalClipboardManager
import androidx.compose.ui.text.buildAnnotatedString
import androidx.compose.ui.unit.dp
import chat.simplex.common.model.ChatModel
import chat.simplex.common.model.SharedPreference
import chat.simplex.common.model.*
import chat.simplex.common.ui.theme.*
import chat.simplex.common.views.helpers.*
import chat.simplex.common.views.usersettings.IncognitoView
@ -24,12 +23,12 @@ import chat.simplex.res.MR
import java.net.URI
@Composable
fun PasteToConnectView(chatModel: ChatModel, rhId: Long?, close: () -> Unit) {
fun PasteToConnectView(chatModel: ChatModel, rh: RemoteHostInfo?, close: () -> Unit) {
val connectionLink = remember { mutableStateOf("") }
val clipboard = LocalClipboardManager.current
PasteToConnectLayout(
chatModel = chatModel,
rhId = rhId,
rh = rh,
incognitoPref = chatModel.controller.appPrefs.incognito,
connectionLink = connectionLink,
pasteFromClipboard = {
@ -42,14 +41,14 @@ fun PasteToConnectView(chatModel: ChatModel, rhId: Long?, close: () -> Unit) {
@Composable
fun PasteToConnectLayout(
chatModel: ChatModel,
rhId: Long?,
rh: RemoteHostInfo?,
incognitoPref: SharedPreference<Boolean>,
connectionLink: MutableState<String>,
pasteFromClipboard: () -> Unit,
close: () -> Unit
) {
val incognito = remember { mutableStateOf(incognitoPref.get()) }
val rhId = rh?.remoteHostId
fun connectViaLink(connReqUri: String) {
try {
val uri = URI(connReqUri)
@ -126,7 +125,7 @@ fun PreviewPasteToConnectTextbox() {
SimpleXTheme {
PasteToConnectLayout(
chatModel = ChatModel,
rhId = null,
rh = null,
incognitoPref = SharedPreference({ false }, {}),
connectionLink = remember { mutableStateOf("") },
pasteFromClipboard = {},

View File

@ -26,7 +26,7 @@ import chat.simplex.res.MR
import java.net.URI
@Composable
expect fun ScanToConnectView(chatModel: ChatModel, rhId: Long?, close: () -> Unit)
expect fun ScanToConnectView(chatModel: ChatModel, rh: RemoteHostInfo?, close: () -> Unit)
enum class ConnectionLinkType {
INVITATION, CONTACT, GROUP
@ -428,7 +428,7 @@ fun openKnownGroup(chatModel: ChatModel, rhId: Long?, close: (() -> Unit)?, grou
@Composable
fun ConnectContactLayout(
chatModel: ChatModel,
rhId: Long?,
rh: RemoteHostInfo?,
incognitoPref: SharedPreference<Boolean>,
close: () -> Unit
) {
@ -440,7 +440,7 @@ fun ConnectContactLayout(
try {
val uri = URI(connReqUri)
withApi {
planAndConnect(chatModel, rhId, uri, incognito = incognito.value, close)
planAndConnect(chatModel, rh?.remoteHostId, uri, incognito = incognito.value, close)
}
} catch (e: RuntimeException) {
AlertManager.shared.showAlertMsg(
@ -492,7 +492,7 @@ fun PreviewConnectContactLayout() {
SimpleXTheme {
ConnectContactLayout(
chatModel = ChatModel,
rhId = null,
rh = null,
incognitoPref = SharedPreference({ false }, {}),
close = {},
)

View File

@ -2,9 +2,10 @@ package chat.simplex.common.views.newchat
import androidx.compose.runtime.*
import chat.simplex.common.model.ChatModel
import chat.simplex.common.model.RemoteHostInfo
@Composable
actual fun ConnectViaLinkView(m: ChatModel, rhId: Long?, close: () -> Unit) {
actual fun ConnectViaLinkView(m: ChatModel, rh: RemoteHostInfo?, close: () -> Unit) {
// TODO this should close if remote host changes in model
PasteToConnectView(m, rhId, close)
PasteToConnectView(m, rh, close)
}

View File

@ -2,12 +2,13 @@ package chat.simplex.common.views.newchat
import androidx.compose.runtime.Composable
import chat.simplex.common.model.ChatModel
import chat.simplex.common.model.RemoteHostInfo
@Composable
actual fun ScanToConnectView(chatModel: ChatModel, rhId: Long?, close: () -> Unit) {
actual fun ScanToConnectView(chatModel: ChatModel, rh: RemoteHostInfo?, close: () -> Unit) {
ConnectContactLayout(
chatModel = chatModel,
rhId = rhId,
rh = rh,
incognitoPref = chatModel.controller.appPrefs.incognito,
close = close
)