IceCubesApp/Packages/Status/Sources/Status/Row/StatusActionsView.swift

86 lines
2.1 KiB
Swift
Raw Normal View History

2022-12-16 12:16:48 +00:00
import SwiftUI
import Models
2022-12-22 09:53:36 +00:00
import Env
2022-12-20 19:33:45 +00:00
import Network
2022-12-16 12:16:48 +00:00
struct StatusActionsView: View {
@EnvironmentObject private var routeurPath: RouterPath
2022-12-20 19:33:45 +00:00
@ObservedObject var viewModel: StatusRowViewModel
@MainActor
2022-12-19 15:17:25 +00:00
enum Actions: CaseIterable {
case respond, boost, favourite, share
2022-12-20 19:33:45 +00:00
func iconName(viewModel: StatusRowViewModel) -> String {
2022-12-19 15:17:25 +00:00
switch self {
case .respond:
return "bubble.right"
case .boost:
2022-12-21 11:39:29 +00:00
return viewModel.isReblogged ? "arrow.left.arrow.right.circle.fill" : "arrow.left.arrow.right.circle"
2022-12-19 15:17:25 +00:00
case .favourite:
2022-12-20 19:33:45 +00:00
return viewModel.isFavourited ? "star.fill" : "star"
2022-12-19 15:17:25 +00:00
case .share:
return "square.and.arrow.up"
2022-12-16 12:16:48 +00:00
}
2022-12-19 15:17:25 +00:00
}
2022-12-20 19:33:45 +00:00
func count(viewModel: StatusRowViewModel) -> Int? {
2022-12-19 15:17:25 +00:00
switch self {
case .respond:
2022-12-21 11:39:29 +00:00
return viewModel.repliesCount
2022-12-19 15:17:25 +00:00
case .favourite:
2022-12-20 19:33:45 +00:00
return viewModel.favouritesCount
2022-12-19 15:17:25 +00:00
case .boost:
2022-12-21 11:39:29 +00:00
return viewModel.reblogsCount
2022-12-19 15:17:25 +00:00
case .share:
return nil
2022-12-16 12:16:48 +00:00
}
2022-12-19 15:17:25 +00:00
}
}
var body: some View {
HStack {
ForEach(Actions.allCases, id: \.self) { action in
Button {
2022-12-20 19:33:45 +00:00
handleAction(action: action)
2022-12-19 15:17:25 +00:00
} label: {
HStack(spacing: 2) {
2022-12-20 19:33:45 +00:00
Image(systemName: action.iconName(viewModel: viewModel))
if let count = action.count(viewModel: viewModel) {
2022-12-19 15:17:25 +00:00
Text("\(count)")
.font(.footnote)
}
}
}
if action != .share {
Spacer()
}
2022-12-16 12:16:48 +00:00
}
2022-12-20 19:33:45 +00:00
}
.tint(.gray)
}
private func handleAction(action: Actions) {
Task {
switch action {
case .respond:
routeurPath.navigate(to: .statusDetail(id: viewModel.status.reblog?.id ?? viewModel.status.id))
2022-12-20 19:33:45 +00:00
case .favourite:
if viewModel.isFavourited {
await viewModel.unFavourite()
} else {
await viewModel.favourite()
}
2022-12-21 11:39:29 +00:00
case .boost:
if viewModel.isReblogged {
await viewModel.unReblog()
} else {
await viewModel.reblog()
}
2022-12-20 19:33:45 +00:00
default:
break
}
}
2022-12-16 12:16:48 +00:00
}
}