Fixed a bug where copying the open group url wasn't working correctly

pull/737/head
Morgan Pretty 2 years ago
parent 1c6592aa6f
commit 7cbdca672e

@ -1578,6 +1578,11 @@ extension ConversationVC:
case .typingIndicator, .dateHeader: break case .typingIndicator, .dateHeader: break
case .textOnlyMessage: case .textOnlyMessage:
if cellViewModel.body == nil, let linkPreview: LinkPreview = cellViewModel.linkPreview {
UIPasteboard.general.string = linkPreview.url
return
}
UIPasteboard.general.string = cellViewModel.body UIPasteboard.general.string = cellViewModel.body
case .audio, .genericAttachment, .mediaMessage: case .audio, .genericAttachment, .mediaMessage:

@ -241,7 +241,24 @@ class ThreadSettingsViewModel: SessionTableViewModel<ThreadSettingsViewModel.Nav
), ),
accessibilityIdentifier: "\(ThreadSettingsViewModel.self).copy_thread_id", accessibilityIdentifier: "\(ThreadSettingsViewModel.self).copy_thread_id",
onTap: { onTap: {
UIPasteboard.general.string = threadId switch threadVariant {
case .contact, .closedGroup:
UIPasteboard.general.string = threadId
case .openGroup:
guard
let server: String = threadViewModel.openGroupServer,
let roomToken: String = threadViewModel.openGroupRoomToken,
let publicKey: String = threadViewModel.openGroupPublicKey
else { return }
UIPasteboard.general.string = OpenGroup.urlFor(
server: server,
roomToken: roomToken,
publicKey: publicKey
)
}
self?.showToast( self?.showToast(
text: "copied".localized(), text: "copied".localized(),
backgroundColor: .backgroundSecondary backgroundColor: .backgroundSecondary
@ -297,7 +314,10 @@ class ThreadSettingsViewModel: SessionTableViewModel<ThreadSettingsViewModel.Nav
with: "vc_conversation_settings_invite_button_title".localized(), with: "vc_conversation_settings_invite_button_title".localized(),
excluding: Set() excluding: Set()
) { [weak self] selectedUsers in ) { [weak self] selectedUsers in
self?.addUsersToOpenGoup(selectedUsers: selectedUsers) self?.addUsersToOpenGoup(
threadViewModel: threadViewModel,
selectedUsers: selectedUsers
)
} }
) )
} }
@ -561,13 +581,20 @@ class ThreadSettingsViewModel: SessionTableViewModel<ThreadSettingsViewModel.Nav
self.transitionToScreen(navController, transitionType: .present) self.transitionToScreen(navController, transitionType: .present)
} }
private func addUsersToOpenGoup(selectedUsers: Set<String>) { private func addUsersToOpenGoup(threadViewModel: SessionThreadViewModel, selectedUsers: Set<String>) {
let threadId: String = self.threadId guard
let name: String = threadViewModel.openGroupName,
let server: String = threadViewModel.openGroupServer,
let roomToken: String = threadViewModel.openGroupRoomToken,
let publicKey: String = threadViewModel.openGroupPublicKey
else { return }
dependencies.storage.writeAsync { db in dependencies.storage.writeAsync { db in
guard let openGroup: OpenGroup = try OpenGroup.fetchOne(db, id: threadId) else { return } let urlString: String = OpenGroup.urlFor(
server: server,
let urlString: String = "\(openGroup.server)/\(openGroup.roomToken)?public_key=\(openGroup.publicKey)" roomToken: roomToken,
publicKey: publicKey
)
try selectedUsers.forEach { userId in try selectedUsers.forEach { userId in
let thread: SessionThread = try SessionThread.fetchOrCreate(db, id: userId, variant: .contact) let thread: SessionThread = try SessionThread.fetchOrCreate(db, id: userId, variant: .contact)
@ -575,7 +602,7 @@ class ThreadSettingsViewModel: SessionTableViewModel<ThreadSettingsViewModel.Nav
try LinkPreview( try LinkPreview(
url: urlString, url: urlString,
variant: .openGroupInvitation, variant: .openGroupInvitation,
title: openGroup.name title: name
) )
.save(db) .save(db)

@ -219,6 +219,10 @@ public extension OpenGroup {
// Always force the server to lowercase // Always force the server to lowercase
return "\(server.lowercased()).\(roomToken)" return "\(server.lowercased()).\(roomToken)"
} }
static func urlFor(server: String, roomToken: String, publicKey: String) -> String {
return "\(server)/\(roomToken)?public_key=\(publicKey)"
}
} }
extension OpenGroup: CustomStringConvertible, CustomDebugStringConvertible { extension OpenGroup: CustomStringConvertible, CustomDebugStringConvertible {
@ -243,51 +247,3 @@ extension OpenGroup: CustomStringConvertible, CustomDebugStringConvertible {
].joined(separator: ", ") ].joined(separator: ", ")
} }
} }
// MARK: - Objective-C Support
// TODO: Remove this when possible
@objc(SMKOpenGroup)
public class SMKOpenGroup: NSObject {
@objc(inviteUsers:toOpenGroupFor:)
public static func invite(selectedUsers: Set<String>, openGroupThreadId: String) {
Storage.shared.write { db in
guard let openGroup: OpenGroup = try OpenGroup.fetchOne(db, id: openGroupThreadId) else { return }
let urlString: String = "\(openGroup.server)/\(openGroup.roomToken)?public_key=\(openGroup.publicKey)"
try selectedUsers.forEach { userId in
let thread: SessionThread = try SessionThread.fetchOrCreate(db, id: userId, variant: .contact)
try LinkPreview(
url: urlString,
variant: .openGroupInvitation,
title: openGroup.name
)
.save(db)
let interaction: Interaction = try Interaction(
threadId: thread.id,
authorId: userId,
variant: .standardOutgoing,
timestampMs: Int64(floor(Date().timeIntervalSince1970 * 1000)),
expiresInSeconds: try? DisappearingMessagesConfiguration
.select(.durationSeconds)
.filter(id: userId)
.filter(DisappearingMessagesConfiguration.Columns.isEnabled == true)
.asRequest(of: TimeInterval.self)
.fetchOne(db),
linkPreviewUrl: urlString
)
.inserted(db)
try MessageSender.send(
db,
interaction: interaction,
in: thread
)
}
}
}
}

