Better view separation for StatusRowView

This commit is contained in:
Thomas Ricouard 2023-02-10 12:12:22 +01:00
parent b963a74dc4
commit 2083f72b2b
2 changed files with 95 additions and 83 deletions

View file

@ -5,7 +5,6 @@ import Network
import SwiftUI
struct StatusActionsView: View {
@Environment(\.openURL) private var openURL
@EnvironmentObject private var theme: Theme
@EnvironmentObject private var routerPath: RouterPath
@ObservedObject var viewModel: StatusRowViewModel
@ -91,91 +90,10 @@ struct StatusActionsView: View {
}
}
if viewModel.isFocused {
summaryView
.task {
await viewModel.fetchActionsAccounts()
StatusRowDetailView(viewModel: viewModel)
}
}
}
}
@ViewBuilder
private var summaryView: some View {
Divider()
HStack {
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)
Spacer()
Text(viewModel.status.application?.name ?? "")
.underline()
.onTapGesture {
if let url = viewModel.status.application?.website {
openURL(url)
}
}
}
.font(.scaledCaption)
.foregroundColor(.gray)
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 {
routerPath.presentedSheet = .statusEditHistory(status: viewModel.status.id)
}
.underline()
.font(.scaledCaption)
.foregroundColor(.gray)
}
if viewModel.favoritesCount > 0 {
Divider()
NavigationLink(value: RouterDestinations.favoritedBy(id: viewModel.status.id)) {
HStack {
Text("status.summary.n-favorites \(viewModel.favoritesCount)")
.font(.scaledCallout)
Spacer()
makeAccountsScrollView(accounts: viewModel.favoriters)
Image(systemName: "chevron.right")
}
.frame(height: 20)
}
}
if viewModel.reblogsCount > 0 {
Divider()
NavigationLink(value: RouterDestinations.rebloggedBy(id: viewModel.status.id)) {
HStack {
Text("status.summary.n-boosts \(viewModel.reblogsCount)")
.font(.scaledCallout)
Spacer()
makeAccountsScrollView(accounts: viewModel.rebloggers)
Image(systemName: "chevron.right")
}
.frame(height: 20)
}
}
}
private func makeAccountsScrollView(accounts: [Account]) -> some View {
ScrollView(.horizontal, showsIndicators: false) {
LazyHStack(spacing: 0) {
ForEach(accounts) { account in
AvatarView(url: account.avatar, size: .list)
.padding(.leading, -4)
}
}
.padding(.leading, .layoutPadding)
}
}
private func handleAction(action: Actions) {
Task {

View file

@ -0,0 +1,94 @@
import SwiftUI
import Env
import DesignSystem
import Models
struct StatusRowDetailView: View {
@Environment(\.openURL) private var openURL
@EnvironmentObject private var routerPath: RouterPath
@ObservedObject var viewModel: StatusRowViewModel
var body: some View {
Group {
Divider()
HStack {
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)
Spacer()
Text(viewModel.status.application?.name ?? "")
.underline()
.onTapGesture {
if let url = viewModel.status.application?.website {
openURL(url)
}
}
}
.font(.scaledCaption)
.foregroundColor(.gray)
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 {
routerPath.presentedSheet = .statusEditHistory(status: viewModel.status.id)
}
.underline()
.font(.scaledCaption)
.foregroundColor(.gray)
}
if viewModel.favoritesCount > 0 {
Divider()
NavigationLink(value: RouterDestinations.favoritedBy(id: viewModel.status.id)) {
HStack {
Text("status.summary.n-favorites \(viewModel.favoritesCount)")
.font(.scaledCallout)
Spacer()
makeAccountsScrollView(accounts: viewModel.favoriters)
Image(systemName: "chevron.right")
}
.frame(height: 20)
}
}
if viewModel.reblogsCount > 0 {
Divider()
NavigationLink(value: RouterDestinations.rebloggedBy(id: viewModel.status.id)) {
HStack {
Text("status.summary.n-boosts \(viewModel.reblogsCount)")
.font(.scaledCallout)
Spacer()
makeAccountsScrollView(accounts: viewModel.rebloggers)
Image(systemName: "chevron.right")
}
.frame(height: 20)
}
}
}
.task {
await viewModel.fetchActionsAccounts()
}
}
private func makeAccountsScrollView(accounts: [Account]) -> some View {
ScrollView(.horizontal, showsIndicators: false) {
LazyHStack(spacing: 0) {
ForEach(accounts) { account in
AvatarView(url: account.avatar, size: .list)
.padding(.leading, -4)
}
}
.padding(.leading, .layoutPadding)
}
}
}