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

116 lines
3.4 KiB
Swift
Raw Normal View History

2023-01-17 10:36:01 +00:00
import Env
2023-01-04 17:37:58 +00:00
import Foundation
import SwiftUI
struct StatusRowContextMenu: View {
@EnvironmentObject private var account: CurrentAccount
@EnvironmentObject private var routeurPath: RouterPath
2023-01-17 10:36:01 +00:00
@Environment(\.openURL) var openURL
2023-01-17 10:36:01 +00:00
2023-01-04 17:37:58 +00:00
@ObservedObject var viewModel: StatusRowViewModel
2023-01-17 10:36:01 +00:00
2023-01-04 17:37:58 +00:00
var body: some View {
if !viewModel.isRemote {
Button { Task {
if viewModel.isFavourited {
await viewModel.unFavourite()
} else {
await viewModel.favourite()
}
} } label: {
Label(viewModel.isFavourited ? "Unfavorite" : "Favorite", systemImage: "star")
2023-01-04 17:37:58 +00:00
}
Button { Task {
if viewModel.isReblogged {
await viewModel.unReblog()
} else {
await viewModel.reblog()
}
} } label: {
Label(viewModel.isReblogged ? "Unboost" : "Boost", systemImage: "arrow.left.arrow.right.circle")
2023-01-04 17:37:58 +00:00
}
2023-01-09 18:26:56 +00:00
Button { Task {
if viewModel.isBookmarked {
await viewModel.unbookmark()
} else {
await viewModel.bookmark()
}
} } label: {
Label(viewModel.isReblogged ? "Unbookmark" : "Bookmark",
systemImage: "bookmark")
}
Button {
routeurPath.presentedSheet = .replyToStatusEditor(status: viewModel.status)
} label: {
Label("Reply", systemImage: "arrowshape.turn.up.left")
}
2023-01-04 17:37:58 +00:00
}
2023-01-17 10:36:01 +00:00
if viewModel.status.visibility == .pub, !viewModel.isRemote {
2023-01-04 17:37:58 +00:00
Button {
routeurPath.presentedSheet = .quoteStatusEditor(status: viewModel.status)
} label: {
Label("Quote this post", systemImage: "quote.bubble")
}
}
2023-01-17 10:36:01 +00:00
2023-01-07 17:01:06 +00:00
Divider()
2023-01-17 10:36:01 +00:00
if let url = viewModel.status.reblog?.url ?? viewModel.status.url {
2023-01-17 10:36:01 +00:00
ShareLink(item: url) {
Label("Share this post", systemImage: "square.and.arrow.up")
}
}
2023-01-17 10:36:01 +00:00
2023-01-04 17:37:58 +00:00
if let url = viewModel.status.reblog?.url ?? viewModel.status.url {
Button { openURL(url) } label: {
2023-01-04 17:37:58 +00:00
Label("View in Browser", systemImage: "safari")
}
}
2023-01-17 10:36:01 +00:00
Button {
UIPasteboard.general.string = viewModel.status.content.asRawText
} label: {
Label("Copy Text", systemImage: "doc.on.doc")
}
2023-01-04 17:37:58 +00:00
if account.account?.id == viewModel.status.account.id {
Section("Your post") {
Button {
Task {
if viewModel.isPinned {
await viewModel.unPin()
} else {
await viewModel.pin()
}
}
} label: {
2023-01-17 10:36:01 +00:00
Label(viewModel.isPinned ? "Unpin" : "Pin", systemImage: viewModel.isPinned ? "pin.fill" : "pin")
2023-01-04 17:37:58 +00:00
}
Button {
routeurPath.presentedSheet = .editStatusEditor(status: viewModel.status)
} label: {
Label("Edit", systemImage: "pencil")
}
Button(role: .destructive) { Task { await viewModel.delete() } } label: {
Label("Delete", systemImage: "trash")
}
}
} else if !viewModel.isRemote {
2023-01-04 17:37:58 +00:00
Section(viewModel.status.account.acct) {
Button {
routeurPath.presentedSheet = .mentionStatusEditor(account: viewModel.status.account, visibility: .pub)
} label: {
Label("Mention", systemImage: "at")
}
Button {
routeurPath.presentedSheet = .mentionStatusEditor(account: viewModel.status.account, visibility: .direct)
} label: {
Label("Message", systemImage: "tray.full")
}
}
}
}
}