import DesignSystem import Env import Models import SwiftUI @MainActor struct StatusRowDetailView: View { @Environment(\.openURL) private var openURL @Environment(StatusDataController.self) private var statusDataController var viewModel: StatusRowViewModel var body: some View { VStack(alignment: .leading, spacing: 12) { Divider() HStack { Group { Text(viewModel.status.createdAt.asDate, style: .date) + Text("status.summary.at-time") + Text(viewModel.status.createdAt.asDate, style: .time) + Text(" ยท") Image(systemName: viewModel.status.visibility.iconName) .accessibilityHidden(true) }.accessibilityElement(children: .combine) Spacer() if let name = viewModel.status.application?.name, let url = viewModel.status.application?.website { Button { openURL(url) } label: { Text(name) .underline() } .buttonStyle(.plain) .accessibilityLabel("accessibility.status.application.label") .accessibilityValue(name) .accessibilityAddTraits(.isLink) .accessibilityRemoveTraits(.isButton) } } .font(.scaledCaption) .foregroundStyle(.secondary) if let editedAt = viewModel.status.editedAt { Divider() HStack { Text("status.summary.edited-time") + Text(editedAt.asDate, style: .date) + Text("status.summary.at-time") + Text(editedAt.asDate, style: .time) Spacer() } .onTapGesture { viewModel.routerPath.presentedSheet = .statusEditHistory(status: viewModel.status.id) } .underline() .font(.scaledCaption) .foregroundStyle(.secondary) } if viewModel.actionsAccountsFetched, statusDataController.favoritesCount > 0 { Divider() Button { viewModel.routerPath.navigate(to: .favoritedBy(id: viewModel.status.id)) } label: { HStack { Text("status.summary.n-favorites \(statusDataController.favoritesCount)") .font(.scaledCallout) Spacer() makeAccountsScrollView(accounts: viewModel.favoriters) Image(systemName: "chevron.right") } .frame(height: 20) } .buttonStyle(.borderless) .transition(.move(edge: .leading)) } if viewModel.actionsAccountsFetched, statusDataController.reblogsCount > 0 { Divider() Button { viewModel.routerPath.navigate(to: .rebloggedBy(id: viewModel.status.id)) } label: { HStack { Text("status.summary.n-boosts \(statusDataController.reblogsCount)") .font(.scaledCallout) Spacer() makeAccountsScrollView(accounts: viewModel.rebloggers) Image(systemName: "chevron.right") } .frame(height: 20) } .buttonStyle(.borderless) .transition(.move(edge: .leading)) } } .task { await viewModel.fetchActionsAccounts() } } private func makeAccountsScrollView(accounts: [Account]) -> some View { ScrollView(.horizontal, showsIndicators: false) { LazyHStack(spacing: 0) { ForEach(accounts) { account in AvatarView(account.avatar, config: .list) .padding(.leading, -4) } .transition(.opacity) } .padding(.leading, .layoutPadding) } } }