diff --git a/Packages/Models/Sources/Models/Status.swift b/Packages/Models/Sources/Models/Status.swift index c69bee64..84834e6a 100644 --- a/Packages/Models/Sources/Models/Status.swift +++ b/Packages/Models/Sources/Models/Status.swift @@ -1,5 +1,12 @@ import Foundation +public struct Application: Codable, Identifiable { + public var id: String { + name + } + public let name: String +} + public protocol AnyStatus { var id: String { get } var content: HTMLString { get } @@ -16,6 +23,8 @@ public protocol AnyStatus { var pinned: Bool? { get } var emojis: [Emoji] { get } var url: URL? { get } + var application: Application? { get } + var inReplyToAccountId: String? { get } } public struct Status: AnyStatus, Codable, Identifiable { @@ -35,6 +44,8 @@ public struct Status: AnyStatus, Codable, Identifiable { public let pinned: Bool? public let emojis: [Emoji] public let url: URL? + public let application: Application? + public let inReplyToAccountId: String? public static func placeholder() -> Status { .init(id: UUID().uuidString, @@ -52,7 +63,9 @@ public struct Status: AnyStatus, Codable, Identifiable { reblogged: false, pinned: false, emojis: [], - url: nil) + url: nil, + application: nil, + inReplyToAccountId: nil) } public static func placeholders() -> [Status] { @@ -76,4 +89,6 @@ public struct ReblogStatus: AnyStatus, Codable, Identifiable { public let pinned: Bool? public let emojis: [Emoji] public let url: URL? + public var application: Application? + public let inReplyToAccountId: String? } diff --git a/Packages/Status/Sources/Status/Row/StatusActionsView.swift b/Packages/Status/Sources/Status/Row/StatusActionsView.swift index 1ac3ccb1..c64c9f47 100644 --- a/Packages/Status/Sources/Status/Row/StatusActionsView.swift +++ b/Packages/Status/Sources/Status/Row/StatusActionsView.swift @@ -14,7 +14,7 @@ struct StatusActionsView: View { func iconName(viewModel: StatusRowViewModel) -> String { switch self { case .respond: - return "bubble.right" + return "arrowshape.turn.up.left" case .boost: return viewModel.isReblogged ? "arrow.left.arrow.right.circle.fill" : "arrow.left.arrow.right.circle" case .favourite: @@ -59,6 +59,7 @@ struct StatusActionsView: View { } } } + .buttonStyle(.borderless) Spacer() } } diff --git a/Packages/Status/Sources/Status/Row/StatusRowView.swift b/Packages/Status/Sources/Status/Row/StatusRowView.swift index 47ac7a0e..bb3afb0d 100644 --- a/Packages/Status/Sources/Status/Row/StatusRowView.swift +++ b/Packages/Status/Sources/Status/Row/StatusRowView.swift @@ -17,6 +17,7 @@ public struct StatusRowView: View { public var body: some View { VStack(alignment: .leading) { reblogView + replyView statusView if !viewModel.isEmbed { StatusActionsView(viewModel: viewModel) @@ -32,7 +33,7 @@ public struct StatusRowView: View { private var reblogView: some View { if viewModel.status.reblog != nil { HStack(spacing: 2) { - Image(systemName:"arrow.left.arrow.right.circle") + Image(systemName:"arrow.left.arrow.right.circle.fill") viewModel.status.account.displayNameWithEmojis Text("boosted") } @@ -45,6 +46,24 @@ public struct StatusRowView: View { } } + @ViewBuilder + var replyView: some View { + if let accountId = viewModel.status.inReplyToAccountId, + let mention = viewModel.status.mentions.first(where: { $0.id == accountId}) { + HStack(spacing: 2) { + Image(systemName:"arrowshape.turn.up.left.fill") + Text("Replied to") + Text(mention.username) + } + .font(.footnote) + .foregroundColor(.gray) + .fontWeight(.semibold) + .onTapGesture { + routeurPath.navigate(to: .accountDetail(id: mention.id)) + } + } + } + private var statusView: some View { VStack(alignment: .leading, spacing: 8) { if let status: AnyStatus = viewModel.status.reblog ?? viewModel.status {