diff --git a/apps/android/app/src/main/java/chat/simplex/app/views/chat/group/GroupChatInfoView.kt b/apps/android/app/src/main/java/chat/simplex/app/views/chat/group/GroupChatInfoView.kt index d379414431..1d9a918f02 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/views/chat/group/GroupChatInfoView.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/views/chat/group/GroupChatInfoView.kt @@ -163,7 +163,9 @@ fun GroupChatInfoLayout( SectionView(title = String.format(generalGetString(R.string.group_info_section_title_num_members), members.count() + 1)) { if (groupInfo.canAddMembers) { - SectionItemView(manageGroupLink) { GroupLinkButton() } + SectionItemView(manageGroupLink) { + GroupLinkButton() + } SectionDivider() val onAddMembersClick = if (chat.chatInfo.incognito) ::cantInviteIncognitoAlert else addMembers SectionItemView(onAddMembersClick) { diff --git a/apps/ios/Shared/Views/Chat/Group/GroupChatInfoView.swift b/apps/ios/Shared/Views/Chat/Group/GroupChatInfoView.swift index 3e560e6e2f..7e29a7950c 100644 --- a/apps/ios/Shared/Views/Chat/Group/GroupChatInfoView.swift +++ b/apps/ios/Shared/Views/Chat/Group/GroupChatInfoView.swift @@ -204,7 +204,11 @@ struct GroupChatInfoView: View { .navigationBarTitle("Group link") .navigationBarTitleDisplayMode(.large) } label: { - Label("Group link", systemImage: "link") + if groupLink == nil { + Label("Create group link", systemImage: "link.badge.plus") + } else { + Label("Group link", systemImage: "link") + } } } diff --git a/apps/ios/Shared/Views/Chat/Group/GroupLinkView.swift b/apps/ios/Shared/Views/Chat/Group/GroupLinkView.swift index 4dd4d8c391..e280e9f4be 100644 --- a/apps/ios/Shared/Views/Chat/Group/GroupLinkView.swift +++ b/apps/ios/Shared/Views/Chat/Group/GroupLinkView.swift @@ -12,6 +12,7 @@ import SimpleXChat struct GroupLinkView: View { var groupId: Int64 @Binding var groupLink: String? + @State private var creatingLink = false @State private var alert: GroupLinkAlert? private enum GroupLinkAlert: Identifiable { @@ -48,18 +49,17 @@ struct GroupLinkView: View { } .frame(maxWidth: .infinity) } else { - Button { - Task { - do { - groupLink = try await apiCreateGroupLink(groupId) - } catch let error { - logger.error("GroupLinkView apiCreateGroupLink: \(responseError(error))") - let a = getErrorAlert(error, "Error creating group link") - alert = .error(title: a.title, error: a.message) - } - } - } label: { Label("Create link", systemImage: "link.badge.plus") } + Button(action: createGroupLink) { + Label("Create link", systemImage: "link.badge.plus") + } .frame(maxWidth: .infinity) + .disabled(creatingLink) + .padding(.bottom) + if creatingLink { + ProgressView() + .scaleEffect(2) + .frame(maxWidth: .infinity) + } } } .padding() @@ -74,9 +74,7 @@ struct GroupLinkView: View { Task { do { try await apiDeleteGroupLink(groupId) - await MainActor.run { - groupLink = nil - } + await MainActor.run { groupLink = nil } } catch let error { logger.error("GroupLinkView apiDeleteGroupLink: \(responseError(error))") } @@ -87,6 +85,31 @@ struct GroupLinkView: View { return Alert(title: Text(title), message: Text(error)) } } + .onAppear { + if groupLink == nil && !creatingLink { + createGroupLink() + } + } + } + } + + private func createGroupLink() { + Task { + do { + creatingLink = true + let link = try await apiCreateGroupLink(groupId) + await MainActor.run { + creatingLink = false + groupLink = link + } + } catch let error { + logger.error("GroupLinkView apiCreateGroupLink: \(responseError(error))") + await MainActor.run { + creatingLink = false + let a = getErrorAlert(error, "Error creating group link") + alert = .error(title: a.title, error: a.message) + } + } } } } diff --git a/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff b/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff index 404aa1f9fa..cf17c6f832 100644 --- a/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff +++ b/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff @@ -705,6 +705,10 @@ Adresse erstellen No comment provided by engineer. + + Create group link + No comment provided by engineer. + Create link Link erzeugen diff --git a/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff b/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff index 48bcc0c0c4..77b1f1088d 100644 --- a/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff +++ b/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff @@ -708,6 +708,11 @@ Create address No comment provided by engineer. + + Create group link + Create group link + No comment provided by engineer. + Create link Create link diff --git a/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff b/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff index edb323925d..c828ccc563 100644 --- a/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff +++ b/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff @@ -708,6 +708,10 @@ Создать адрес No comment provided by engineer. + + Create group link + No comment provided by engineer. + Create link Создать ссылку diff --git a/apps/ios/SimpleX.xcodeproj/project.pbxproj b/apps/ios/SimpleX.xcodeproj/project.pbxproj index c206f49d30..b8f7bbd4d4 100644 --- a/apps/ios/SimpleX.xcodeproj/project.pbxproj +++ b/apps/ios/SimpleX.xcodeproj/project.pbxproj @@ -95,6 +95,11 @@ 5CB9250D27A9432000ACCCDD /* ChatListNavLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CB9250C27A9432000ACCCDD /* ChatListNavLink.swift */; }; 5CBE6C12294487F7002D9531 /* VerifyCodeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CBE6C11294487F7002D9531 /* VerifyCodeView.swift */; }; 5CBE6C142944CC12002D9531 /* ScanCodeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CBE6C132944CC12002D9531 /* ScanCodeView.swift */; }; + 5CBE6C2E2948E5B9002D9531 /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CBE6C292948E5B9002D9531 /* libgmp.a */; }; + 5CBE6C2F2948E5B9002D9531 /* libHSsimplex-chat-4.3.2-78wf2MiH5VH6C3LPkQoECL.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CBE6C2A2948E5B9002D9531 /* libHSsimplex-chat-4.3.2-78wf2MiH5VH6C3LPkQoECL.a */; }; + 5CBE6C302948E5B9002D9531 /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CBE6C2B2948E5B9002D9531 /* libgmpxx.a */; }; + 5CBE6C312948E5B9002D9531 /* libHSsimplex-chat-4.3.2-78wf2MiH5VH6C3LPkQoECL-ghc8.10.7.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CBE6C2C2948E5B9002D9531 /* libHSsimplex-chat-4.3.2-78wf2MiH5VH6C3LPkQoECL-ghc8.10.7.a */; }; + 5CBE6C322948E5B9002D9531 /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CBE6C2D2948E5B9002D9531 /* libffi.a */; }; 5CC1C99227A6C7F5000D9FF6 /* QRCode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CC1C99127A6C7F5000D9FF6 /* QRCode.swift */; }; 5CC1C99527A6CF7F000D9FF6 /* ShareSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CC1C99427A6CF7F000D9FF6 /* ShareSheet.swift */; }; 5CC2C0FC2809BF11000C35E3 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 5CC2C0FA2809BF11000C35E3 /* Localizable.strings */; }; @@ -139,11 +144,6 @@ 644EFFE0292CFD7F00525D5B /* CIVoiceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 644EFFDF292CFD7F00525D5B /* CIVoiceView.swift */; }; 644EFFE2292D089800525D5B /* FramedCIVoiceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 644EFFE1292D089800525D5B /* FramedCIVoiceView.swift */; }; 644EFFE42937BE9700525D5B /* MarkedDeletedItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 644EFFE32937BE9700525D5B /* MarkedDeletedItemView.swift */; }; - 644EFFF62941BD6900525D5B /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 644EFFF12941BD6800525D5B /* libffi.a */; }; - 644EFFF72941BD6900525D5B /* libHSsimplex-chat-4.3.1-5rS6G9uR2Qu1YtPYDlH5CW-ghc8.10.7.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 644EFFF22941BD6800525D5B /* libHSsimplex-chat-4.3.1-5rS6G9uR2Qu1YtPYDlH5CW-ghc8.10.7.a */; }; - 644EFFF82941BD6900525D5B /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 644EFFF32941BD6800525D5B /* libgmp.a */; }; - 644EFFF92941BD6900525D5B /* libHSsimplex-chat-4.3.1-5rS6G9uR2Qu1YtPYDlH5CW.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 644EFFF42941BD6800525D5B /* libHSsimplex-chat-4.3.1-5rS6G9uR2Qu1YtPYDlH5CW.a */; }; - 644EFFFA2941BD6900525D5B /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 644EFFF52941BD6900525D5B /* libgmpxx.a */; }; 6454036F2822A9750090DDFF /* ComposeFileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6454036E2822A9750090DDFF /* ComposeFileView.swift */; }; 646BB38C283BEEB9001CE359 /* LocalAuthentication.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 646BB38B283BEEB9001CE359 /* LocalAuthentication.framework */; }; 646BB38E283FDB6D001CE359 /* LocalAuthenticationUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 646BB38D283FDB6D001CE359 /* LocalAuthenticationUtils.swift */; }; @@ -310,6 +310,11 @@ 5CB9250C27A9432000ACCCDD /* ChatListNavLink.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatListNavLink.swift; sourceTree = ""; }; 5CBE6C11294487F7002D9531 /* VerifyCodeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VerifyCodeView.swift; sourceTree = ""; }; 5CBE6C132944CC12002D9531 /* ScanCodeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScanCodeView.swift; sourceTree = ""; }; + 5CBE6C292948E5B9002D9531 /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libgmp.a; path = ios/libgmp.a; sourceTree = ""; }; + 5CBE6C2A2948E5B9002D9531 /* libHSsimplex-chat-4.3.2-78wf2MiH5VH6C3LPkQoECL.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "libHSsimplex-chat-4.3.2-78wf2MiH5VH6C3LPkQoECL.a"; path = "ios/libHSsimplex-chat-4.3.2-78wf2MiH5VH6C3LPkQoECL.a"; sourceTree = ""; }; + 5CBE6C2B2948E5B9002D9531 /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libgmpxx.a; path = ios/libgmpxx.a; sourceTree = ""; }; + 5CBE6C2C2948E5B9002D9531 /* libHSsimplex-chat-4.3.2-78wf2MiH5VH6C3LPkQoECL-ghc8.10.7.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "libHSsimplex-chat-4.3.2-78wf2MiH5VH6C3LPkQoECL-ghc8.10.7.a"; path = "ios/libHSsimplex-chat-4.3.2-78wf2MiH5VH6C3LPkQoECL-ghc8.10.7.a"; sourceTree = ""; }; + 5CBE6C2D2948E5B9002D9531 /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libffi.a; path = ios/libffi.a; sourceTree = ""; }; 5CC1C99127A6C7F5000D9FF6 /* QRCode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QRCode.swift; sourceTree = ""; }; 5CC1C99427A6CF7F000D9FF6 /* ShareSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareSheet.swift; sourceTree = ""; }; 5CC2C0FB2809BF11000C35E3 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; }; @@ -352,11 +357,6 @@ 644EFFDF292CFD7F00525D5B /* CIVoiceView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CIVoiceView.swift; sourceTree = ""; }; 644EFFE1292D089800525D5B /* FramedCIVoiceView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FramedCIVoiceView.swift; sourceTree = ""; }; 644EFFE32937BE9700525D5B /* MarkedDeletedItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MarkedDeletedItemView.swift; sourceTree = ""; }; - 644EFFF12941BD6800525D5B /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = ""; }; - 644EFFF22941BD6800525D5B /* libHSsimplex-chat-4.3.1-5rS6G9uR2Qu1YtPYDlH5CW-ghc8.10.7.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-4.3.1-5rS6G9uR2Qu1YtPYDlH5CW-ghc8.10.7.a"; sourceTree = ""; }; - 644EFFF32941BD6800525D5B /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = ""; }; - 644EFFF42941BD6800525D5B /* libHSsimplex-chat-4.3.1-5rS6G9uR2Qu1YtPYDlH5CW.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-4.3.1-5rS6G9uR2Qu1YtPYDlH5CW.a"; sourceTree = ""; }; - 644EFFF52941BD6900525D5B /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = ""; }; 6454036E2822A9750090DDFF /* ComposeFileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposeFileView.swift; sourceTree = ""; }; 646BB38B283BEEB9001CE359 /* LocalAuthentication.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = LocalAuthentication.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS15.4.sdk/System/Library/Frameworks/LocalAuthentication.framework; sourceTree = DEVELOPER_DIR; }; 646BB38D283FDB6D001CE359 /* LocalAuthenticationUtils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalAuthenticationUtils.swift; sourceTree = ""; }; @@ -402,13 +402,13 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 644EFFF72941BD6900525D5B /* libHSsimplex-chat-4.3.1-5rS6G9uR2Qu1YtPYDlH5CW-ghc8.10.7.a in Frameworks */, - 644EFFF92941BD6900525D5B /* libHSsimplex-chat-4.3.1-5rS6G9uR2Qu1YtPYDlH5CW.a in Frameworks */, - 644EFFF82941BD6900525D5B /* libgmp.a in Frameworks */, + 5CBE6C312948E5B9002D9531 /* libHSsimplex-chat-4.3.2-78wf2MiH5VH6C3LPkQoECL-ghc8.10.7.a in Frameworks */, 5CE2BA93284534B000EC33A6 /* libiconv.tbd in Frameworks */, - 644EFFF62941BD6900525D5B /* libffi.a in Frameworks */, + 5CBE6C302948E5B9002D9531 /* libgmpxx.a in Frameworks */, + 5CBE6C2F2948E5B9002D9531 /* libHSsimplex-chat-4.3.2-78wf2MiH5VH6C3LPkQoECL.a in Frameworks */, + 5CBE6C322948E5B9002D9531 /* libffi.a in Frameworks */, + 5CBE6C2E2948E5B9002D9531 /* libgmp.a in Frameworks */, 5CE2BA94284534BB00EC33A6 /* libz.tbd in Frameworks */, - 644EFFFA2941BD6900525D5B /* libgmpxx.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -466,11 +466,11 @@ 5C764E5C279C70B7000C6508 /* Libraries */ = { isa = PBXGroup; children = ( - 644EFFF12941BD6800525D5B /* libffi.a */, - 644EFFF32941BD6800525D5B /* libgmp.a */, - 644EFFF52941BD6900525D5B /* libgmpxx.a */, - 644EFFF22941BD6800525D5B /* libHSsimplex-chat-4.3.1-5rS6G9uR2Qu1YtPYDlH5CW-ghc8.10.7.a */, - 644EFFF42941BD6800525D5B /* libHSsimplex-chat-4.3.1-5rS6G9uR2Qu1YtPYDlH5CW.a */, + 5CBE6C2D2948E5B9002D9531 /* libffi.a */, + 5CBE6C292948E5B9002D9531 /* libgmp.a */, + 5CBE6C2B2948E5B9002D9531 /* libgmpxx.a */, + 5CBE6C2C2948E5B9002D9531 /* libHSsimplex-chat-4.3.2-78wf2MiH5VH6C3LPkQoECL-ghc8.10.7.a */, + 5CBE6C2A2948E5B9002D9531 /* libHSsimplex-chat-4.3.2-78wf2MiH5VH6C3LPkQoECL.a */, ); path = Libraries; sourceTree = "";