2023-02-17 12:30:56 +00:00
|
|
|
import DesignSystem
|
|
|
|
import Models
|
2023-02-18 06:26:48 +00:00
|
|
|
import SwiftUI
|
2023-02-17 12:30:56 +00:00
|
|
|
|
|
|
|
struct StatusRowHeaderView: View {
|
2023-02-19 14:29:07 +00:00
|
|
|
@Environment(\.isInCaptureMode) private var isInCaptureMode: Bool
|
2023-02-17 12:30:56 +00:00
|
|
|
@EnvironmentObject private var theme: Theme
|
2023-02-18 06:26:48 +00:00
|
|
|
|
2023-02-17 12:30:56 +00:00
|
|
|
let status: AnyStatus
|
|
|
|
let viewModel: StatusRowViewModel
|
2023-02-18 06:26:48 +00:00
|
|
|
|
2023-02-17 12:30:56 +00:00
|
|
|
var body: some View {
|
|
|
|
HStack(alignment: .center) {
|
|
|
|
Button {
|
|
|
|
viewModel.navigateToAccountDetail(account: status.account)
|
|
|
|
} label: {
|
|
|
|
accountView(status: status)
|
|
|
|
}
|
|
|
|
.buttonStyle(.plain)
|
|
|
|
Spacer()
|
2023-02-19 14:29:07 +00:00
|
|
|
if !isInCaptureMode {
|
|
|
|
threadIcon
|
|
|
|
contextMenuButton
|
|
|
|
}
|
2023-02-17 12:30:56 +00:00
|
|
|
}
|
|
|
|
.accessibilityElement()
|
|
|
|
.accessibilityLabel(Text("\(status.account.displayName)"))
|
|
|
|
}
|
2023-02-18 06:26:48 +00:00
|
|
|
|
2023-02-17 12:30:56 +00:00
|
|
|
@ViewBuilder
|
|
|
|
private func accountView(status: AnyStatus) -> some View {
|
|
|
|
HStack(alignment: .center) {
|
|
|
|
if theme.avatarPosition == .top {
|
|
|
|
AvatarView(url: status.account.avatar, size: .status)
|
|
|
|
}
|
|
|
|
VStack(alignment: .leading, spacing: 0) {
|
|
|
|
EmojiTextApp(.init(stringValue: status.account.safeDisplayName), emojis: status.account.emojis)
|
|
|
|
.font(.scaledSubheadline)
|
|
|
|
.fontWeight(.semibold)
|
|
|
|
Group {
|
|
|
|
Text("@\(status.account.acct)") +
|
|
|
|
Text(" ⸱ ") +
|
|
|
|
Text(status.createdAt.relativeFormatted) +
|
|
|
|
Text(" ⸱ ") +
|
|
|
|
Text(Image(systemName: viewModel.status.visibility.iconName))
|
|
|
|
}
|
|
|
|
.font(.scaledFootnote)
|
|
|
|
.foregroundColor(.gray)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2023-02-18 06:26:48 +00:00
|
|
|
|
2023-02-17 12:30:56 +00:00
|
|
|
@ViewBuilder
|
|
|
|
private var threadIcon: some View {
|
|
|
|
if viewModel.status.reblog?.inReplyToAccountId != nil || viewModel.status.inReplyToAccountId != nil {
|
|
|
|
Image(systemName: "bubble.left.and.bubble.right")
|
|
|
|
.resizable()
|
|
|
|
.aspectRatio(contentMode: .fit)
|
|
|
|
.frame(width: 15)
|
|
|
|
.foregroundColor(.gray)
|
|
|
|
}
|
|
|
|
}
|
2023-02-18 06:26:48 +00:00
|
|
|
|
2023-02-17 12:30:56 +00:00
|
|
|
private var contextMenuButton: some View {
|
|
|
|
Menu {
|
|
|
|
StatusRowContextMenu(viewModel: viewModel)
|
|
|
|
} label: {
|
|
|
|
Image(systemName: "ellipsis")
|
|
|
|
.frame(width: 20, height: 30)
|
|
|
|
}
|
|
|
|
.menuStyle(.borderlessButton)
|
|
|
|
.foregroundColor(.gray)
|
|
|
|
.contentShape(Rectangle())
|
|
|
|
.accessibilityHidden(true)
|
|
|
|
}
|
|
|
|
}
|