@ -42,7 +42,13 @@ extension ConfigurationMessage {
.filter(OpenGroup.Columns.roomToken != "") .filter(OpenGroup.Columns.roomToken != "")
.filter(OpenGroup.Columns.isActive) .filter(OpenGroup.Columns.isActive)
.fetchAll(db) .fetchAll(db)
.map { "\($0.server)/\($0.roomToken)?public_key=\($0.publicKey)" } .map { openGroup in
OpenGroup.urlFor(
server: openGroup.server,
roomToken: openGroup.roomToken,
publicKey: openGroup.publicKey
)
}
.asSet() .asSet()
let contacts: Set<CMContact> = try Contact let contacts: Set<CMContact> = try Contact
.filter(Contact.Columns.id != currentUserProfile.id) .filter(Contact.Columns.id != currentUserProfile.id)

@ -43,6 +43,7 @@ public struct SessionThreadViewModel: FetchableRecordWithRowId, Decodable, Equat
public static let openGroupNameKey: SQL = SQL(stringLiteral: CodingKeys.openGroupName.stringValue) public static let openGroupNameKey: SQL = SQL(stringLiteral: CodingKeys.openGroupName.stringValue)
public static let openGroupServerKey: SQL = SQL(stringLiteral: CodingKeys.openGroupServer.stringValue) public static let openGroupServerKey: SQL = SQL(stringLiteral: CodingKeys.openGroupServer.stringValue)
public static let openGroupRoomTokenKey: SQL = SQL(stringLiteral: CodingKeys.openGroupRoomToken.stringValue) public static let openGroupRoomTokenKey: SQL = SQL(stringLiteral: CodingKeys.openGroupRoomToken.stringValue)
public static let openGroupPublicKeyKey: SQL = SQL(stringLiteral: CodingKeys.openGroupPublicKey.stringValue)
public static let openGroupProfilePictureDataKey: SQL = SQL(stringLiteral: CodingKeys.openGroupProfilePictureData.stringValue) public static let openGroupProfilePictureDataKey: SQL = SQL(stringLiteral: CodingKeys.openGroupProfilePictureData.stringValue)
public static let openGroupUserCountKey: SQL = SQL(stringLiteral: CodingKeys.openGroupUserCount.stringValue) public static let openGroupUserCountKey: SQL = SQL(stringLiteral: CodingKeys.openGroupUserCount.stringValue)
public static let openGroupPermissionsKey: SQL = SQL(stringLiteral: CodingKeys.openGroupPermissions.stringValue) public static let openGroupPermissionsKey: SQL = SQL(stringLiteral: CodingKeys.openGroupPermissions.stringValue)
@ -117,6 +118,7 @@ public struct SessionThreadViewModel: FetchableRecordWithRowId, Decodable, Equat
public let openGroupName: String? public let openGroupName: String?
public let openGroupServer: String? public let openGroupServer: String?
public let openGroupRoomToken: String? public let openGroupRoomToken: String?
public let openGroupPublicKey: String?
public let openGroupProfilePictureData: Data? public let openGroupProfilePictureData: Data?
private let openGroupUserCount: Int? private let openGroupUserCount: Int?
private let openGroupPermissions: OpenGroup.Permissions? private let openGroupPermissions: OpenGroup.Permissions?
@ -274,6 +276,7 @@ public extension SessionThreadViewModel {
self.openGroupName = nil self.openGroupName = nil
self.openGroupServer = nil self.openGroupServer = nil
self.openGroupRoomToken = nil self.openGroupRoomToken = nil
self.openGroupPublicKey = nil
self.openGroupProfilePictureData = nil self.openGroupProfilePictureData = nil
self.openGroupUserCount = nil self.openGroupUserCount = nil
self.openGroupPermissions = nil self.openGroupPermissions = nil
@ -334,6 +337,7 @@ public extension SessionThreadViewModel {
openGroupName: self.openGroupName, openGroupName: self.openGroupName,
openGroupServer: self.openGroupServer, openGroupServer: self.openGroupServer,
openGroupRoomToken: self.openGroupRoomToken, openGroupRoomToken: self.openGroupRoomToken,
openGroupPublicKey: self.openGroupPublicKey,
openGroupProfilePictureData: self.openGroupProfilePictureData, openGroupProfilePictureData: self.openGroupProfilePictureData,
openGroupUserCount: self.openGroupUserCount, openGroupUserCount: self.openGroupUserCount,
openGroupPermissions: self.openGroupPermissions, openGroupPermissions: self.openGroupPermissions,
@ -387,6 +391,7 @@ public extension SessionThreadViewModel {
openGroupName: self.openGroupName, openGroupName: self.openGroupName,
openGroupServer: self.openGroupServer, openGroupServer: self.openGroupServer,
openGroupRoomToken: self.openGroupRoomToken, openGroupRoomToken: self.openGroupRoomToken,
openGroupPublicKey: self.openGroupPublicKey,
openGroupProfilePictureData: self.openGroupProfilePictureData, openGroupProfilePictureData: self.openGroupProfilePictureData,
openGroupUserCount: self.openGroupUserCount, openGroupUserCount: self.openGroupUserCount,
openGroupPermissions: self.openGroupPermissions, openGroupPermissions: self.openGroupPermissions,
@ -753,6 +758,7 @@ public extension SessionThreadViewModel {
\(openGroup[.name]) AS \(ViewModel.openGroupNameKey), \(openGroup[.name]) AS \(ViewModel.openGroupNameKey),
\(openGroup[.server]) AS \(ViewModel.openGroupServerKey), \(openGroup[.server]) AS \(ViewModel.openGroupServerKey),
\(openGroup[.roomToken]) AS \(ViewModel.openGroupRoomTokenKey), \(openGroup[.roomToken]) AS \(ViewModel.openGroupRoomTokenKey),
\(openGroup[.publicKey]) AS \(ViewModel.openGroupPublicKeyKey),
\(openGroup[.userCount]) AS \(ViewModel.openGroupUserCountKey), \(openGroup[.userCount]) AS \(ViewModel.openGroupUserCountKey),
\(openGroup[.permissions]) AS \(ViewModel.openGroupPermissionsKey), \(openGroup[.permissions]) AS \(ViewModel.openGroupPermissionsKey),
@ -847,6 +853,9 @@ public extension SessionThreadViewModel {
\(closedGroup[.name]) AS \(ViewModel.closedGroupNameKey), \(closedGroup[.name]) AS \(ViewModel.closedGroupNameKey),
(\(groupMember[.profileId]) IS NOT NULL) AS \(ViewModel.currentUserIsClosedGroupMemberKey), (\(groupMember[.profileId]) IS NOT NULL) AS \(ViewModel.currentUserIsClosedGroupMemberKey),
\(openGroup[.name]) AS \(ViewModel.openGroupNameKey), \(openGroup[.name]) AS \(ViewModel.openGroupNameKey),
\(openGroup[.server]) AS \(ViewModel.openGroupServerKey),
\(openGroup[.roomToken]) AS \(ViewModel.openGroupRoomTokenKey),
\(openGroup[.publicKey]) AS \(ViewModel.openGroupPublicKeyKey),
\(openGroup[.imageData]) AS \(ViewModel.openGroupProfilePictureDataKey), \(openGroup[.imageData]) AS \(ViewModel.openGroupProfilePictureDataKey),
\(SQL("\(userPublicKey)")) AS \(ViewModel.currentUserPublicKeyKey) \(SQL("\(userPublicKey)")) AS \(ViewModel.currentUserPublicKeyKey)

@ -79,6 +79,32 @@ class OpenGroupSpec: QuickSpec {
.to(equal("OpenGroup(server: \"server\", roomToken: \"room\", id: \"server.room\", publicKey: \"1234\", isActive: true, name: \"name\", roomDescription: null, imageId: null, userCount: 0, infoUpdates: 0, sequenceNumber: 0, inboxLatestMessageId: 0, outboxLatestMessageId: 0, pollFailureCount: 0, permissions: ---)")) .to(equal("OpenGroup(server: \"server\", roomToken: \"room\", id: \"server.room\", publicKey: \"1234\", isActive: true, name: \"name\", roomDescription: null, imageId: null, userCount: 0, infoUpdates: 0, sequenceNumber: 0, inboxLatestMessageId: 0, outboxLatestMessageId: 0, pollFailureCount: 0, permissions: ---)"))
} }
} }
context("when generating an id") {
it("generates correctly") {
expect(OpenGroup.idFor(roomToken: "room", server: "server")).to(equal("server.room"))
}
it("converts the server to lowercase") {
expect(OpenGroup.idFor(roomToken: "room", server: "SeRVeR")).to(equal("server.room"))
}
it("maintains the casing of the roomToken") {
expect(OpenGroup.idFor(roomToken: "RoOM", server: "server")).to(equal("server.RoOM"))
}
}
context("when generating a url") {
it("generates the url correctly") {
expect(OpenGroup.urlFor(server: "server", roomToken: "room", publicKey: "key"))
.to(equal("server/room?public_key=key"))
}
it("maintains the casing provided") {
expect(OpenGroup.urlFor(server: "SeRVer", roomToken: "RoOM", publicKey: "KEy"))
.to(equal("SeRVer/RoOM?public_key=KEy"))
}
}
} }
} }
} }

Loading…
Cancel
Save