diff --git a/Meshtastic/Helpers/MeshPackets.swift b/Meshtastic/Helpers/MeshPackets.swift index 3c9f51d6..784fb2f3 100644 --- a/Meshtastic/Helpers/MeshPackets.swift +++ b/Meshtastic/Helpers/MeshPackets.swift @@ -1301,18 +1301,30 @@ func textMessageAppPacket(packet: MeshPacket, connectedNode: Int64, context: NSM if fetchedUsers.first(where: { $0.num == packet.from }) != nil { newMessage.fromUser = fetchedUsers.first(where: { $0.num == packet.from }) } - let detector = try! NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue) + let types: NSTextCheckingResult.CheckingType = [.address, .link, .phoneNumber] + let detector = try! NSDataDetector(types: types.rawValue) let matches = detector.matches(in: messageText, options: [], range: NSRange(location: 0, length: messageText.utf16.count)) if matches.count > 0 { - var messageWithLink = "" + var messageWithLink = messageText for match in matches { guard let range = Range(match.range, in: messageText) else { continue } - let url = messageText[range] - messageWithLink = messageText.replacingOccurrences(of: url, with: "[\(String(match.url?.host ?? "Link"))](\(url))") + if match.resultType == .address { + let address = messageText[range] + let urlEncodedAddress = address.addingPercentEncoding(withAllowedCharacters: .alphanumerics) + messageWithLink = messageWithLink.replacingOccurrences(of: address, with: "[\(address)](http://maps.apple.com/?address=\(urlEncodedAddress ?? ""))") + } else if match.resultType == .phoneNumber { + let phone = messageText[range] + messageWithLink = messageWithLink.replacingOccurrences(of: phone, with: "[\(phone)](tel:\(phone))") + } else if match.resultType == .link { + let url = messageText[range] + messageWithLink = messageWithLink.replacingOccurrences(of: url, with: "[\(String(match.url?.host ?? "Link"))](\(url))") + } } - newMessage.messagePayload = messageWithLink + newMessage.messagePayload = messageText + newMessage.messagePayloadMarkdown = messageWithLink } else { newMessage.messagePayload = messageText + newMessage.messagePayloadMarkdown = messageText } newMessage.fromUser?.objectWillChange.send() newMessage.toUser?.objectWillChange.send() diff --git a/Meshtastic/Meshtastic.xcdatamodeld/MeshtasticDataModelV4.xcdatamodel/contents b/Meshtastic/Meshtastic.xcdatamodeld/MeshtasticDataModelV4.xcdatamodel/contents index 7bb559e9..11a72c34 100644 --- a/Meshtastic/Meshtastic.xcdatamodeld/MeshtasticDataModelV4.xcdatamodel/contents +++ b/Meshtastic/Meshtastic.xcdatamodeld/MeshtasticDataModelV4.xcdatamodel/contents @@ -96,6 +96,7 @@ + diff --git a/Meshtastic/Views/Messages/ChannelMessageList.swift b/Meshtastic/Views/Messages/ChannelMessageList.swift index 0773f431..dba468b2 100644 --- a/Meshtastic/Views/Messages/ChannelMessageList.swift +++ b/Meshtastic/Views/Messages/ChannelMessageList.swift @@ -60,7 +60,7 @@ struct ChannelMessageList: View { .offset(y: -5) } VStack(alignment: currentUser ? .trailing : .leading) { - let markdownText: LocalizedStringKey = LocalizedStringKey.init(message.messagePayload ?? "EMPTY MESSAGE") + let markdownText: LocalizedStringKey = LocalizedStringKey.init(message.messagePayloadMarkdown ?? (message.messagePayload ?? "EMPTY MESSAGE")) let skyBlue = Color(red: 0.4627, green: 0.8392, blue: 1.0) Text(markdownText) .tint(skyBlue) diff --git a/Meshtastic/Views/Messages/UserMessageList.swift b/Meshtastic/Views/Messages/UserMessageList.swift index f80f61b6..deca1d4a 100644 --- a/Meshtastic/Views/Messages/UserMessageList.swift +++ b/Meshtastic/Views/Messages/UserMessageList.swift @@ -61,8 +61,8 @@ struct UserMessageList: View { .offset(y: -5) } VStack(alignment: currentUser ? .trailing : .leading) { - let markdownText: LocalizedStringKey = LocalizedStringKey.init(message.messagePayload ?? "EMPTY MESSAGE") - let skyBlue = Color(red: 0.4627, green: 0.8392, blue: 1.0) + let markdownText: LocalizedStringKey = LocalizedStringKey.init(message.messagePayloadMarkdown ?? (message.messagePayload ?? "EMPTY MESSAGE")) + let skyBlue = Color(red: 0.4627, green: 0.8392, blue: 1.0) Text(markdownText) .tint(skyBlue) .padding(10)