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 = "";