From b47df4605d331b2748a2998de8c45d098954f90a Mon Sep 17 00:00:00 2001 From: Thomas Ricouard Date: Mon, 19 Dec 2022 15:51:25 +0100 Subject: [PATCH] Handle mentions tap in status --- Packages/Models/Sources/Models/Mention.swift | 8 ++++++++ Packages/Models/Sources/Models/Status.swift | 6 +++++- Packages/Routeur/Sources/Routeur/Routeur.swift | 8 ++++++++ Packages/Status/Sources/Status/Row/StatusRowView.swift | 7 ++++++- 4 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 Packages/Models/Sources/Models/Mention.swift diff --git a/Packages/Models/Sources/Models/Mention.swift b/Packages/Models/Sources/Models/Mention.swift new file mode 100644 index 00000000..b2d2d1b7 --- /dev/null +++ b/Packages/Models/Sources/Models/Mention.swift @@ -0,0 +1,8 @@ +import Foundation + +public struct Mention: Codable { + public let id: String + public let username: String + public let url: URL + public let acct: String +} diff --git a/Packages/Models/Sources/Models/Status.swift b/Packages/Models/Sources/Models/Status.swift index 351741c3..7eab82d0 100644 --- a/Packages/Models/Sources/Models/Status.swift +++ b/Packages/Models/Sources/Models/Status.swift @@ -6,6 +6,7 @@ public protocol AnyStatus { var account: Account { get } var createdAt: String { get } var mediaAttachments: [MediaAttachement] { get } + var mentions: [Mention] { get } } public struct Status: AnyStatus, Codable, Identifiable { @@ -15,6 +16,7 @@ public struct Status: AnyStatus, Codable, Identifiable { public let createdAt: ServerDate public let reblog: ReblogStatus? public let mediaAttachments: [MediaAttachement] + public let mentions: [Mention] public static func placeholder() -> Status { .init(id: UUID().uuidString, @@ -22,7 +24,8 @@ public struct Status: AnyStatus, Codable, Identifiable { account: .placeholder(), createdAt: "2022-12-16T10:20:54.000Z", reblog: nil, - mediaAttachments: []) + mediaAttachments: [], + mentions: []) } public static func placeholders() -> [Status] { @@ -36,4 +39,5 @@ public struct ReblogStatus: AnyStatus, Codable, Identifiable { public let account: Account public let createdAt: String public let mediaAttachments: [MediaAttachement] + public let mentions: [Mention] } diff --git a/Packages/Routeur/Sources/Routeur/Routeur.swift b/Packages/Routeur/Sources/Routeur/Routeur.swift index 57a1c46a..95d3412f 100644 --- a/Packages/Routeur/Sources/Routeur/Routeur.swift +++ b/Packages/Routeur/Sources/Routeur/Routeur.swift @@ -16,4 +16,12 @@ public class RouterPath: ObservableObject { public func navigate(to: RouteurDestinations) { path.append(to) } + + public func handleStatus(status: AnyStatus, url: URL) -> OpenURLAction.Result { + if let mention = status.mentions.first(where: { $0.url == url }) { + navigate(to: .accountDetail(id: mention.id)) + return .handled + } + return .systemAction + } } diff --git a/Packages/Status/Sources/Status/Row/StatusRowView.swift b/Packages/Status/Sources/Status/Row/StatusRowView.swift index fb34a78c..d2e66159 100644 --- a/Packages/Status/Sources/Status/Row/StatusRowView.swift +++ b/Packages/Status/Sources/Status/Row/StatusRowView.swift @@ -2,9 +2,11 @@ import SwiftUI import Models import Routeur import DesignSystem +import Network public struct StatusRowView: View { @Environment(\.redactionReasons) private var reasons + @EnvironmentObject private var client: Client @EnvironmentObject private var routeurPath: RouterPath private let status: Status @@ -48,11 +50,14 @@ public struct StatusRowView: View { }.buttonStyle(.plain) } - Text(try! AttributedString(markdown: status.content.asMarkdown)) + Text(status.content.asSafeAttributedString) .font(.body) .onTapGesture { routeurPath.navigate(to: .statusDetail(id: status.id)) } + .environment(\.openURL, OpenURLAction { url in + routeurPath.handleStatus(status: status, url: url) + }) if !status.mediaAttachments.isEmpty { StatusMediaPreviewView(attachements: status.mediaAttachments)