From ea6a09b66e3dfe8e12ab370da8fc39a66b94085e Mon Sep 17 00:00:00 2001 From: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com> Date: Sat, 25 Apr 2026 14:59:42 +0000 Subject: [PATCH] ui: open external link alerts (#6860) * ui: open external link alerts * update * update * update * update * update * change link, add link to alert, close modals when opening chat * refactor * add string * fix link in terms * open simplex chat links from privacy policy in app --------- Co-authored-by: Evgeny Poberezkin Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com> --- .../ios/Shared/Views/Helpers/ShareSheet.swift | 39 +++++++++++++++++++ .../Views/NewChat/AddContactLearnMore.swift | 2 +- .../Shared/Views/Onboarding/HowItWorks.swift | 2 +- .../Views/Onboarding/WhatsNewView.swift | 2 +- .../Views/UserSettings/DeveloperView.swift | 18 +++++---- .../Views/UserSettings/IncognitoHelp.swift | 2 +- .../NetworkAndServers/ConditionsWebView.swift | 6 +-- .../NetworkAndServers/NetworkAndServers.swift | 2 +- .../NetworkAndServers/OperatorView.swift | 10 ++--- .../ProtocolServersView.swift | 4 +- .../Views/UserSettings/RTCServers.swift | 4 +- .../Views/UserSettings/SettingsView.swift | 24 +++++++----- .../UserSettings/UserAddressLearnMore.swift | 2 +- .../simplex/common/views/helpers/Utils.kt | 14 +++++++ .../common/views/newchat/ConnectPlan.kt | 1 + .../common/views/onboarding/HowItWorks.kt | 2 +- .../common/views/onboarding/WhatsNewView.kt | 4 +- .../common/views/usersettings/RTCServers.kt | 2 +- .../common/views/usersettings/SettingsView.kt | 8 ++-- .../networkAndServers/NetworkAndServers.kt | 2 +- .../networkAndServers/OperatorView.kt | 16 +++----- .../networkAndServers/ProtocolServersView.kt | 2 +- .../commonMain/resources/MR/base/strings.xml | 1 + 23 files changed, 109 insertions(+), 60 deletions(-) diff --git a/apps/ios/Shared/Views/Helpers/ShareSheet.swift b/apps/ios/Shared/Views/Helpers/ShareSheet.swift index 8b982ec0b7..3adf3f6a64 100644 --- a/apps/ios/Shared/Views/Helpers/ShareSheet.swift +++ b/apps/ios/Shared/Views/Helpers/ShareSheet.swift @@ -86,6 +86,45 @@ func showSheet( } } +func openExternalLink(_ url: URL) { + let s = url.absoluteString + if s.starts(with: "https://simplex.chat/contact#") || (s.starts(with: "https://smp") && s.contains(".simplex.im/a#")) { + ChatModel.shared.appOpenUrl = url + } else { + showAlert( + title: NSLocalizedString("Open external link?", comment: "alert title"), + message: s, + buttonTitle: NSLocalizedString("Open", comment: "alert button"), + buttonAction: { UIApplication.shared.open(url) }, + cancelButton: true + ) + } +} + +struct ExternalLink: View { + let destination: URL + let label: Label + + init(destination: URL, @ViewBuilder label: () -> Label) { + self.destination = destination + self.label = label() + } + + init(_ titleKey: LocalizedStringKey, destination: URL) where Label == Text { + self.destination = destination + self.label = Text(titleKey) + } + + init(_ title: S, destination: URL) where Label == Text { + self.destination = destination + self.label = Text(title) + } + + var body: some View { + Button { openExternalLink(destination) } label: { label } + } +} + let okAlertAction = UIAlertAction(title: NSLocalizedString("Ok", comment: "alert button"), style: .default) let cancelAlertAction = UIAlertAction(title: NSLocalizedString("Cancel", comment: "alert button"), style: .cancel) diff --git a/apps/ios/Shared/Views/NewChat/AddContactLearnMore.swift b/apps/ios/Shared/Views/NewChat/AddContactLearnMore.swift index 3a64a955c5..6add190b88 100644 --- a/apps/ios/Shared/Views/NewChat/AddContactLearnMore.swift +++ b/apps/ios/Shared/Views/NewChat/AddContactLearnMore.swift @@ -26,7 +26,7 @@ struct AddContactLearnMore: View { VStack(alignment: .leading, spacing: 18) { Text("To connect, your contact can scan QR code or use the link in the app.") Text("If you can't meet in person, show QR code in a video call, or share the link.") - Text("Read more in [User Guide](https://simplex.chat/docs/guide/readme.html#connect-to-friends).") + ExternalLink("Read more in User Guide.", destination: URL(string: "https://simplex.chat/docs/guide/readme.html#connect-to-friends")!) } .frame(maxWidth: .infinity, alignment: .leading) .listRowBackground(Color.clear) diff --git a/apps/ios/Shared/Views/Onboarding/HowItWorks.swift b/apps/ios/Shared/Views/Onboarding/HowItWorks.swift index 263b55a42d..c881146ef5 100644 --- a/apps/ios/Shared/Views/Onboarding/HowItWorks.swift +++ b/apps/ios/Shared/Views/Onboarding/HowItWorks.swift @@ -28,7 +28,7 @@ struct HowItWorks: View { Text("Only client devices store user profiles, contacts, groups, and messages.") Text("All messages and files are sent **end-to-end encrypted**, with post-quantum security in direct messages.") if !onboarding { - Text("Read more in our [GitHub repository](https://github.com/simplex-chat/simplex-chat#readme).") + ExternalLink("Read more in our GitHub repository.", destination: URL(string: "https://github.com/simplex-chat/simplex-chat#readme")!) } } .padding(.bottom) diff --git a/apps/ios/Shared/Views/Onboarding/WhatsNewView.swift b/apps/ios/Shared/Views/Onboarding/WhatsNewView.swift index b7249f42ea..8572022ceb 100644 --- a/apps/ios/Shared/Views/Onboarding/WhatsNewView.swift +++ b/apps/ios/Shared/Views/Onboarding/WhatsNewView.swift @@ -791,7 +791,7 @@ struct WhatsNewView: View { } } if let post = v.post { - Link(destination: post) { + ExternalLink(destination: post) { HStack { Text("Read more") Image(systemName: "arrow.up.right.circle") diff --git a/apps/ios/Shared/Views/UserSettings/DeveloperView.swift b/apps/ios/Shared/Views/UserSettings/DeveloperView.swift index 184b03e679..a504b00116 100644 --- a/apps/ios/Shared/Views/UserSettings/DeveloperView.swift +++ b/apps/ios/Shared/Views/UserSettings/DeveloperView.swift @@ -22,14 +22,16 @@ struct DeveloperView: View { VStack { List { Section { - ZStack(alignment: .leading) { - Image(colorScheme == .dark ? "github_light" : "github") - .resizable() - .frame(width: 24, height: 24) - .opacity(0.5) - .colorMultiply(theme.colors.secondary) - Text("Install [SimpleX Chat for terminal](https://github.com/simplex-chat/simplex-chat)") - .padding(.leading, 36) + ExternalLink(destination: URL(string: "https://github.com/simplex-chat/simplex-chat")!) { + ZStack(alignment: .leading) { + Image(colorScheme == .dark ? "github_light" : "github") + .resizable() + .frame(width: 24, height: 24) + .opacity(0.5) + .colorMultiply(theme.colors.secondary) + Text("Install SimpleX Chat for terminal") + .padding(.leading, 36) + } } NavigationLink { TerminalView() diff --git a/apps/ios/Shared/Views/UserSettings/IncognitoHelp.swift b/apps/ios/Shared/Views/UserSettings/IncognitoHelp.swift index d9862aaac8..f74516c2c8 100644 --- a/apps/ios/Shared/Views/UserSettings/IncognitoHelp.swift +++ b/apps/ios/Shared/Views/UserSettings/IncognitoHelp.swift @@ -23,7 +23,7 @@ struct IncognitoHelp: View { Text("Incognito mode protects your privacy by using a new random profile for each contact.") Text("It allows having many anonymous connections without any shared data between them in a single chat profile.") Text("When you share an incognito profile with somebody, this profile will be used for the groups they invite you to.") - Text("Read more in [User Guide](https://simplex.chat/docs/guide/chat-profiles.html#incognito-mode).") + ExternalLink("Read more in User Guide.", destination: URL(string: "https://simplex.chat/docs/guide/chat-profiles.html#incognito-mode")!) } .listRowBackground(Color.clear) .listRowInsets(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0)) diff --git a/apps/ios/Shared/Views/UserSettings/NetworkAndServers/ConditionsWebView.swift b/apps/ios/Shared/Views/UserSettings/NetworkAndServers/ConditionsWebView.swift index 6f76e69182..5abbbf8d2e 100644 --- a/apps/ios/Shared/Views/UserSettings/NetworkAndServers/ConditionsWebView.swift +++ b/apps/ios/Shared/Views/UserSettings/NetworkAndServers/ConditionsWebView.swift @@ -71,11 +71,7 @@ struct ConditionsWebView: UIViewRepresentable { switch navigationAction.navigationType { case .linkActivated: decisionHandler(.cancel) - if url.absoluteString.starts(with: "https://simplex.chat/contact#") { - ChatModel.shared.appOpenUrl = url - } else { - UIApplication.shared.open(url) - } + openExternalLink(url) default: decisionHandler(.allow) } diff --git a/apps/ios/Shared/Views/UserSettings/NetworkAndServers/NetworkAndServers.swift b/apps/ios/Shared/Views/UserSettings/NetworkAndServers/NetworkAndServers.swift index 74b7374654..c1f2470669 100644 --- a/apps/ios/Shared/Views/UserSettings/NetworkAndServers/NetworkAndServers.swift +++ b/apps/ios/Shared/Views/UserSettings/NetworkAndServers/NetworkAndServers.swift @@ -332,7 +332,7 @@ struct UsageConditionsView: View { @ViewBuilder private func conditionsDiffButton(_ font: Font? = nil) -> some View { let commit = ChatModel.shared.conditions.currentConditions.conditionsCommit if let commitUrl = URL(string: "https://github.com/simplex-chat/simplex-chat/commit/\(commit)") { - Link(destination: commitUrl) { + ExternalLink(destination: commitUrl) { HStack { Text("Open changes") Image(systemName: "arrow.up.right.circle") diff --git a/apps/ios/Shared/Views/UserSettings/NetworkAndServers/OperatorView.swift b/apps/ios/Shared/Views/UserSettings/NetworkAndServers/OperatorView.swift index 9d068d3b26..b54fa396a7 100644 --- a/apps/ios/Shared/Views/UserSettings/NetworkAndServers/OperatorView.swift +++ b/apps/ios/Shared/Views/UserSettings/NetworkAndServers/OperatorView.swift @@ -364,11 +364,11 @@ struct OperatorInfoView: View { Text(d) } } - Link(serverOperator.info.website.absoluteString, destination: serverOperator.info.website) + ExternalLink(serverOperator.info.website.absoluteString, destination: serverOperator.info.website) } if let selfhost = serverOperator.info.selfhost { Section { - Link(selfhost.text, destination: selfhost.link) + ExternalLink(selfhost.text, destination: selfhost.link) } } } @@ -432,7 +432,7 @@ struct ConditionsTextView: View { private func conditionsLinkView(_ conditionsLink: String) -> some View { VStack(alignment: .leading, spacing: 20) { Text("Current conditions text couldn't be loaded, you can review conditions via this link:") - Link(destination: URL(string: conditionsLink)!) { + ExternalLink(destination: URL(string: conditionsLink)!) { Text(conditionsLink) .multilineTextAlignment(.leading) } @@ -591,11 +591,11 @@ func conditionsLinkButton() -> some View { let commit = ChatModel.shared.conditions.currentConditions.conditionsCommit let mdUrl = URL(string: "https://github.com/simplex-chat/simplex-chat/blob/\(commit)/PRIVACY.md") ?? conditionsURL return Menu { - Link(destination: mdUrl) { + ExternalLink(destination: mdUrl) { Label("Open conditions", systemImage: "doc") } if let commitUrl = URL(string: "https://github.com/simplex-chat/simplex-chat/commit/\(commit)") { - Link(destination: commitUrl) { + ExternalLink(destination: commitUrl) { Label("Open changes", systemImage: "ellipsis") } } diff --git a/apps/ios/Shared/Views/UserSettings/NetworkAndServers/ProtocolServersView.swift b/apps/ios/Shared/Views/UserSettings/NetworkAndServers/ProtocolServersView.swift index e57df4c5dc..b059be7cb0 100644 --- a/apps/ios/Shared/Views/UserSettings/NetworkAndServers/ProtocolServersView.swift +++ b/apps/ios/Shared/Views/UserSettings/NetworkAndServers/ProtocolServersView.swift @@ -223,9 +223,7 @@ struct YourServersView: View { func howToButton() -> some View { Button { - DispatchQueue.main.async { - UIApplication.shared.open(howToUrl) - } + openExternalLink(howToUrl) } label: { HStack { Text("How to use your servers") diff --git a/apps/ios/Shared/Views/UserSettings/RTCServers.swift b/apps/ios/Shared/Views/UserSettings/RTCServers.swift index ef891738cc..b045a8ce55 100644 --- a/apps/ios/Shared/Views/UserSettings/RTCServers.swift +++ b/apps/ios/Shared/Views/UserSettings/RTCServers.swift @@ -139,9 +139,7 @@ struct RTCServers: View { func howToButton() -> some View { Button { - DispatchQueue.main.async { - UIApplication.shared.open(howToUrl) - } + openExternalLink(howToUrl) } label: { HStack{ Text("How to") diff --git a/apps/ios/Shared/Views/UserSettings/SettingsView.swift b/apps/ios/Shared/Views/UserSettings/SettingsView.swift index 65e34a0ac5..a903329454 100644 --- a/apps/ios/Shared/Views/UserSettings/SettingsView.swift +++ b/apps/ios/Shared/Views/UserSettings/SettingsView.swift @@ -11,7 +11,7 @@ import SwiftUI import StoreKit import SimpleXChat -let simplexTeamURL = URL(string: "simplex:/contact#/?v=1&smp=smp%3A%2F%2FPQUV2eL0t7OStZOoAsPEV2QYWt4-xilbakvGUGOItUo%3D%40smp6.simplex.im%2FK1rslx-m5bpXVIdMZg9NLUZ_8JBm8xTt%23MCowBQYDK2VuAyEALDeVe-sG8mRY22LsXlPgiwTNs9dbiLrNuA7f3ZMAJ2w%3D")! +let simplexTeamURL = URL(string: "simplex:/a#lrdvu2d8A1GumSmoKb2krQmtKhWXq-tyGpHuM7aMwsw?h=smp6.simplex.im")! let appVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String @@ -399,7 +399,9 @@ struct SettingsView: View { } Section(header: Text("Support SimpleX Chat").foregroundColor(theme.colors.secondary)) { - settingsRow("keyboard", color: theme.colors.secondary) { Text("[Contribute](https://github.com/simplex-chat/simplex-chat#contribute)") } + settingsRow("keyboard", color: theme.colors.secondary) { + ExternalLink("Contribute", destination: URL(string: "https://github.com/simplex-chat/simplex-chat#contribute")!) + } settingsRow("star", color: theme.colors.secondary) { Button("Rate the app") { if let scene = sceneDelegate.windowScene { @@ -407,14 +409,16 @@ struct SettingsView: View { } } } - ZStack(alignment: .leading) { - Image(colorScheme == .dark ? "github_light" : "github") - .resizable() - .frame(width: 24, height: 24) - .opacity(0.5) - .colorMultiply(theme.colors.secondary) - Text("[Star on GitHub](https://github.com/simplex-chat/simplex-chat)") - .padding(.leading, indent) + ExternalLink(destination: URL(string: "https://github.com/simplex-chat/simplex-chat")!) { + ZStack(alignment: .leading) { + Image(colorScheme == .dark ? "github_light" : "github") + .resizable() + .frame(width: 24, height: 24) + .opacity(0.5) + .colorMultiply(theme.colors.secondary) + Text("Star on GitHub") + .padding(.leading, indent) + } } } diff --git a/apps/ios/Shared/Views/UserSettings/UserAddressLearnMore.swift b/apps/ios/Shared/Views/UserSettings/UserAddressLearnMore.swift index 6c1ea8deb2..ac6ae05984 100644 --- a/apps/ios/Shared/Views/UserSettings/UserAddressLearnMore.swift +++ b/apps/ios/Shared/Views/UserSettings/UserAddressLearnMore.swift @@ -31,7 +31,7 @@ struct UserAddressLearnMore: View { .padding(.top) Text("SimpleX address and 1-time links are safe to share via any messenger.") Text("To protect against your link being replaced, you can compare contact security codes.") - Text("Read more in [User Guide](https://simplex.chat/docs/guide/making-connections.html#comparison-of-1-time-invitation-links-and-simplex-contact-addresses).") + ExternalLink("Read more in User Guide.", destination: URL(string: "https://simplex.chat/docs/guide/making-connections.html#comparison-of-1-time-invitation-links-and-simplex-contact-addresses")!) .padding(.top) } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/Utils.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/Utils.kt index c4821d1a20..424d500085 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/Utils.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/Utils.kt @@ -537,6 +537,20 @@ fun UriHandler.openUriCatching(uri: String) { } } +fun UriHandler.openExternalLink(uri: String) { + val uriHandler = this + if (uri.startsWith("https://simplex.chat/contact#") || (uri.startsWith("https://smp") && ".simplex.im/a#" in uri)) { + uriHandler.openVerifiedSimplexUri(uri) + } else { + AlertManager.shared.showAlertDialog( + title = generalGetString(MR.strings.open_external_link_title), + text = uri, + confirmText = generalGetString(MR.strings.open_verb), + onConfirm = { uriHandler.openUriCatching(uri) } + ) + } +} + fun IntSize.Companion.Saver(): Saver = Saver( save = { it.width to it.height }, restore = { IntSize(it.first, it.second) } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/ConnectPlan.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/ConnectPlan.kt index b38fbf9f51..cafad97574 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/ConnectPlan.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/ConnectPlan.kt @@ -604,6 +604,7 @@ fun showPrepareContactAlert( confirmText = generalGetString(MR.strings.connect_plan_open_new_chat), onConfirm = { AlertManager.privacySensitive.hideAlert() + ModalManager.closeAllModalsEverywhere() withBGApi { val chat = chatModel.controller.apiPrepareContact(rhId, connectionLink, contactShortLinkData) if (chat != null) { diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/onboarding/HowItWorks.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/onboarding/HowItWorks.kt index aff02e90f5..2b92d35e72 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/onboarding/HowItWorks.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/onboarding/HowItWorks.kt @@ -67,7 +67,7 @@ fun ReadableTextWithLink(stringResId: StringResource, link: String, textAlign: T newStyles } val uriHandler = LocalUriHandler.current - Text(AnnotatedString(annotated.text, newStyles), modifier = Modifier.padding(padding).clickable { if (simplexLink) uriHandler.openVerifiedSimplexUri(link) else uriHandler.openUriCatching(link) }, textAlign = textAlign, lineHeight = 22.sp) + Text(AnnotatedString(annotated.text, newStyles), modifier = Modifier.padding(padding).clickable { if (simplexLink) uriHandler.openVerifiedSimplexUri(link) else uriHandler.openExternalLink(link) }, textAlign = textAlign, lineHeight = 22.sp) } @Composable diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/onboarding/WhatsNewView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/onboarding/WhatsNewView.kt index 89b2f97ee7..0edeee61af 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/onboarding/WhatsNewView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/onboarding/WhatsNewView.kt @@ -59,7 +59,7 @@ fun ModalData.WhatsNewView(updatedConditions: Boolean = false, viaSettings: Bool Icon( painterResource(MR.images.ic_open_in_new), stringResource(titleId), tint = MaterialTheme.colors.primary, modifier = Modifier - .clickable { if (link.startsWith("simplex:")) uriHandler.openVerifiedSimplexUri(link) else uriHandler.openUriCatching(link) } + .clickable { if (link.startsWith("simplex:")) uriHandler.openVerifiedSimplexUri(link) else uriHandler.openExternalLink(link) } ) } @@ -229,7 +229,7 @@ fun ReadMoreButton(url: String) { interactionSource = remember { MutableInteractionSource() }, indication = null ) { - uriHandler.openUriCatching(url) + uriHandler.openExternalLink(url) } ) Icon(painterResource(MR.images.ic_open_in_new), stringResource(MR.strings.whats_new_read_more), tint = MaterialTheme.colors.primary) diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/RTCServers.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/RTCServers.kt index 761a74d6e4..0c31b062dd 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/RTCServers.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/RTCServers.kt @@ -198,7 +198,7 @@ private fun howToButton() { val uriHandler = LocalUriHandler.current Row( verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.clickable { uriHandler.openUriCatching("https://simplex.chat/docs/webrtc.html#configure-mobile-apps") } + modifier = Modifier.clickable { uriHandler.openExternalLink("https://simplex.chat/docs/webrtc.html#configure-mobile-apps") } ) { Text(stringResource(MR.strings.how_to), color = MaterialTheme.colors.primary) Icon( diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/SettingsView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/SettingsView.kt index 7ea656e1e4..c826b1dc51 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/SettingsView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/SettingsView.kt @@ -75,7 +75,7 @@ fun SettingsView(chatModel: ChatModel, setPerformLA: (Boolean) -> Unit, close: ( } val simplexTeamUri = - "simplex:/contact#/?v=1&smp=smp%3A%2F%2FPQUV2eL0t7OStZOoAsPEV2QYWt4-xilbakvGUGOItUo%3D%40smp6.simplex.im%2FK1rslx-m5bpXVIdMZg9NLUZ_8JBm8xTt%23MCowBQYDK2VuAyEALDeVe-sG8mRY22LsXlPgiwTNs9dbiLrNuA7f3ZMAJ2w%3D" + "simplex:/a#lrdvu2d8A1GumSmoKb2krQmtKhWXq-tyGpHuM7aMwsw?h=smp6.simplex.im" @Composable fun SettingsLayout( @@ -207,7 +207,7 @@ fun ChatLockItem( } @Composable private fun ContributeItem(uriHandler: UriHandler) { - SectionItemView({ uriHandler.openUriCatching("https://github.com/simplex-chat/simplex-chat#contribute") }) { + SectionItemView({ uriHandler.openExternalLink("https://github.com/simplex-chat/simplex-chat#contribute") }) { Icon( painterResource(MR.images.ic_keyboard), contentDescription = "GitHub", @@ -235,7 +235,7 @@ fun ChatLockItem( } @Composable private fun StarOnGithubItem(uriHandler: UriHandler) { - SectionItemView({ uriHandler.openUriCatching("https://github.com/simplex-chat/simplex-chat") }) { + SectionItemView({ uriHandler.openExternalLink("https://github.com/simplex-chat/simplex-chat") }) { Icon( painter = painterResource(MR.images.ic_github), contentDescription = "GitHub", @@ -268,7 +268,7 @@ fun ChatLockItem( } @Composable fun InstallTerminalAppItem(uriHandler: UriHandler) { - SectionItemView({ uriHandler.openUriCatching("https://github.com/simplex-chat/simplex-chat") }) { + SectionItemView({ uriHandler.openExternalLink("https://github.com/simplex-chat/simplex-chat") }) { Icon( painter = painterResource(MR.images.ic_github), contentDescription = "GitHub", diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/networkAndServers/NetworkAndServers.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/networkAndServers/NetworkAndServers.kt index bbd2a0af49..c70243f584 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/networkAndServers/NetworkAndServers.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/networkAndServers/NetworkAndServers.kt @@ -769,7 +769,7 @@ fun UsageConditionsView( .clip(shape = CircleShape) .clickable { val commitUrl = "https://github.com/simplex-chat/simplex-chat/commit/$commit" - uriHandler.openUriCatching(commitUrl) + uriHandler.openExternalLink(commitUrl) } .padding(horizontal = 6.dp, vertical = 4.dp), verticalAlignment = Alignment.CenterVertically, diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/networkAndServers/OperatorView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/networkAndServers/OperatorView.kt index 1449e0cd0d..9e11b9a932 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/networkAndServers/OperatorView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/networkAndServers/OperatorView.kt @@ -500,7 +500,7 @@ fun OperatorInfoView(serverOperator: ServerOperator) { Text(d) } val website = serverOperator.info.website - Text(website, color = MaterialTheme.colors.primary, modifier = Modifier.clickable { uriHandler.openUriCatching(website) }) + Text(website, color = MaterialTheme.colors.primary, modifier = Modifier.clickable { uriHandler.openExternalLink(website) }) } } } @@ -511,7 +511,7 @@ fun OperatorInfoView(serverOperator: ServerOperator) { SectionView { SectionItemView { val (text, link) = selfhost - Text(text, color = MaterialTheme.colors.primary, modifier = Modifier.clickable { uriHandler.openUriCatching(link) }) + Text(text, color = MaterialTheme.colors.primary, modifier = Modifier.clickable { uriHandler.openExternalLink(link) }) } } } @@ -787,7 +787,7 @@ private fun ConditionsLinkView(conditionsLink: String) { SectionItemView { val uriHandler = LocalUriHandler.current Text(stringResource(MR.strings.operator_conditions_failed_to_load), color = MaterialTheme.colors.onBackground) - Text(conditionsLink, color = MaterialTheme.colors.primary, modifier = Modifier.clickable { uriHandler.openUriCatching(conditionsLink) }) + Text(conditionsLink, color = MaterialTheme.colors.primary, modifier = Modifier.clickable { uriHandler.openExternalLink(conditionsLink) }) } } @@ -821,13 +821,13 @@ fun ConditionsLinkButton() { val commit = chatModel.conditions.value.currentConditions.conditionsCommit ItemAction(stringResource(MR.strings.operator_open_conditions), painterResource(MR.images.ic_draft), onClick = { val mdUrl = "https://github.com/simplex-chat/simplex-chat/blob/$commit/PRIVACY.md" - uriHandler.openUriCatching(mdUrl) showMenu.value = false + uriHandler.openExternalLink(mdUrl) }) ItemAction(stringResource(MR.strings.operator_open_changes), painterResource(MR.images.ic_more_horiz), onClick = { val commitUrl = "https://github.com/simplex-chat/simplex-chat/commit/$commit" - uriHandler.openUriCatching(commitUrl) showMenu.value = false + uriHandler.openExternalLink(commitUrl) }) } IconButton({ showMenu.value = true }) { @@ -838,11 +838,7 @@ fun ConditionsLinkButton() { private fun internalUriHandler(parentUriHandler: UriHandler): UriHandler = object: UriHandler { override fun openUri(uri: String) { - if (uri.startsWith("https://simplex.chat/contact#")) { - openVerifiedSimplexUri(uri) - } else { - parentUriHandler.openUriCatching(uri) - } + parentUriHandler.openExternalLink(uri) } } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/networkAndServers/ProtocolServersView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/networkAndServers/ProtocolServersView.kt index b232c7994e..3be2456b72 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/networkAndServers/ProtocolServersView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/networkAndServers/ProtocolServersView.kt @@ -335,7 +335,7 @@ private fun HowToButton() { SettingsActionItem( painterResource(MR.images.ic_open_in_new), stringResource(MR.strings.how_to_use_your_servers), - { uriHandler.openUriCatching("https://simplex.chat/docs/server.html") }, + { uriHandler.openExternalLink("https://simplex.chat/docs/server.html") }, textColor = MaterialTheme.colors.primary, iconColor = MaterialTheme.colors.primary ) diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml index a9b2045b97..0be4ee4d2e 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml @@ -1376,6 +1376,7 @@ Open SimpleX Chat to accept call Enable calls from lock screen via Settings. Open + Open external link? e2e encrypted